[llvm] [ORC] Move DylibManager impl out of SelfExecutorProcessControl. (PR #188417)

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 24 23:06:09 PDT 2026


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

SelfExecutorProcessControl no longer implements DylibManager. Instead a private inner class, InProcessDylibManager, is used to implement this interface. This change should not affect the behavior of SelfExecutorProcessControl from the perspective of API clients.

This is a step towards decoupling ExecutorProcessControl implementations from other interfaces.

>From 34747636f0fc0699090e930f11ff62dd60975803 Mon Sep 17 00:00:00 2001
From: Lang Hames <lhames at gmail.com>
Date: Wed, 25 Mar 2026 16:32:43 +1100
Subject: [PATCH] [ORC] Move DylibManager impl out of
 SelfExecutorProcessControl.

SelfExecutorProcessControl no longer implements DylibManager. Instead a private
inner class, InProcessDylibManager, is used to implement this interface. This
change should not affect the behavior of SelfExecutorProcessControl from the
perspective of API clients.

This is a step towards decoupling ExecutorProcessControl implementations from
other interfaces.
---
 .../Orc/SelfExecutorProcessControl.h          | 22 +++--
 .../Orc/SelfExecutorProcessControl.cpp        | 80 ++++++++++---------
 2 files changed, 55 insertions(+), 47 deletions(-)

diff --git a/llvm/include/llvm/ExecutionEngine/Orc/SelfExecutorProcessControl.h b/llvm/include/llvm/ExecutionEngine/Orc/SelfExecutorProcessControl.h
index 8c43073d83493..475ef562deb6c 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/SelfExecutorProcessControl.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/SelfExecutorProcessControl.h
@@ -22,8 +22,7 @@
 namespace llvm::orc {
 
 /// A ExecutorProcessControl implementation targeting the current process.
-class LLVM_ABI SelfExecutorProcessControl : public ExecutorProcessControl,
-                                            private DylibManager {
+class LLVM_ABI SelfExecutorProcessControl : public ExecutorProcessControl {
 public:
   SelfExecutorProcessControl(
       std::shared_ptr<SymbolStringPool> SSP, std::unique_ptr<TaskDispatcher> D,
@@ -54,21 +53,28 @@ class LLVM_ABI SelfExecutorProcessControl : public ExecutorProcessControl,
   Error disconnect() override;
 
 private:
+  class InProcessDylibManager : public DylibManager {
+  public:
+    InProcessDylibManager(char GlobalManglingPrefix);
+    Expected<tpctypes::DylibHandle> loadDylib(const char *DylibPath) override;
+    void
+    lookupSymbolsAsync(ArrayRef<LookupRequest> Request,
+                       DylibManager::SymbolLookupCompleteFn Complete) override;
+
+  private:
+    char GlobalManglingPrefix;
+  };
+
   static shared::CWrapperFunctionBuffer
   jitDispatchViaWrapperFunctionManager(void *Ctx, const void *FnTag,
                                        const char *Data, size_t Size);
 
-  Expected<tpctypes::DylibHandle> loadDylib(const char *DylibPath) override;
-
-  void lookupSymbolsAsync(ArrayRef<LookupRequest> Request,
-                          SymbolLookupCompleteFn F) override;
-
   std::unique_ptr<jitlink::JITLinkMemoryManager> OwnedMemMgr;
 #ifdef __APPLE__
   std::unique_ptr<UnwindInfoManager> UnwindInfoMgr;
 #endif // __APPLE__
-  char GlobalManglingPrefix = 0;
   InProcessMemoryAccess IPMA;
+  InProcessDylibManager IPDM;
 };
 
 } // namespace llvm::orc
diff --git a/llvm/lib/ExecutionEngine/Orc/SelfExecutorProcessControl.cpp b/llvm/lib/ExecutionEngine/Orc/SelfExecutorProcessControl.cpp
index 8d49278b3a0f8..a0488fdab93d0 100644
--- a/llvm/lib/ExecutionEngine/Orc/SelfExecutorProcessControl.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/SelfExecutorProcessControl.cpp
@@ -24,7 +24,8 @@ SelfExecutorProcessControl::SelfExecutorProcessControl(
     Triple TargetTriple, unsigned PageSize,
     std::unique_ptr<jitlink::JITLinkMemoryManager> MemMgr)
     : ExecutorProcessControl(std::move(SSP), std::move(D)),
-      IPMA(TargetTriple.isArch64Bit()) {
+      IPMA(TargetTriple.isArch64Bit()),
+      IPDM(TargetTriple.isOSBinFormatMachO() ? '_' : '\0') {
 
   OwnedMemMgr = std::move(MemMgr);
   if (!OwnedMemMgr)
@@ -35,13 +36,10 @@ SelfExecutorProcessControl::SelfExecutorProcessControl(
   this->PageSize = PageSize;
   this->MemMgr = OwnedMemMgr.get();
   this->MemAccess = &IPMA;
-  this->DylibMgr = this;
+  this->DylibMgr = &IPDM;
   this->JDI = {ExecutorAddr::fromPtr(jitDispatchViaWrapperFunctionManager),
                ExecutorAddr::fromPtr(this)};
 
-  if (this->TargetTriple.isOSBinFormatMachO())
-    GlobalManglingPrefix = '_';
-
   addDefaultBootstrapValuesForHostProcess(BootstrapMap, BootstrapSymbols);
 
 #ifdef __APPLE__
@@ -75,40 +73,6 @@ SelfExecutorProcessControl::Create(
       std::move(MemMgr));
 }
 
-Expected<tpctypes::DylibHandle>
-SelfExecutorProcessControl::loadDylib(const char *DylibPath) {
-  std::string ErrMsg;
-  auto Dylib = sys::DynamicLibrary::getPermanentLibrary(DylibPath, &ErrMsg);
-  if (!Dylib.isValid())
-    return make_error<StringError>(std::move(ErrMsg), inconvertibleErrorCode());
-  return ExecutorAddr::fromPtr(Dylib.getOSSpecificHandle());
-}
-
-void SelfExecutorProcessControl::lookupSymbolsAsync(
-    ArrayRef<LookupRequest> Request,
-    DylibManager::SymbolLookupCompleteFn Complete) {
-  std::vector<tpctypes::LookupResult> R;
-
-  for (auto &Elem : Request) {
-    sys::DynamicLibrary Dylib(Elem.Handle.toPtr<void *>());
-    R.push_back(tpctypes::LookupResult());
-    for (auto &KV : Elem.Symbols) {
-      auto &Sym = KV.first;
-      std::string Tmp((*Sym).data() + !!GlobalManglingPrefix,
-                      (*Sym).size() - !!GlobalManglingPrefix);
-      void *Addr = Dylib.getAddressOfSymbol(Tmp.c_str());
-      if (!Addr && KV.second == SymbolLookupFlags::RequiredSymbol)
-        R.back().emplace_back();
-      else
-        // FIXME: determine accurate JITSymbolFlags.
-        R.back().emplace_back(ExecutorSymbolDef(ExecutorAddr::fromPtr(Addr),
-                                                JITSymbolFlags::Exported));
-    }
-  }
-
-  Complete(std::move(R));
-}
-
 Expected<int32_t>
 SelfExecutorProcessControl::runAsMain(ExecutorAddr MainFnAddr,
                                       ArrayRef<std::string> Args) {
@@ -167,4 +131,42 @@ SelfExecutorProcessControl::jitDispatchViaWrapperFunctionManager(
   return ResultF.get().release();
 }
 
+SelfExecutorProcessControl::InProcessDylibManager::InProcessDylibManager(
+    char GlobalManglingPrefix)
+    : GlobalManglingPrefix(GlobalManglingPrefix) {}
+
+Expected<tpctypes::DylibHandle>
+SelfExecutorProcessControl::InProcessDylibManager::loadDylib(
+    const char *DylibPath) {
+  std::string ErrMsg;
+  auto Dylib = sys::DynamicLibrary::getPermanentLibrary(DylibPath, &ErrMsg);
+  if (!Dylib.isValid())
+    return make_error<StringError>(std::move(ErrMsg), inconvertibleErrorCode());
+  return ExecutorAddr::fromPtr(Dylib.getOSSpecificHandle());
+}
+
+void SelfExecutorProcessControl::InProcessDylibManager::lookupSymbolsAsync(
+    ArrayRef<LookupRequest> Request,
+    DylibManager::SymbolLookupCompleteFn Complete) {
+  std::vector<tpctypes::LookupResult> R;
+
+  for (auto &Elem : Request) {
+    sys::DynamicLibrary Dylib(Elem.Handle.toPtr<void *>());
+    R.push_back(tpctypes::LookupResult());
+    for (auto &KV : Elem.Symbols) {
+      auto &Sym = KV.first;
+      std::string Tmp((*Sym).data() + !!GlobalManglingPrefix,
+                      (*Sym).size() - !!GlobalManglingPrefix);
+      void *Addr = Dylib.getAddressOfSymbol(Tmp.c_str());
+      if (!Addr && KV.second == SymbolLookupFlags::RequiredSymbol)
+        R.back().emplace_back();
+      else
+        // FIXME: determine accurate JITSymbolFlags.
+        R.back().emplace_back(ExecutorSymbolDef(ExecutorAddr::fromPtr(Addr),
+                                                JITSymbolFlags::Exported));
+    }
+  }
+  Complete(std::move(R));
+}
+
 } // namespace llvm::orc



More information about the llvm-commits mailing list