diff options
author | Kai Tietz <kai.tietz@onevision.com> | 2008-02-11 09:02:06 +0000 |
---|---|---|
committer | Kai Tietz <ktietz@gcc.gnu.org> | 2008-02-11 10:02:06 +0100 |
commit | 35b35fd081081e908c420cbcfbde4b9e4ddb5545 (patch) | |
tree | ba70f5ee3d314971570606058e21bb599acb2f4c | |
parent | f8c5cff401b6a2a49d3b21b6df2496297d495b55 (diff) | |
download | gcc-35b35fd081081e908c420cbcfbde4b9e4ddb5545.zip gcc-35b35fd081081e908c420cbcfbde4b9e4ddb5545.tar.gz gcc-35b35fd081081e908c420cbcfbde4b9e4ddb5545.tar.bz2 |
[patch i386]: For target x86_64-pc-mingw32 _alloca and
_stkchk may corrupts stack alignment.
From-SVN: r132236
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/cygwin.asm | 35 |
2 files changed, 38 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 578118a..d5f7b4f 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 371feae..90d9f31 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 ?*/ |