[compiler-rt] r251928 - Support for 32-bit mingw-w64 in compiler-rt.

Martell Malone via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 3 07:46:23 PST 2015


Author: martell
Date: Tue Nov  3 09:46:23 2015
New Revision: 251928

URL: http://llvm.org/viewvc/llvm-project?rev=251928&view=rev
Log:
Support for 32-bit mingw-w64 in compiler-rt.

Add chkstk/alloca for gcc objects.
Replace or instructions with test, the latter should be marginally more
efficent, as it does not write to memory.

Differential Revision: http://reviews.llvm.org/D14044

Patch by vadimcn

Added:
    compiler-rt/trunk/lib/builtins/i386/chkstk2.S
    compiler-rt/trunk/lib/builtins/x86_64/chkstk2.S
Modified:
    compiler-rt/trunk/lib/builtins/CMakeLists.txt
    compiler-rt/trunk/lib/builtins/i386/chkstk.S
    compiler-rt/trunk/lib/builtins/x86_64/chkstk.S

Modified: compiler-rt/trunk/lib/builtins/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/CMakeLists.txt?rev=251928&r1=251927&r2=251928&view=diff
==============================================================================
--- compiler-rt/trunk/lib/builtins/CMakeLists.txt (original)
+++ compiler-rt/trunk/lib/builtins/CMakeLists.txt Tue Nov  3 09:46:23 2015
@@ -177,6 +177,7 @@ if (NOT MSVC)
     set(x86_64_SOURCES
         ${x86_64_SOURCES}
         x86_64/chkstk.S)
+        x86_64/chkstk2.S)
   endif()
 
   set(i386_SOURCES
@@ -200,6 +201,7 @@ if (NOT MSVC)
     set(i386_SOURCES
         ${i386_SOURCES}
         i386/chkstk.S)
+        i386/chkstk2.S)
   endif()
 
   set(i686_SOURCES

Modified: compiler-rt/trunk/lib/builtins/i386/chkstk.S
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/i386/chkstk.S?rev=251928&r1=251927&r2=251928&view=diff
==============================================================================
--- compiler-rt/trunk/lib/builtins/i386/chkstk.S (original)
+++ compiler-rt/trunk/lib/builtins/i386/chkstk.S Tue Nov  3 09:46:23 2015
@@ -19,13 +19,13 @@ DEFINE_COMPILERRT_FUNCTION(__chkstk_ms)
         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

Added: compiler-rt/trunk/lib/builtins/i386/chkstk2.S
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/i386/chkstk2.S?rev=251928&view=auto
==============================================================================
--- compiler-rt/trunk/lib/builtins/i386/chkstk2.S (added)
+++ compiler-rt/trunk/lib/builtins/i386/chkstk2.S Tue Nov  3 09:46:23 2015
@@ -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__

Modified: compiler-rt/trunk/lib/builtins/x86_64/chkstk.S
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/x86_64/chkstk.S?rev=251928&r1=251927&r2=251928&view=diff
==============================================================================
--- compiler-rt/trunk/lib/builtins/x86_64/chkstk.S (original)
+++ compiler-rt/trunk/lib/builtins/x86_64/chkstk.S Tue Nov  3 09:46:23 2015
@@ -24,13 +24,13 @@ DEFINE_COMPILERRT_FUNCTION(___chkstk_ms)
         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

Added: compiler-rt/trunk/lib/builtins/x86_64/chkstk2.S
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/x86_64/chkstk2.S?rev=251928&view=auto
==============================================================================
--- compiler-rt/trunk/lib/builtins/x86_64/chkstk2.S (added)
+++ compiler-rt/trunk/lib/builtins/x86_64/chkstk2.S Tue Nov  3 09:46:23 2015
@@ -0,0 +1,42 @@
+// 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 __x86_64__
+
+// _chkstk (_alloca) routine - probe stack between %rsp and (%rsp-%rax) in 4k increments,
+// then decrement %rsp by %rax.  Preserves all registers except %rsp and flags.
+// This routine is windows specific
+// http://msdn.microsoft.com/en-us/library/ms648426.aspx
+
+.text
+.balign 4
+DEFINE_COMPILERRT_FUNCTION(__alloca)
+        mov    %rcx,%rax        // x64 _alloca is a normal function with parameter in rcx
+        // fallthrough
+DEFINE_COMPILERRT_FUNCTION(___chkstk)
+        push   %rcx
+        cmp    $0x1000,%rax
+        lea    16(%rsp),%rcx     // rsp before calling this routine -> rcx
+        jb     1f
+2:
+        sub    $0x1000,%rcx
+        test   %rcx,(%rcx)
+        sub    $0x1000,%rax
+        cmp    $0x1000,%rax
+        ja     2b
+1:
+        sub    %rax,%rcx
+        test   %rcx,(%rcx)
+
+        lea    8(%rsp),%rax     // load pointer to the return address into rax
+        mov    %rcx,%rsp        // install the new top of stack pointer into rsp
+        mov    -8(%rax),%rcx    // restore rcx
+        push   (%rax)           // push return address onto the stack
+        sub    %rsp,%rax        // restore the original value in rax
+        ret
+END_COMPILERRT_FUNCTION(___chkstk)
+END_COMPILERRT_FUNCTION(__alloca)
+
+#endif // __x86_64__




More information about the llvm-commits mailing list