[PATCH] D14044: Support for 32-bit mingw-w64 in compiler-rt
Vadim Chugunov via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 25 23:30:10 PDT 2015
vadimcn updated this revision to Diff 38373.
vadimcn added a comment.
Sorry, one more revision. Apparently chkstk needs triple underscore... <sigh>
Repository:
rL LLVM
http://reviews.llvm.org/D14044
Files:
lib/builtins/CMakeLists.txt
lib/builtins/i386/chkstk.S
lib/builtins/i386/chkstk2.S
lib/builtins/x86_64/chkstk.S
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
Index: lib/builtins/i386/chkstk2.S
===================================================================
--- /dev/null
+++ lib/builtins/i386/chkstk2.S
@@ -0,0 +1,40 @@
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+
+#include "../assembly.h"
+
+#ifdef __i386__
+
+// _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
+
+.text
+.balign 4
+DEFINE_COMPILERRT_FUNCTION(_alloca) // _chkstk and _alloca are the same function
+DEFINE_COMPILERRT_FUNCTION(__chkstk)
+ push %ecx
+ cmp $0x1000,%eax
+ lea 8(%esp),%ecx // esp before calling this routine -> ecx
+ jb 1f
+2:
+ sub $0x1000,%ecx
+ test %ecx,(%ecx)
+ sub $0x1000,%eax
+ cmp $0x1000,%eax
+ ja 2b
+1:
+ sub %eax,%ecx
+ test %ecx,(%ecx)
+
+ lea 4(%esp),%eax // load pointer to the return address into eax
+ mov %ecx,%esp // install the new top of stack pointer into esp
+ mov -4(%eax),%ecx // restore ecx
+ push (%eax) // push return address onto the stack
+ sub %esp,%eax // restore the original value in eax
+ ret
+END_COMPILERRT_FUNCTION(__chkstk)
+END_COMPILERRT_FUNCTION(_alloca)
+
+#endif // __i386__
Index: lib/builtins/i386/chkstk.S
===================================================================
--- lib/builtins/i386/chkstk.S
+++ lib/builtins/i386/chkstk.S
@@ -19,13 +19,13 @@
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)
+ test %ecx,(%ecx)
pop %eax
pop %ecx
ret
Index: lib/builtins/CMakeLists.txt
===================================================================
--- lib/builtins/CMakeLists.txt
+++ lib/builtins/CMakeLists.txt
@@ -200,6 +200,7 @@
set(i386_SOURCES
${i386_SOURCES}
i386/chkstk.S)
+ i386/chkstk2.S)
endif()
set(i686_SOURCES
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D14044.38373.patch
Type: text/x-patch
Size: 2884 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151026/390419a8/attachment.bin>
More information about the llvm-commits
mailing list