------- Comment #7 from ktietz at gcc dot gnu dot org 2009-03-15 20:13 -------
The following patch solves this problem and prevents the name collision for 32
and 64 bits win32 systems.
ChangeLog
* config/i386/i386.md (allocate_stack_worker_32): Use
___gnu_chkstk.
(allocate_stack_worker_64): Likewise.
* config/i386/cygwin.asm (__alloca): Renamed to __gnu_alloca.
(___chkstk): Renamed to ___gnu_chkstk.
Index: gcc/gcc/config/i386/cygwin.asm
===================================================================
--- gcc.orig/gcc/config/i386/cygwin.asm
+++ gcc/gcc/config/i386/cygwin.asm
@@ -40,11 +40,11 @@
increments is necessary to ensure that the guard pages used
by the OS virtual memory manger are allocated in correct sequence. */
- .global ___chkstk
- .global __alloca
#ifndef _WIN64
-___chkstk:
-__alloca:
+ .global ___gnu_chkstk
+ .global ___gnu_alloca
+___gnu_chkstk:
+__gnu_alloca:
pushl %ecx /* save temp */
leal 8(%esp), %ecx /* point past return addr */
cmpl $0x1000, %eax /* > 4k ?*/
@@ -72,9 +72,11 @@ Ldone:
pushl %eax
ret
#else
+ .global ___gnu_chkstk
+ .global __gnu_alloca
/* __alloca is a normal function call, which uses %rcx as the argument. And
stack space
for the argument is saved. */
-__alloca:
+__gnu_alloca:
movq %rcx, %rax
addq $0x7, %rax
andq $0xfffffffffffffff8, %rax
@@ -107,7 +109,7 @@ Ldone_alloca:
/* ___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:
+___gnu_chkstk:
addq $0x7, %rax /* Make sure stack is on alignment of 8. */
andq $0xfffffffffffffff8, %rax
popq %r11 /* pop return address */
Index: gcc/gcc/config/i386/i386.md
===================================================================
--- gcc.orig/gcc/config/i386/i386.md
+++ gcc/gcc/config/i386/i386.md
@@ -20297,7 +20297,7 @@
(set (reg:SI SP_REG) (minus:SI (reg:SI SP_REG) (match_dup 1)))
(clobber (reg:CC FLAGS_REG))]
"!TARGET_64BIT && TARGET_STACK_PROBE"
- "call\t___chkstk"
+ "call\t___gnu_chkstk"
[(set_attr "type" "multi")
(set_attr "length" "5")])
@@ -20310,7 +20310,7 @@
(clobber (reg:DI R11_REG))
(clobber (reg:CC FLAGS_REG))]
"TARGET_64BIT && TARGET_STACK_PROBE"
- "call\t___chkstk"
+ "call\t___gnu_chkstk"
[(set_attr "type" "multi")
(set_attr "length" "5")])
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39356