[llvm] Drop EHFrameRegistrar, use AllocActions for eh-frame registration. (PR #130719)

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 10 22:16:59 PDT 2025


https://github.com/lhames created https://github.com/llvm/llvm-project/pull/130719

None

>From 96679128ab9c8e3e39c0b747ebd13ff73db646ac Mon Sep 17 00:00:00 2001
From: Lang Hames <lhames at gmail.com>
Date: Tue, 11 Mar 2025 14:58:25 +1100
Subject: [PATCH 1/2] [ORC] Remove EHFrameRegistrar, use allocation actions for
 eh-frame registration.

This simplifies resource management, and should improve performance for most use
cases.
---
 .../ExecutionEngine/JITLink/EHFrameSupport.h  |  32 +----
 .../Orc/EHFrameRegistrationPlugin.h           |  41 +++---
 .../ExecutionEngine/Orc/EPCEHFrameRegistrar.h |  58 ---------
 .../JITLink/EHFrameSupport.cpp                |  52 ++------
 llvm/lib/ExecutionEngine/Orc/CMakeLists.txt   |   1 -
 .../Orc/EHFrameRegistrationPlugin.cpp         | 117 +++++-------------
 .../Orc/EPCEHFrameRegistrar.cpp               |  49 --------
 llvm/lib/ExecutionEngine/Orc/LLJIT.cpp        |   8 +-
 llvm/tools/llvm-jitlink/llvm-jitlink.cpp      |   7 +-
 9 files changed, 71 insertions(+), 294 deletions(-)
 delete mode 100644 llvm/include/llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h
 delete mode 100644 llvm/lib/ExecutionEngine/Orc/EPCEHFrameRegistrar.cpp

diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/EHFrameSupport.h b/llvm/include/llvm/ExecutionEngine/JITLink/EHFrameSupport.h
index 7fb61b6a021af..6bfa5506017df 100644
--- a/llvm/include/llvm/ExecutionEngine/JITLink/EHFrameSupport.h
+++ b/llvm/include/llvm/ExecutionEngine/JITLink/EHFrameSupport.h
@@ -83,35 +83,9 @@ class EHFrameCFIBlockInspector {
   };
 };
 
-/// Supports registration/deregistration of EH-frames in a target process.
-class EHFrameRegistrar {
-public:
-  virtual ~EHFrameRegistrar();
-  virtual Error registerEHFrames(orc::ExecutorAddrRange EHFrameSection) = 0;
-  virtual Error deregisterEHFrames(orc::ExecutorAddrRange EHFrameSection) = 0;
-};
-
-/// Registers / Deregisters EH-frames in the current process.
-class InProcessEHFrameRegistrar final : public EHFrameRegistrar {
-public:
-  Error registerEHFrames(orc::ExecutorAddrRange EHFrameSection) override;
-
-  Error deregisterEHFrames(orc::ExecutorAddrRange EHFrameSection) override;
-};
-
-using StoreFrameRangeFunction = std::function<void(
-    orc::ExecutorAddr EHFrameSectionAddr, size_t EHFrameSectionSize)>;
-
-/// Creates a pass that records the address and size of the EH frame section.
-/// If no eh-frame section is found then the address and size will both be given
-/// as zero.
-///
-/// Authors of JITLinkContexts can use this function to register a post-fixup
-/// pass that records the range of the eh-frame section. This range can
-/// be used after finalization to register and deregister the frame.
-LinkGraphPassFunction
-createEHFrameRecorderPass(const Triple &TT,
-                          StoreFrameRangeFunction StoreFrameRange);
+/// Returns a pointer to the DWARF eh-frame section if the graph contains a
+/// non-empty one, otherwise returns null.
+Section *getEHFrameSection(LinkGraph &G);
 
 } // end namespace jitlink
 } // end namespace llvm
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/EHFrameRegistrationPlugin.h b/llvm/include/llvm/ExecutionEngine/Orc/EHFrameRegistrationPlugin.h
index 6cbbc0c94a37f..fb035d890eee5 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/EHFrameRegistrationPlugin.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/EHFrameRegistrationPlugin.h
@@ -19,37 +19,38 @@
 #include <mutex>
 #include <vector>
 
-namespace llvm {
-
-namespace jitlink {
-class EHFrameRegistrar;
-} // namespace jitlink
-
-namespace orc {
+namespace llvm::orc {
 
+/// Adds AllocationActions to register and deregister eh-frame sections in the
+/// absence of native Platform support.
 class EHFrameRegistrationPlugin : public LinkGraphLinkingLayer::Plugin {
 public:
-  EHFrameRegistrationPlugin(
-      ExecutionSession &ES,
-      std::unique_ptr<jitlink::EHFrameRegistrar> Registrar);
+  static Expected<std::unique_ptr<EHFrameRegistrationPlugin>>
+  Create(ExecutionSession &ES);
+
+  EHFrameRegistrationPlugin(ExecutionSession &ES, ExecutorAddr RegisterEHFrame,
+                            ExecutorAddr DeregisterEHFrame)
+      : ES(ES), RegisterEHFrame(RegisterEHFrame),
+        DeregisterEHFrame(DeregisterEHFrame) {}
+
   void modifyPassConfig(MaterializationResponsibility &MR,
                         jitlink::LinkGraph &G,
                         jitlink::PassConfiguration &PassConfig) override;
-  Error notifyEmitted(MaterializationResponsibility &MR) override;
-  Error notifyFailed(MaterializationResponsibility &MR) override;
-  Error notifyRemovingResources(JITDylib &JD, ResourceKey K) override;
+  Error notifyFailed(MaterializationResponsibility &MR) override {
+    return Error::success();
+  }
+  Error notifyRemovingResources(JITDylib &JD, ResourceKey K) override {
+    return Error::success();
+  }
   void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey,
-                                   ResourceKey SrcKey) override;
+                                   ResourceKey SrcKey) override {}
 
 private:
-  std::mutex EHFramePluginMutex;
   ExecutionSession &ES;
-  std::unique_ptr<jitlink::EHFrameRegistrar> Registrar;
-  DenseMap<MaterializationResponsibility *, ExecutorAddrRange> InProcessLinks;
-  DenseMap<ResourceKey, std::vector<ExecutorAddrRange>> EHFrameRanges;
+  ExecutorAddr RegisterEHFrame;
+  ExecutorAddr DeregisterEHFrame;
 };
 
-} // end namespace orc
-} // end namespace llvm
+} // namespace llvm::orc
 
 #endif // LLVM_EXECUTIONENGINE_ORC_EHFRAMEREGISTRATIONPLUGIN_H
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h b/llvm/include/llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h
deleted file mode 100644
index 182e9ed1041a6..0000000000000
--- a/llvm/include/llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h
+++ /dev/null
@@ -1,58 +0,0 @@
-//===-- EPCEHFrameRegistrar.h - EPC based eh-frame registration -*- C++ -*-===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-//
-// ExecutorProcessControl based eh-frame registration.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_EXECUTIONENGINE_ORC_EPCEHFRAMEREGISTRAR_H
-#define LLVM_EXECUTIONENGINE_ORC_EPCEHFRAMEREGISTRAR_H
-
-#include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h"
-#include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h"
-
-namespace llvm {
-namespace orc {
-
-class ExecutionSession;
-
-/// Register/Deregisters EH frames in a remote process via a
-/// ExecutorProcessControl instance.
-class EPCEHFrameRegistrar : public jitlink::EHFrameRegistrar {
-public:
-  /// Create from a ExecutorProcessControl instance alone. This will use
-  /// the EPC's lookupSymbols method to find the registration/deregistration
-  /// function addresses by name.
-  ///
-  /// If RegistrationFunctionsDylib is non-None then it will be searched to
-  /// find the registration functions. If it is None then the process dylib
-  /// will be loaded to find the registration functions.
-  static Expected<std::unique_ptr<EPCEHFrameRegistrar>>
-  Create(ExecutionSession &ES);
-
-  /// Create a EPCEHFrameRegistrar with the given ExecutorProcessControl
-  /// object and registration/deregistration function addresses.
-  EPCEHFrameRegistrar(ExecutionSession &ES,
-                      ExecutorAddr RegisterEHFrameSectionWrapper,
-                      ExecutorAddr DeregisterEHFRameSectionWrapper)
-      : ES(ES), RegisterEHFrameSectionWrapper(RegisterEHFrameSectionWrapper),
-        DeregisterEHFrameSectionWrapper(DeregisterEHFRameSectionWrapper) {}
-
-  Error registerEHFrames(ExecutorAddrRange EHFrameSection) override;
-  Error deregisterEHFrames(ExecutorAddrRange EHFrameSection) override;
-
-private:
-  ExecutionSession &ES;
-  ExecutorAddr RegisterEHFrameSectionWrapper;
-  ExecutorAddr DeregisterEHFrameSectionWrapper;
-};
-
-} // end namespace orc
-} // end namespace llvm
-
-#endif // LLVM_EXECUTIONENGINE_ORC_EPCEHFRAMEREGISTRAR_H
diff --git a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
index 540dfdad5831b..72e5f701f89a7 100644
--- a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
@@ -639,20 +639,6 @@ Error EHFrameNullTerminator::operator()(LinkGraph &G) {
   return Error::success();
 }
 
-EHFrameRegistrar::~EHFrameRegistrar() = default;
-
-Error InProcessEHFrameRegistrar::registerEHFrames(
-    orc::ExecutorAddrRange EHFrameSection) {
-  return orc::registerEHFrameSection(EHFrameSection.Start.toPtr<void *>(),
-                                     EHFrameSection.size());
-}
-
-Error InProcessEHFrameRegistrar::deregisterEHFrames(
-    orc::ExecutorAddrRange EHFrameSection) {
-  return orc::deregisterEHFrameSection(EHFrameSection.Start.toPtr<void *>(),
-                                       EHFrameSection.size());
-}
-
 EHFrameCFIBlockInspector EHFrameCFIBlockInspector::FromEdgeScan(Block &B) {
   if (B.edges_empty())
     return EHFrameCFIBlockInspector(nullptr);
@@ -678,36 +664,24 @@ EHFrameCFIBlockInspector::EHFrameCFIBlockInspector(Edge &CIEEdge,
                                                    Edge *LSDAEdge)
     : CIEEdge(&CIEEdge), PCBeginEdge(&PCBeginEdge), LSDAEdge(LSDAEdge) {}
 
-LinkGraphPassFunction
-createEHFrameRecorderPass(const Triple &TT,
-                          StoreFrameRangeFunction StoreRangeAddress) {
+Section *getEHFrameSection(LinkGraph &G) {
   const char *EHFrameSectionName = nullptr;
-  if (TT.getObjectFormat() == Triple::MachO)
+  switch (G.getTargetTriple().getObjectFormat()) {
+  case Triple::MachO:
     EHFrameSectionName = "__TEXT,__eh_frame";
-  else
+    break;
+  case Triple::ELF:
     EHFrameSectionName = ".eh_frame";
+    break;
+  default:
+    return nullptr;
+  }
 
-  auto RecordEHFrame =
-      [EHFrameSectionName,
-       StoreFrameRange = std::move(StoreRangeAddress)](LinkGraph &G) -> Error {
-    // Search for a non-empty eh-frame and record the address of the first
-    // symbol in it.
-    orc::ExecutorAddr Addr;
-    size_t Size = 0;
-    if (auto *S = G.findSectionByName(EHFrameSectionName)) {
-      auto R = SectionRange(*S);
-      Addr = R.getStart();
-      Size = R.getSize();
-    }
-    if (!Addr && Size != 0)
-      return make_error<JITLinkError>(
-          StringRef(EHFrameSectionName) +
-          " section can not have zero address with non-zero size");
-    StoreFrameRange(Addr, Size);
-    return Error::success();
-  };
+  if (auto *S = G.findSectionByName(EHFrameSectionName))
+    if (!S->empty())
+      return S;
 
-  return RecordEHFrame;
+  return nullptr;
 }
 
 } // end namespace jitlink
diff --git a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
index c701a05ee301f..431f9590a874e 100644
--- a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
+++ b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
@@ -18,7 +18,6 @@ add_llvm_component_library(LLVMOrcJIT
   EHFrameRegistrationPlugin.cpp
   EPCDynamicLibrarySearchGenerator.cpp
   EPCDebugObjectRegistrar.cpp
-  EPCEHFrameRegistrar.cpp
   EPCGenericDylibManager.cpp
   EPCGenericJITLinkMemoryManager.cpp
   EPCGenericRTDyldMemoryManager.cpp
diff --git a/llvm/lib/ExecutionEngine/Orc/EHFrameRegistrationPlugin.cpp b/llvm/lib/ExecutionEngine/Orc/EHFrameRegistrationPlugin.cpp
index 161bd68ff0854..cad2a4906e7c9 100644
--- a/llvm/lib/ExecutionEngine/Orc/EHFrameRegistrationPlugin.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/EHFrameRegistrationPlugin.cpp
@@ -10,6 +10,7 @@
 
 #include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h"
 #include "llvm/ExecutionEngine/Orc/Shared/MachOObjectFormat.h"
+#include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
 
 #define DEBUG_TYPE "orc"
 
@@ -17,14 +18,26 @@ using namespace llvm::jitlink;
 
 namespace llvm::orc {
 
-EHFrameRegistrationPlugin::EHFrameRegistrationPlugin(
-    ExecutionSession &ES, std::unique_ptr<EHFrameRegistrar> Registrar)
-    : ES(ES), Registrar(std::move(Registrar)) {}
+Expected<std::unique_ptr<EHFrameRegistrationPlugin>>
+EHFrameRegistrationPlugin::Create(ExecutionSession &ES) {
+  // Lookup addresseses of the registration/deregistration functions in the
+  // bootstrap map.
+  ExecutorAddr RegisterEHFrameSectionWrapper;
+  ExecutorAddr DeregisterEHFrameSectionWrapper;
+  if (auto Err = ES.getExecutorProcessControl().getBootstrapSymbols(
+          {{RegisterEHFrameSectionWrapper,
+            rt::RegisterEHFrameSectionWrapperName},
+           {DeregisterEHFrameSectionWrapper,
+            rt::DeregisterEHFrameSectionWrapperName}}))
+    return std::move(Err);
+
+  return std::make_unique<EHFrameRegistrationPlugin>(
+      ES, RegisterEHFrameSectionWrapper, DeregisterEHFrameSectionWrapper);
+}
 
 void EHFrameRegistrationPlugin::modifyPassConfig(
     MaterializationResponsibility &MR, LinkGraph &LG,
     PassConfiguration &PassConfig) {
-
   if (LG.getTargetTriple().isOSBinFormatMachO())
     PassConfig.PrePrunePasses.insert(
         PassConfig.PrePrunePasses.begin(), [](LinkGraph &G) {
@@ -33,92 +46,20 @@ void EHFrameRegistrationPlugin::modifyPassConfig(
           return Error::success();
         });
 
-  PassConfig.PostFixupPasses.push_back(createEHFrameRecorderPass(
-      LG.getTargetTriple(), [this, &MR](ExecutorAddr Addr, size_t Size) {
-        if (Addr) {
-          std::lock_guard<std::mutex> Lock(EHFramePluginMutex);
-          assert(!InProcessLinks.count(&MR) &&
-                 "Link for MR already being tracked?");
-          InProcessLinks[&MR] = {Addr, Size};
-        }
-      }));
-}
-
-Error EHFrameRegistrationPlugin::notifyEmitted(
-    MaterializationResponsibility &MR) {
-
-  ExecutorAddrRange EmittedRange;
-  {
-    std::lock_guard<std::mutex> Lock(EHFramePluginMutex);
-
-    auto EHFrameRangeItr = InProcessLinks.find(&MR);
-    if (EHFrameRangeItr == InProcessLinks.end())
-      return Error::success();
-
-    EmittedRange = EHFrameRangeItr->second;
-    assert(EmittedRange.Start && "eh-frame addr to register can not be null");
-    InProcessLinks.erase(EHFrameRangeItr);
-  }
-
-  if (auto Err = MR.withResourceKeyDo(
-          [&](ResourceKey K) { EHFrameRanges[K].push_back(EmittedRange); }))
-    return Err;
-
-  return Registrar->registerEHFrames(EmittedRange);
-}
-
-Error EHFrameRegistrationPlugin::notifyFailed(
-    MaterializationResponsibility &MR) {
-  std::lock_guard<std::mutex> Lock(EHFramePluginMutex);
-  InProcessLinks.erase(&MR);
-  return Error::success();
-}
-
-Error EHFrameRegistrationPlugin::notifyRemovingResources(JITDylib &JD,
-                                                         ResourceKey K) {
-  std::vector<ExecutorAddrRange> RangesToRemove;
-
-  ES.runSessionLocked([&] {
-    auto I = EHFrameRanges.find(K);
-    if (I != EHFrameRanges.end()) {
-      RangesToRemove = std::move(I->second);
-      EHFrameRanges.erase(I);
+  PassConfig.PostFixupPasses.push_back([this](LinkGraph &G) -> Error {
+    if (auto *EHFrame = getEHFrameSection(G)) {
+      using namespace shared;
+      auto R = SectionRange(*EHFrame).getRange();
+      G.allocActions().push_back(
+          {cantFail(
+               WrapperFunctionCall::Create<SPSArgList<SPSExecutorAddrRange>>(
+                   RegisterEHFrame, R)),
+           cantFail(
+               WrapperFunctionCall::Create<SPSArgList<SPSExecutorAddrRange>>(
+                   DeregisterEHFrame, R))});
     }
+    return Error::success();
   });
-
-  Error Err = Error::success();
-  while (!RangesToRemove.empty()) {
-    auto RangeToRemove = RangesToRemove.back();
-    RangesToRemove.pop_back();
-    assert(RangeToRemove.Start && "Untracked eh-frame range must not be null");
-    Err = joinErrors(std::move(Err),
-                     Registrar->deregisterEHFrames(RangeToRemove));
-  }
-
-  return Err;
-}
-
-void EHFrameRegistrationPlugin::notifyTransferringResources(
-    JITDylib &JD, ResourceKey DstKey, ResourceKey SrcKey) {
-  auto SI = EHFrameRanges.find(SrcKey);
-  if (SI == EHFrameRanges.end())
-    return;
-
-  auto DI = EHFrameRanges.find(DstKey);
-  if (DI != EHFrameRanges.end()) {
-    auto &SrcRanges = SI->second;
-    auto &DstRanges = DI->second;
-    DstRanges.reserve(DstRanges.size() + SrcRanges.size());
-    for (auto &SrcRange : SrcRanges)
-      DstRanges.push_back(std::move(SrcRange));
-    EHFrameRanges.erase(SI);
-  } else {
-    // We need to move SrcKey's ranges over without invalidating the SI
-    // iterator.
-    auto Tmp = std::move(SI->second);
-    EHFrameRanges.erase(SI);
-    EHFrameRanges[DstKey] = std::move(Tmp);
-  }
 }
 
 } // namespace llvm::orc
diff --git a/llvm/lib/ExecutionEngine/Orc/EPCEHFrameRegistrar.cpp b/llvm/lib/ExecutionEngine/Orc/EPCEHFrameRegistrar.cpp
deleted file mode 100644
index f15315260ab01..0000000000000
--- a/llvm/lib/ExecutionEngine/Orc/EPCEHFrameRegistrar.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-//===------ EPCEHFrameRegistrar.cpp - EPC-based eh-frame registration -----===//
-//
-// 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 "llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h"
-
-#include "llvm/ExecutionEngine/Orc/Core.h"
-#include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
-
-using namespace llvm::orc::shared;
-
-namespace llvm {
-namespace orc {
-
-Expected<std::unique_ptr<EPCEHFrameRegistrar>>
-EPCEHFrameRegistrar::Create(ExecutionSession &ES) {
-
-  // Lookup addresseses of the registration/deregistration functions in the
-  // bootstrap map.
-  ExecutorAddr RegisterEHFrameSectionWrapper;
-  ExecutorAddr DeregisterEHFrameSectionWrapper;
-  if (auto Err = ES.getExecutorProcessControl().getBootstrapSymbols(
-          {{RegisterEHFrameSectionWrapper,
-            rt::RegisterEHFrameSectionWrapperName},
-           {DeregisterEHFrameSectionWrapper,
-            rt::DeregisterEHFrameSectionWrapperName}}))
-    return std::move(Err);
-
-  return std::make_unique<EPCEHFrameRegistrar>(
-      ES, RegisterEHFrameSectionWrapper, DeregisterEHFrameSectionWrapper);
-}
-
-Error EPCEHFrameRegistrar::registerEHFrames(ExecutorAddrRange EHFrameSection) {
-  return ES.callSPSWrapper<void(SPSExecutorAddrRange)>(
-      RegisterEHFrameSectionWrapper, EHFrameSection);
-}
-
-Error EPCEHFrameRegistrar::deregisterEHFrames(
-    ExecutorAddrRange EHFrameSection) {
-  return ES.callSPSWrapper<void(SPSExecutorAddrRange)>(
-      DeregisterEHFrameSectionWrapper, EHFrameSection);
-}
-
-} // end namespace orc
-} // end namespace llvm
diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
index a48b2624eccda..1886ea062c8d5 100644
--- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
@@ -14,7 +14,6 @@
 #include "llvm/ExecutionEngine/Orc/EHFrameRegistrationPlugin.h"
 #include "llvm/ExecutionEngine/Orc/ELFNixPlatform.h"
 #include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h"
-#include "llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h"
 #include "llvm/ExecutionEngine/Orc/ExecutorProcessControl.h"
 #include "llvm/ExecutionEngine/Orc/MachOPlatform.h"
 #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
@@ -1252,12 +1251,11 @@ Expected<JITDylibSP> setUpGenericLLVMIRPlatform(LLJIT &J) {
     // Otherwise fall back to standard unwind registration.
     if (UseEHFrames) {
       auto &ES = J.getExecutionSession();
-      if (auto EHFrameRegistrar = EPCEHFrameRegistrar::Create(ES)) {
-        OLL->addPlugin(std::make_unique<EHFrameRegistrationPlugin>(
-            ES, std::move(*EHFrameRegistrar)));
+      if (auto EHFP = EHFrameRegistrationPlugin::Create(ES)) {
+        OLL->addPlugin(std::move(*EHFP));
         LLVM_DEBUG(dbgs() << "Enabled eh-frame support.\n");
       } else
-        return EHFrameRegistrar.takeError();
+        return EHFP.takeError();
     }
   }
 
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
index e4ed5b2aefb9a..9cadee0ba09ad 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
@@ -27,7 +27,6 @@
 #include "llvm/ExecutionEngine/Orc/ELFNixPlatform.h"
 #include "llvm/ExecutionEngine/Orc/EPCDebugObjectRegistrar.h"
 #include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h"
-#include "llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h"
 #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
 #include "llvm/ExecutionEngine/Orc/GetDylibInterface.h"
 #include "llvm/ExecutionEngine/Orc/IndirectionUtils.h"
@@ -1248,13 +1247,11 @@ Session::Session(std::unique_ptr<ExecutorProcessControl> EPC, Error &Err)
       if (!UseEHFrames)
         ObjLayer.addPlugin(ExitOnErr(UnwindInfoRegistrationPlugin::Create(ES)));
       else
-        ObjLayer.addPlugin(std::make_unique<EHFrameRegistrationPlugin>(
-            ES, ExitOnErr(EPCEHFrameRegistrar::Create(ES))));
+        ObjLayer.addPlugin(ExitOnErr(EHFrameRegistrationPlugin::Create(ES)));
     }
   } else if (TT.isOSBinFormatELF()) {
     if (!NoExec)
-      ObjLayer.addPlugin(std::make_unique<EHFrameRegistrationPlugin>(
-          ES, ExitOnErr(EPCEHFrameRegistrar::Create(this->ES))));
+      ObjLayer.addPlugin(ExitOnErr(EHFrameRegistrationPlugin::Create(ES)));
     if (DebuggerSupport)
       ObjLayer.addPlugin(std::make_unique<DebugObjectManagerPlugin>(
           ES, ExitOnErr(createJITLoaderGDBRegistrar(this->ES)), true, true));

>From f77ab84f02448a417527e0051fa76ab096d9e46e Mon Sep 17 00:00:00 2001
From: Lang Hames <lhames at apple.com>
Date: Tue, 11 Mar 2025 16:12:52 +1100
Subject: [PATCH 2/2] Rename eh-frame registration functions to reflect their
 new status as actions, clang-format patch.

---
 .../Orc/EHFrameRegistrationPlugin.h                |  7 +++----
 .../llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h  |  4 ++--
 .../Orc/TargetProcess/RegisterEHFrames.h           |  4 ++--
 .../Orc/EHFrameRegistrationPlugin.cpp              | 14 +++++++-------
 .../Orc/EPCGenericRTDyldMemoryManager.cpp          |  5 +++--
 llvm/lib/ExecutionEngine/Orc/LLJIT.cpp             |  4 ++--
 .../lib/ExecutionEngine/Orc/Shared/OrcRTBridge.cpp |  8 ++++----
 .../TargetProcess/DefaultHostBootstrapValues.cpp   |  8 ++++----
 .../Orc/TargetProcess/RegisterEHFrames.cpp         |  4 ++--
 .../Orc/TargetProcess/SimpleRemoteEPCServer.cpp    |  8 ++++----
 llvm/tools/lli/lli.cpp                             |  4 ++--
 .../llvm-jitlink-executor.cpp                      |  4 ++--
 llvm/tools/llvm-jitlink/llvm-jitlink.cpp           |  4 ++--
 13 files changed, 39 insertions(+), 39 deletions(-)

diff --git a/llvm/include/llvm/ExecutionEngine/Orc/EHFrameRegistrationPlugin.h b/llvm/include/llvm/ExecutionEngine/Orc/EHFrameRegistrationPlugin.h
index fb035d890eee5..6f25b998fb005 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/EHFrameRegistrationPlugin.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/EHFrameRegistrationPlugin.h
@@ -28,10 +28,10 @@ class EHFrameRegistrationPlugin : public LinkGraphLinkingLayer::Plugin {
   static Expected<std::unique_ptr<EHFrameRegistrationPlugin>>
   Create(ExecutionSession &ES);
 
-  EHFrameRegistrationPlugin(ExecutionSession &ES, ExecutorAddr RegisterEHFrame,
+  EHFrameRegistrationPlugin(ExecutorAddr RegisterEHFrame,
                             ExecutorAddr DeregisterEHFrame)
-      : ES(ES), RegisterEHFrame(RegisterEHFrame),
-        DeregisterEHFrame(DeregisterEHFrame) {}
+      : RegisterEHFrame(RegisterEHFrame), DeregisterEHFrame(DeregisterEHFrame) {
+  }
 
   void modifyPassConfig(MaterializationResponsibility &MR,
                         jitlink::LinkGraph &G,
@@ -46,7 +46,6 @@ class EHFrameRegistrationPlugin : public LinkGraphLinkingLayer::Plugin {
                                    ResourceKey SrcKey) override {}
 
 private:
-  ExecutionSession &ES;
   ExecutorAddr RegisterEHFrame;
   ExecutorAddr DeregisterEHFrame;
 };
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h
index 0f59edd429332..927939e63bbfd 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h
@@ -44,8 +44,8 @@ extern const char *MemoryWriteUInt64sWrapperName;
 extern const char *MemoryWriteBuffersWrapperName;
 extern const char *MemoryWritePointersWrapperName;
 
-extern const char *RegisterEHFrameSectionWrapperName;
-extern const char *DeregisterEHFrameSectionWrapperName;
+extern const char *RegisterEHFrameSectionAllocActionName;
+extern const char *DeregisterEHFrameSectionAllocActionName;
 
 extern const char *RunAsMainWrapperName;
 extern const char *RunAsVoidFunctionWrapperName;
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h
index d375f6034616a..0c56fa885cf4d 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h
@@ -35,9 +35,9 @@ Error deregisterEHFrameSection(const void *EHFrameSectionAddr,
 } // end namespace llvm
 
 extern "C" LLVM_ABI llvm::orc::shared::CWrapperFunctionResult
-llvm_orc_registerEHFrameSectionWrapper(const char *Data, uint64_t Size);
+llvm_orc_registerEHFrameSectionAllocAction(const char *Data, uint64_t Size);
 
 extern "C" LLVM_ABI llvm::orc::shared::CWrapperFunctionResult
-llvm_orc_deregisterEHFrameSectionWrapper(const char *Data, uint64_t Size);
+llvm_orc_deregisterEHFrameSectionAllocAction(const char *Data, uint64_t Size);
 
 #endif // LLVM_EXECUTIONENGINE_ORC_TARGETPROCESS_REGISTEREHFRAMES_H
diff --git a/llvm/lib/ExecutionEngine/Orc/EHFrameRegistrationPlugin.cpp b/llvm/lib/ExecutionEngine/Orc/EHFrameRegistrationPlugin.cpp
index cad2a4906e7c9..b34c3434b256c 100644
--- a/llvm/lib/ExecutionEngine/Orc/EHFrameRegistrationPlugin.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/EHFrameRegistrationPlugin.cpp
@@ -22,17 +22,17 @@ Expected<std::unique_ptr<EHFrameRegistrationPlugin>>
 EHFrameRegistrationPlugin::Create(ExecutionSession &ES) {
   // Lookup addresseses of the registration/deregistration functions in the
   // bootstrap map.
-  ExecutorAddr RegisterEHFrameSectionWrapper;
-  ExecutorAddr DeregisterEHFrameSectionWrapper;
+  ExecutorAddr RegisterEHFrameSectionAllocAction;
+  ExecutorAddr DeregisterEHFrameSectionAllocAction;
   if (auto Err = ES.getExecutorProcessControl().getBootstrapSymbols(
-          {{RegisterEHFrameSectionWrapper,
-            rt::RegisterEHFrameSectionWrapperName},
-           {DeregisterEHFrameSectionWrapper,
-            rt::DeregisterEHFrameSectionWrapperName}}))
+          {{RegisterEHFrameSectionAllocAction,
+            rt::RegisterEHFrameSectionAllocActionName},
+           {DeregisterEHFrameSectionAllocAction,
+            rt::DeregisterEHFrameSectionAllocActionName}}))
     return std::move(Err);
 
   return std::make_unique<EHFrameRegistrationPlugin>(
-      ES, RegisterEHFrameSectionWrapper, DeregisterEHFrameSectionWrapper);
+      RegisterEHFrameSectionAllocAction, DeregisterEHFrameSectionAllocAction);
 }
 
 void EHFrameRegistrationPlugin::modifyPassConfig(
diff --git a/llvm/lib/ExecutionEngine/Orc/EPCGenericRTDyldMemoryManager.cpp b/llvm/lib/ExecutionEngine/Orc/EPCGenericRTDyldMemoryManager.cpp
index 060f17c957ef9..fec7062ff79a6 100644
--- a/llvm/lib/ExecutionEngine/Orc/EPCGenericRTDyldMemoryManager.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/EPCGenericRTDyldMemoryManager.cpp
@@ -28,8 +28,9 @@ EPCGenericRTDyldMemoryManager::CreateWithDefaultBootstrapSymbols(
            {SAs.Finalize, rt::SimpleExecutorMemoryManagerFinalizeWrapperName},
            {SAs.Deallocate,
             rt::SimpleExecutorMemoryManagerDeallocateWrapperName},
-           {SAs.RegisterEHFrame, rt::RegisterEHFrameSectionWrapperName},
-           {SAs.DeregisterEHFrame, rt::DeregisterEHFrameSectionWrapperName}}))
+           {SAs.RegisterEHFrame, rt::RegisterEHFrameSectionAllocActionName},
+           {SAs.DeregisterEHFrame,
+            rt::DeregisterEHFrameSectionAllocActionName}}))
     return std::move(Err);
   return std::make_unique<EPCGenericRTDyldMemoryManager>(EPC, std::move(SAs));
 }
diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
index 1886ea062c8d5..7d385f4cf2fbb 100644
--- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
@@ -1340,8 +1340,8 @@ LLLazyJIT::LLLazyJIT(LLLazyJITBuilderState &S, Error &Err) : LLJIT(S, Err) {
 // In-process LLJIT uses eh-frame section wrappers via EPC, so we need to force
 // them to be linked in.
 LLVM_ATTRIBUTE_USED void linkComponents() {
-  errs() << (void *)&llvm_orc_registerEHFrameSectionWrapper
-         << (void *)&llvm_orc_deregisterEHFrameSectionWrapper;
+  errs() << (void *)&llvm_orc_registerEHFrameSectionAllocAction
+         << (void *)&llvm_orc_deregisterEHFrameSectionAllocAction;
 }
 
 } // End namespace orc.
diff --git a/llvm/lib/ExecutionEngine/Orc/Shared/OrcRTBridge.cpp b/llvm/lib/ExecutionEngine/Orc/Shared/OrcRTBridge.cpp
index d3b3f121cfcd9..4e5b800100b9c 100644
--- a/llvm/lib/ExecutionEngine/Orc/Shared/OrcRTBridge.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Shared/OrcRTBridge.cpp
@@ -52,10 +52,10 @@ const char *MemoryWriteBuffersWrapperName =
 const char *MemoryWritePointersWrapperName =
     "__llvm_orc_bootstrap_mem_write_pointers_wrapper";
 
-const char *RegisterEHFrameSectionWrapperName =
-    "llvm_orc_registerEHFrameSectionWrapper";
-const char *DeregisterEHFrameSectionWrapperName =
-    "llvm_orc_deregisterEHFrameSectionWrapper";
+const char *RegisterEHFrameSectionAllocActionName =
+    "llvm_orc_registerEHFrameAllocAction";
+const char *DeregisterEHFrameSectionAllocActionName =
+    "llvm_orc_deregisterEHFrameAllocAction";
 
 const char *RunAsMainWrapperName = "__llvm_orc_bootstrap_run_as_main_wrapper";
 const char *RunAsVoidFunctionWrapperName =
diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/DefaultHostBootstrapValues.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/DefaultHostBootstrapValues.cpp
index c95b7ac5159fe..a30e87243ada8 100644
--- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/DefaultHostBootstrapValues.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/DefaultHostBootstrapValues.cpp
@@ -22,10 +22,10 @@ void addDefaultBootstrapValuesForHostProcess(
     StringMap<ExecutorAddr> &BootstrapSymbols) {
 
   // FIXME: We probably shouldn't set these on Windows?
-  BootstrapSymbols[rt::RegisterEHFrameSectionWrapperName] =
-      ExecutorAddr::fromPtr(&llvm_orc_registerEHFrameSectionWrapper);
-  BootstrapSymbols[rt::DeregisterEHFrameSectionWrapperName] =
-      ExecutorAddr::fromPtr(&llvm_orc_deregisterEHFrameSectionWrapper);
+  BootstrapSymbols[rt::RegisterEHFrameSectionAllocActionName] =
+      ExecutorAddr::fromPtr(&llvm_orc_registerEHFrameSectionAllocAction);
+  BootstrapSymbols[rt::DeregisterEHFrameSectionAllocActionName] =
+      ExecutorAddr::fromPtr(&llvm_orc_deregisterEHFrameSectionAllocAction);
 
 #ifdef __APPLE__
   if (!dlsym(RTLD_DEFAULT, "__unw_add_find_dynamic_unwind_sections"))
diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.cpp
index f11a73bb5c7ac..fbaf2bae25f4b 100644
--- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.cpp
@@ -164,14 +164,14 @@ static Error deregisterEHFrameWrapper(ExecutorAddrRange EHFrame) {
 }
 
 extern "C" orc::shared::CWrapperFunctionResult
-llvm_orc_registerEHFrameSectionWrapper(const char *Data, uint64_t Size) {
+llvm_orc_registerEHFrameSectionAllocAction(const char *Data, uint64_t Size) {
   return WrapperFunction<SPSError(SPSExecutorAddrRange)>::handle(
              Data, Size, registerEHFrameWrapper)
       .release();
 }
 
 extern "C" orc::shared::CWrapperFunctionResult
-llvm_orc_deregisterEHFrameSectionWrapper(const char *Data, uint64_t Size) {
+llvm_orc_deregisterEHFrameSectionAllocAction(const char *Data, uint64_t Size) {
   return WrapperFunction<SPSError(SPSExecutorAddrRange)>::handle(
              Data, Size, deregisterEHFrameWrapper)
       .release();
diff --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp
index 4862b2d3e7f79..0ac68122317a9 100644
--- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp
@@ -207,10 +207,10 @@ Error SimpleRemoteEPCServer::sendSetupMessage(
          "Dispatch function name should not be set");
   EI.BootstrapSymbols[ExecutorSessionObjectName] = ExecutorAddr::fromPtr(this);
   EI.BootstrapSymbols[DispatchFnName] = ExecutorAddr::fromPtr(jitDispatchEntry);
-  EI.BootstrapSymbols[rt::RegisterEHFrameSectionWrapperName] =
-      ExecutorAddr::fromPtr(&llvm_orc_registerEHFrameSectionWrapper);
-  EI.BootstrapSymbols[rt::DeregisterEHFrameSectionWrapperName] =
-      ExecutorAddr::fromPtr(&llvm_orc_deregisterEHFrameSectionWrapper);
+  EI.BootstrapSymbols[rt::RegisterEHFrameSectionAllocActionName] =
+      ExecutorAddr::fromPtr(&llvm_orc_registerEHFrameSectionAllocAction);
+  EI.BootstrapSymbols[rt::DeregisterEHFrameSectionAllocActionName] =
+      ExecutorAddr::fromPtr(&llvm_orc_deregisterEHFrameSectionAllocAction);
 
   using SPSSerialize =
       shared::SPSArgList<shared::SPSSimpleRemoteEPCExecutorInfo>;
diff --git a/llvm/tools/lli/lli.cpp b/llvm/tools/lli/lli.cpp
index 1417a58ab4487..ed1a80d3c1bc9 100644
--- a/llvm/tools/lli/lli.cpp
+++ b/llvm/tools/lli/lli.cpp
@@ -285,8 +285,8 @@ namespace {
 }
 
 LLVM_ATTRIBUTE_USED void linkComponents() {
-  errs() << (void *)&llvm_orc_registerEHFrameSectionWrapper
-         << (void *)&llvm_orc_deregisterEHFrameSectionWrapper
+  errs() << (void *)&llvm_orc_registerEHFrameSectionAllocAction
+         << (void *)&llvm_orc_deregisterEHFrameSectionAllocAction
          << (void *)&llvm_orc_registerJITLoaderGDBWrapper
          << (void *)&llvm_orc_registerJITLoaderGDBAllocAction;
 }
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink-executor/llvm-jitlink-executor.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink-executor/llvm-jitlink-executor.cpp
index 8553eb70ebe49..8d33ae1edcaaa 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink-executor/llvm-jitlink-executor.cpp
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink-executor/llvm-jitlink-executor.cpp
@@ -42,8 +42,8 @@ using namespace llvm::orc;
 ExitOnError ExitOnErr;
 
 LLVM_ATTRIBUTE_USED void linkComponents() {
-  errs() << (void *)&llvm_orc_registerEHFrameSectionWrapper
-         << (void *)&llvm_orc_deregisterEHFrameSectionWrapper
+  errs() << (void *)&llvm_orc_registerEHFrameSectionAllocAction
+         << (void *)&llvm_orc_deregisterEHFrameSectionAllocAction
          << (void *)&llvm_orc_registerJITLoaderGDBWrapper
          << (void *)&llvm_orc_registerJITLoaderGDBAllocAction;
 }
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
index 9cadee0ba09ad..8a17abd58e98a 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
@@ -336,8 +336,8 @@ static ExitOnError ExitOnErr;
 
 static LLVM_ATTRIBUTE_USED void linkComponents() {
   errs() << "Linking in runtime functions\n"
-         << (void *)&llvm_orc_registerEHFrameSectionWrapper << '\n'
-         << (void *)&llvm_orc_deregisterEHFrameSectionWrapper << '\n'
+         << (void *)&llvm_orc_registerEHFrameSectionAllocAction << '\n'
+         << (void *)&llvm_orc_deregisterEHFrameSectionAllocAction << '\n'
          << (void *)&llvm_orc_registerJITLoaderGDBWrapper << '\n'
          << (void *)&llvm_orc_registerJITLoaderGDBAllocAction << '\n'
          << (void *)&llvm_orc_registerJITLoaderPerfStart << '\n'



More information about the llvm-commits mailing list