[PATCH] D14044: Support for 32-bit mingw-w64 in compiler-rt

Vadim Chugunov via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 24 22:14:01 PDT 2015


vadimcn updated this revision to Diff 38339.
vadimcn added a comment.

After playing with this some more - it's no fun linking with gcc-generated libraries, because they actually do use __checkstk_ms, so you have to pull in libgcc as well, and end up with duplicate symbols.   Let's add _chkstk as an extra, not as replacement.


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,38 @@
+// 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
+        push   %eax
+        cmp    $0x1000,%eax
+        lea    12(%esp),%ecx
+        jb     1f
+2:
+        sub    $0x1000,%ecx
+        test   %ecx,(%ecx)
+        sub    $0x1000,%eax
+        cmp    $0x1000,%eax
+        ja     2b
+1:
+        sub    %eax,%ecx
+        pop    %eax
+        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)
+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.38339.patch
Type: text/x-patch
Size: 2754 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151025/89ae0aca/attachment.bin>


More information about the llvm-commits mailing list