OSDN Git Service

[patch i386]: For target x86_64-pc-mingw32 _alloca and
authorktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Feb 2008 09:02:06 +0000 (09:02 +0000)
committerktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Feb 2008 09:02:06 +0000 (09:02 +0000)
_stkchk may corrupts  stack alignment.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@132236 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/cygwin.asm

index 578118a..d5f7b4f 100644 (file)
@@ -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>
 
index 371feae..90d9f31 100644 (file)
@@ -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 ?*/