@@ -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
12291231class JLEHFrameRegistrar final : public jitlink::EHFrameRegistrar {
12301232public:
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
12421310RTDyldMemoryManager *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