Skip to content

Commit cbc2a06

Browse files
committed
[lli] Export the MinGW chkstk function from the lli executable
This allows all ExecutionEngine tests pass in MinGW build configurations. Differential Revision: https://reviews.llvm.org/D150555
1 parent 5111286 commit cbc2a06

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

llvm/tools/lli/lli.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,3 +1178,41 @@ Expected<std::unique_ptr<orc::ExecutorProcessControl>> launchRemote() {
11781178
llvm::orc::SimpleRemoteEPC::Setup(), PipeFD[1][0], PipeFD[0][1]);
11791179
#endif
11801180
}
1181+
1182+
// For MinGW environments, manually export the __chkstk function from the lli
1183+
// executable.
1184+
//
1185+
// Normally, this function is provided by compiler-rt builtins or libgcc.
1186+
// It is named "_alloca" on i386, "___chkstk_ms" on x86_64, and "__chkstk" on
1187+
// arm/aarch64. In MSVC configurations, it's named "__chkstk" in all
1188+
// configurations.
1189+
//
1190+
// When Orc tries to resolve symbols at runtime, this succeeds in MSVC
1191+
// configurations, somewhat by accident/luck; kernelbase.dll does export a
1192+
// symbol named "__chkstk" which gets found by Orc, even if regular applications
1193+
// never link against that function from that DLL (it's linked in statically
1194+
// from a compiler support library).
1195+
//
1196+
// The MinGW specific symbol names aren't available in that DLL though.
1197+
// Therefore, manually export the relevant symbol from lli, to let it be
1198+
// found at runtime during tests.
1199+
//
1200+
// For real JIT uses, the real compiler support libraries should be linked
1201+
// in, somehow; this is a workaround to let tests pass.
1202+
//
1203+
// TODO: Move this into libORC at some point, see
1204+
// https://github.com/llvm/llvm-project/issues/56603.
1205+
#ifdef __MINGW32__
1206+
// This is a MinGW version of #pragma comment(linker, "...") that doesn't
1207+
// require compiling with -fms-extensions.
1208+
#if defined(__i386__)
1209+
static __attribute__((section(".drectve"), used)) const char export_chkstk[] =
1210+
"-export:_alloca";
1211+
#elif defined(__x86_64__)
1212+
static __attribute__((section(".drectve"), used)) const char export_chkstk[] =
1213+
"-export:___chkstk_ms";
1214+
#else
1215+
static __attribute__((section(".drectve"), used)) const char export_chkstk[] =
1216+
"-export:__chkstk";
1217+
#endif
1218+
#endif

0 commit comments

Comments
 (0)