aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Tietz <kai.tietz@onevision.com>2008-02-11 09:02:06 +0000
committerKai Tietz <kai.tietz@onevision.com>2008-02-11 09:02:06 +0000
commit6ca8527df5465de23c01b91d271607aec4dcb409 (patch)
treeba70f5ee3d314971570606058e21bb599acb2f4c
parent3837e52dcbac75770e9260e9272b28e342721f75 (diff)
[patch i386]: For target x86_64-pc-mingw32 _alloca and
_stkchk may corrupts stack alignment. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@132236 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/cygwin.asm35
2 files changed, 38 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 578118ab946..d5f7b4fdd60 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2008-02-11 Kai Tietz <kai.tietz@onevision.com>
+
+ * config/i386/cygwin.asm: (__alloca): Correct calling
+ convention and alignment.
+ (__chkstk): Force 8 byte stack alignment.
+
2008-02-11 Uros Bizjak <ubizjak@gmail.com>
Richard Guenther <rguenther@suse.de>
diff --git a/gcc/config/i386/cygwin.asm b/gcc/config/i386/cygwin.asm
index 371feae8864..90d9f31ca32 100644
--- a/gcc/config/i386/cygwin.asm
+++ b/gcc/config/i386/cygwin.asm
@@ -72,15 +72,44 @@ Ldone:
pushl %eax
ret
#else
-/* __alloca is a normal function call, which uses %rcx as the argument. */
+/* __alloca is a normal function call, which uses %rcx as the argument. And stack space
+ for the argument is saved. */
__alloca:
- movq %rcx, %rax
- /* FALLTHRU */
+ movq %rcx, %rax
+ addq $0x7, %rax
+ andq $0xfffffffffffffff8, %rax
+ popq %rcx /* pop return address */
+ popq %r10 /* Pop the reserved stack space. */
+ movq %rsp, %r10 /* get sp */
+ cmpq $0x1000, %rax /* > 4k ?*/
+ jb Ldone_alloca
+
+Lprobe_alloca:
+ subq $0x1000, %r10 /* yes, move pointer down 4k*/
+ orq $0x0, (%r10) /* probe there */
+ subq $0x1000, %rax /* decrement count */
+ cmpq $0x1000, %rax
+ ja Lprobe_alloca /* and do it again */
+
+Ldone_alloca:
+ subq %rax, %r10
+ orq $0x0, (%r10) /* less than 4k, just peek here */
+ movq %r10, %rax
+ subq $0x8, %r10 /* Reserve argument stack space. */
+ movq %r10, %rsp /* decrement stack */
+
+ /* Push the return value back. Doing this instead of just
+ jumping to %rcx preserves the cached call-return stack
+ used by most modern processors. */
+ pushq %rcx
+ ret
/* ___chkstk is a *special* function call, which uses %rax as the argument.
We avoid clobbering the 4 integer argument registers, %rcx, %rdx,
%r8 and %r9, which leaves us with %rax, %r10, and %r11 to use. */
___chkstk:
+ addq $0x7, %rax /* Make sure stack is on alignment of 8. */
+ andq $0xfffffffffffffff8, %rax
popq %r11 /* pop return address */
movq %rsp, %r10 /* get sp */
cmpq $0x1000, %rax /* > 4k ?*/