Index: lib/builtins/i386/chkstk.S =================================================================== --- lib/builtins/i386/chkstk.S +++ lib/builtins/i386/chkstk.S @@ -3,7 +3,8 @@ #include "../assembly.h" -// _chkstk routine +// _chkstk (_alloca) routine - probe stack between %esp and (%esp-%eax) in 4k increments, +// then decrement %esp by %eax. Preserves all registers except %esp and flags. // This routine is windows specific // http://msdn.microsoft.com/en-us/library/ms648426.aspx @@ -11,7 +12,8 @@ .text .balign 4 -DEFINE_COMPILERRT_FUNCTION(__chkstk_ms) +DEFINE_COMPILERRT_FUNCTION(_alloca) // _chkstk and _alloca are the same function +DEFINE_COMPILERRT_FUNCTION(_chkstk) push %ecx push %eax cmp $0x1000,%eax @@ -19,16 +21,18 @@ jb 1f 2: sub $0x1000,%ecx - orl $0,(%ecx) + test %ecx,(%ecx) sub $0x1000,%eax cmp $0x1000,%eax ja 2b 1: sub %eax,%ecx - orl $0,(%ecx) pop %eax - pop %ecx + mov %ecx,%esp // install the new top of stack pointer into esp + mov -8(%esp,%eax),%ecx // restore ecx (esp+eax point 4 bytes above the return address) + push -4(%esp,%eax) // push return address onto the stack ret -END_COMPILERRT_FUNCTION(__chkstk_ms) +END_COMPILERRT_FUNCTION(_chkstk) +END_COMPILERRT_FUNCTION(_alloca) #endif // __i386__ Index: lib/builtins/x86_64/chkstk.S =================================================================== --- lib/builtins/x86_64/chkstk.S +++ lib/builtins/x86_64/chkstk.S @@ -24,13 +24,13 @@ jb 1f 2: sub $0x1000,%rcx - orl $0,(%rcx) + test %rcx,(%rcx) sub $0x1000,%rax cmp $0x1000,%rax ja 2b 1: sub %rax,%rcx - orl $0,(%rcx) + test %rcx,(%rcx) pop %rax pop %rcx ret