Skip to content

Commit 5132b4d

Browse files
committed
Fix custom EHFrame registration on llvm21
1 parent f977a9f commit 5132b4d

File tree

1 file changed

+82
-3
lines changed

1 file changed

+82
-3
lines changed

src/jitlayers.cpp

Lines changed: 82 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,6 +1226,8 @@ std::unique_ptr<jitlink::JITLinkMemoryManager> createJITLinkMemoryManager() JL_N
12261226
#endif
12271227
}
12281228

1229+
#if defined(JL_USE_JITLINK) && defined(LLVM_SHLIB)
1230+
# if JL_LLVM_VERSION < 210000
12291231
class JLEHFrameRegistrar final : public jitlink::EHFrameRegistrar {
12301232
public:
12311233
Error registerEHFrames(orc::ExecutorAddrRange EHFrameSection) override {
@@ -1238,6 +1240,72 @@ class JLEHFrameRegistrar final : public jitlink::EHFrameRegistrar {
12381240
return Error::success();
12391241
}
12401242
};
1243+
# else
1244+
class JLEHFrameRegistrationPlugin final : public LinkGraphLinkingLayer::Plugin {
1245+
static Error registerEHFrameWrapper(orc::ExecutorAddrRange EHFrame) {
1246+
register_eh_frames(EHFrame.Start.toPtr<uint8_t *>(), static_cast<size_t>(EHFrame.size()));
1247+
return Error::success();
1248+
}
1249+
1250+
static Error deregisterEHFrameWrapper(orc::ExecutorAddrRange EHFrame) {
1251+
deregister_eh_frames(EHFrame.Start.toPtr<uint8_t *>(), static_cast<size_t>(EHFrame.size()));
1252+
return Error::success();
1253+
}
1254+
1255+
static orc::shared::CWrapperFunctionResult
1256+
registerEHFrameSectionAllocAction(const char *ArgData, size_t ArgSize) {
1257+
using namespace llvm::orc::shared;
1258+
return WrapperFunction<SPSError(SPSExecutorAddrRange)>::handle(
1259+
ArgData, ArgSize, registerEHFrameWrapper)
1260+
.release();
1261+
}
1262+
1263+
static orc::shared::CWrapperFunctionResult
1264+
deregisterEHFrameSectionAllocAction(const char *ArgData, size_t ArgSize) {
1265+
using namespace llvm::orc::shared;
1266+
return WrapperFunction<SPSError(SPSExecutorAddrRange)>::handle(
1267+
ArgData, ArgSize, deregisterEHFrameWrapper)
1268+
.release();
1269+
}
1270+
1271+
static Error postFixup(jitlink::LinkGraph &G)
1272+
{
1273+
using namespace llvm::orc::shared;
1274+
auto registerFrame = ExecutorAddr::fromPtr(registerEHFrameSectionAllocAction);
1275+
auto deregisterFrame = ExecutorAddr::fromPtr(deregisterEHFrameSectionAllocAction);
1276+
if (auto *EHFrame = jitlink::getEHFrameSection(G)) {
1277+
auto R = jitlink::SectionRange(*EHFrame).getRange();
1278+
G.allocActions().push_back(
1279+
{cantFail(
1280+
WrapperFunctionCall::Create<SPSArgList<SPSExecutorAddrRange>>(
1281+
registerFrame, R)),
1282+
cantFail(
1283+
WrapperFunctionCall::Create<SPSArgList<SPSExecutorAddrRange>>(
1284+
deregisterFrame, R))});
1285+
}
1286+
return Error::success();
1287+
}
1288+
1289+
public:
1290+
JLEHFrameRegistrationPlugin() {}
1291+
1292+
void modifyPassConfig(MaterializationResponsibility&,
1293+
jitlink::LinkGraph&,
1294+
jitlink::PassConfiguration &PassConfig) override
1295+
{
1296+
PassConfig.PostFixupPasses.push_back(postFixup);
1297+
}
1298+
Error notifyFailed(MaterializationResponsibility&) override {
1299+
return Error::success();
1300+
}
1301+
Error notifyRemovingResources(JITDylib&, ResourceKey) override {
1302+
return Error::success();
1303+
}
1304+
void notifyTransferringResources(JITDylib&, ResourceKey,
1305+
ResourceKey) override {}
1306+
};
1307+
# endif
1308+
#endif
12411309

12421310
RTDyldMemoryManager *createRTDyldMemoryManager(void) JL_NOTSAFEPOINT;
12431311

@@ -1955,15 +2023,26 @@ JuliaOJIT::JuliaOJIT()
19552023
OptSelLayer(ES, OptimizeLayer, static_cast<orc::ThreadSafeModule (*)(orc::ThreadSafeModule, orc::MaterializationResponsibility&)>(selectOptLevel))
19562024
{
19572025
#ifdef JL_USE_JITLINK
1958-
# if defined(LLVM_SHLIB)
2026+
# if JL_LLVM_VERSION < 210000
2027+
# if defined(LLVM_SHLIB)
19592028
// When dynamically linking against LLVM, use our custom EH frame registration code
19602029
// also used with RTDyld to inform both our and the libc copy of libunwind.
19612030
auto ehRegistrar = std::make_unique<JLEHFrameRegistrar>();
1962-
# else
2031+
# else
19632032
auto ehRegistrar = std::make_unique<jitlink::InProcessEHFrameRegistrar>();
1964-
# endif
2033+
# endif
19652034
ObjectLayer.addPlugin(std::make_unique<EHFrameRegistrationPlugin>(
19662035
ES, std::move(ehRegistrar)));
2036+
#else
2037+
// llvm's EHFrameRegistrationPlugin does not seem to have any customization
2038+
// hooks in 21+. Do our own registration with a separate plugin instead.
2039+
# if defined(LLVM_SHLIB)
2040+
// When dynamically linking against LLVM, use our custom EH frame registration code
2041+
// also used with RTDyld to inform both our and the libc copy of libunwind.
2042+
ObjectLayer.addPlugin(std::make_unique<JLEHFrameRegistrationPlugin>());
2043+
# endif
2044+
ObjectLayer.addPlugin(std::move(EHFrameRegistrationPlugin::Create(ES).get()));
2045+
#endif
19672046

19682047
ObjectLayer.addPlugin(std::make_unique<JLDebuginfoPlugin>());
19692048
ObjectLayer.addPlugin(std::make_unique<JLMemoryUsagePlugin>(&jit_bytes_size));

0 commit comments

Comments
 (0)