[compiler-rt] 885d7b7 - [compiler-rt] [builtins] Remove unused/misnamed x86 chkstk functions

Martin Storsjö via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 1 09:44:31 PDT 2023


Author: Martin Storsjö
Date: 2023-09-01T19:43:50+03:00
New Revision: 885d7b759b5c166c07c07f4c58c6e0ba110fb0c2

URL: https://github.com/llvm/llvm-project/commit/885d7b759b5c166c07c07f4c58c6e0ba110fb0c2
DIFF: https://github.com/llvm/llvm-project/commit/885d7b759b5c166c07c07f4c58c6e0ba110fb0c2.diff

LOG: [compiler-rt] [builtins] Remove unused/misnamed x86 chkstk functions

For both MSVC and MinGW targets, the compiler generates calls to
functions for probing the stack, in functions that allocate a larger
amount of stack space.

The exact behaviour of these functions differ per architecture (some
decrement the stack, some actually decrement the stack pointer,
some only probe the stack). In MSVC mode, the compiler always
generates calls to a symbol named "__chkstk". In MinGW mode, the
symbol is named "__alloca" on i386 and "___chkstk_ms" on x86_64,
but the functions behave exactly the same as their MSVC counterparts
despite the differing names.

(On i386, these names are the raw symbol names - if considering
a C level function name with the extra implicit leading underscore,
they would be called "_chkstk" and "_alloca".)

Remove the misleading duplicate and unused functions. These were
added in fbfed869106cc9c9cad7538db5e65bcd24f4d92e /
c27de5b2790b65394c50ba13fab319995dbf5956 (adding "___chkstk_ms"
for both architectures, even if that symbol name only was used
on x86_64) and 40eb83ba56ba9c1d2e6de44deacf889ac0143cf7
(adding "__alloca" and "___chkstk", even if the former only was
used on i386, and the latter seeming like a misspelled form of
the MSVC function, with three underscores instead of two).

The x86_64 "___chkstk" was doubly surprising as that function had
the same behaviour as the function used on i386, while the
"__chkstk" that MSVC emitted calls to should behave exactly like
the preexisting "___chkstk_ms".

Remove the unused functions, and rename the misspelled MSVC-like
symbols to the correct name that MSVC mode actually uses.

Note that these files aren't assembled at all when building
compiler-rt builtins in MSVC mode, as they are expected to be
provided by MSVC libraries when building code in MSVC mode.

Differential Revision: https://reviews.llvm.org/D159139

Added: 
    

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

Removed: 
    compiler-rt/lib/builtins/i386/chkstk.S
    compiler-rt/lib/builtins/x86_64/chkstk2.S


################################################################################
diff  --git a/compiler-rt/lib/builtins/CMakeLists.txt b/compiler-rt/lib/builtins/CMakeLists.txt
index 7f00391d1dceb9..e43cc9a41beb0f 100644
--- a/compiler-rt/lib/builtins/CMakeLists.txt
+++ b/compiler-rt/lib/builtins/CMakeLists.txt
@@ -330,7 +330,6 @@ if (NOT MSVC)
     set(x86_64_SOURCES
       ${x86_64_SOURCES}
       x86_64/chkstk.S
-      x86_64/chkstk2.S
     )
   endif()
 
@@ -363,7 +362,6 @@ if (NOT MSVC)
   if (WIN32)
     set(i386_SOURCES
       ${i386_SOURCES}
-      i386/chkstk.S
       i386/chkstk2.S
     )
   endif()

diff  --git a/compiler-rt/lib/builtins/i386/chkstk.S b/compiler-rt/lib/builtins/i386/chkstk.S
deleted file mode 100644
index f0bea21874575e..00000000000000
--- a/compiler-rt/lib/builtins/i386/chkstk.S
+++ /dev/null
@@ -1,35 +0,0 @@
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-
-#include "../assembly.h"
-
-// _chkstk routine
-// This routine is windows specific
-// http://msdn.microsoft.com/en-us/library/ms648426.aspx
-
-#ifdef __i386__
-
-.text
-.balign 4
-DEFINE_COMPILERRT_FUNCTION(__chkstk_ms)
-        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
-        test   %ecx,(%ecx)
-        pop    %eax
-        pop    %ecx
-        ret
-END_COMPILERRT_FUNCTION(__chkstk_ms)
-
-#endif // __i386__

diff  --git a/compiler-rt/lib/builtins/i386/chkstk2.S b/compiler-rt/lib/builtins/i386/chkstk2.S
index 5d6cbdfa5c99cc..a84bb0ee300705 100644
--- a/compiler-rt/lib/builtins/i386/chkstk2.S
+++ b/compiler-rt/lib/builtins/i386/chkstk2.S
@@ -14,7 +14,7 @@
 .text
 .balign 4
 DEFINE_COMPILERRT_FUNCTION(_alloca) // _chkstk and _alloca are the same function
-DEFINE_COMPILERRT_FUNCTION(__chkstk)
+DEFINE_COMPILERRT_FUNCTION(_chkstk)
         push   %ecx
         cmp    $0x1000,%eax
         lea    8(%esp),%ecx     // esp before calling this routine -> ecx
@@ -35,7 +35,7 @@ DEFINE_COMPILERRT_FUNCTION(__chkstk)
         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(_chkstk)
 END_COMPILERRT_FUNCTION(_alloca)
 
 #endif // __i386__

diff  --git a/compiler-rt/lib/builtins/x86_64/chkstk.S b/compiler-rt/lib/builtins/x86_64/chkstk.S
index ad7953a116ac7e..494ee261193bc7 100644
--- a/compiler-rt/lib/builtins/x86_64/chkstk.S
+++ b/compiler-rt/lib/builtins/x86_64/chkstk.S
@@ -18,6 +18,7 @@
 .text
 .balign 4
 DEFINE_COMPILERRT_FUNCTION(___chkstk_ms)
+DEFINE_COMPILERRT_FUNCTION(__chkstk)
         push   %rcx
         push   %rax
         cmp    $0x1000,%rax
@@ -35,6 +36,7 @@ DEFINE_COMPILERRT_FUNCTION(___chkstk_ms)
         pop    %rax
         pop    %rcx
         ret
+END_COMPILERRT_FUNCTION(__chkstk)
 END_COMPILERRT_FUNCTION(___chkstk_ms)
 
 #endif // __x86_64__

diff  --git a/compiler-rt/lib/builtins/x86_64/chkstk2.S b/compiler-rt/lib/builtins/x86_64/chkstk2.S
deleted file mode 100644
index 33d10d5b63be8d..00000000000000
--- a/compiler-rt/lib/builtins/x86_64/chkstk2.S
+++ /dev/null
@@ -1,43 +0,0 @@
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-
-#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