Skip to content

Commit 248aeac

Browse files
authored
[compiler-rt] Remove duplicate MS names for chkstk symbols (#80450)
Prior to 885d7b7, the builtins library contained two chkstk implementations for each of i386 and x86_64, one that was used in mingw environments, and one unused (with a symbol name not matching anything that is used anywhere). Some of the functions additionally had other, also unused, aliases. After cleaning this up in 885d7b7, the unused symbol names were removed. At the same time, symbol aliases were added for the names as they are used by MSVC; the functions are functionally equivalent, but have different names between mingw and MSVC style environments. By adding a symbol alias (so that one object file contains two different symbols for the same function), users can run into problems with duplicate definitions, if they themselves define one of the symbols (for various reasons), but need to link in the other one. This happens for Wine, which provides their own definition of "__chkstk", but when built in mingw mode does need compiler-rt to provide the mingw specific symbol names; see mstorsjo/llvm-mingw#397. To avoid the issue, remove the extra MS style names. They weren't entirely usable as such for MSVC style environments anyway, as compiler-rt builtins don't build these object files at all, when built in MSVC mode; thus, the effort to provide them for MSVC style environments in 885d7b7 was a half-hearted step towards that. If we really do want to provide those functions (as an alternative to the ones provided by MSVC itself), we should do it in a separate object file (even if the function implementation is the same), so that users who have a definition of one of them but need a definition of the other, won't have conflicts. Additionally, if we do want to provide them for MSVC, those files actually should be built when building the builtins in MSVC mode as well (see compiler-rt/lib/builtins/CMakeLists.txt). If we do that, there's a risk that an MSVC style build ends up linking in and preferring our implementation over the one provided by MSVC, which would be suboptimal. Our implementation always probes the requested amount of stack, while the MSVC one checks the amount of allocated stack and only probes as much as really is needed. In short - this reverts the situation to what it was in the 17.x release series (except for unused functions that have been removed).
1 parent 752c172 commit 248aeac

File tree

2 files changed

+0
-4
lines changed

2 files changed

+0
-4
lines changed

compiler-rt/lib/builtins/i386/chkstk.S

-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
.text
1515
.balign 4
1616
DEFINE_COMPILERRT_FUNCTION(_alloca) // _chkstk and _alloca are the same function
17-
DEFINE_COMPILERRT_FUNCTION(_chkstk)
1817
push %ecx
1918
cmp $0x1000,%eax
2019
lea 8(%esp),%ecx // esp before calling this routine -> ecx
@@ -35,7 +34,6 @@ DEFINE_COMPILERRT_FUNCTION(_chkstk)
3534
push (%eax) // push return address onto the stack
3635
sub %esp,%eax // restore the original value in eax
3736
ret
38-
END_COMPILERRT_FUNCTION(_chkstk)
3937
END_COMPILERRT_FUNCTION(_alloca)
4038

4139
#endif // __i386__

compiler-rt/lib/builtins/x86_64/chkstk.S

-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
.text
1919
.balign 4
2020
DEFINE_COMPILERRT_FUNCTION(___chkstk_ms)
21-
DEFINE_COMPILERRT_FUNCTION(__chkstk)
2221
push %rcx
2322
push %rax
2423
cmp $0x1000,%rax
@@ -36,7 +35,6 @@ DEFINE_COMPILERRT_FUNCTION(__chkstk)
3635
pop %rax
3736
pop %rcx
3837
ret
39-
END_COMPILERRT_FUNCTION(__chkstk)
4038
END_COMPILERRT_FUNCTION(___chkstk_ms)
4139

4240
#endif // __x86_64__

0 commit comments

Comments
 (0)