[clang] e55fb5d - [ORC] Move DylibManager ownership out of ExecutorProcessControl. (#188711)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 26 19:47:33 PDT 2026
Author: Lang Hames
Date: 2026-03-27T13:47:27+11:00
New Revision: e55fb5de0f97adc1835f0310606051cb6c0185e9
URL: https://github.com/llvm/llvm-project/commit/e55fb5de0f97adc1835f0310606051cb6c0185e9
DIFF: https://github.com/llvm/llvm-project/commit/e55fb5de0f97adc1835f0310606051cb6c0185e9.diff
LOG: [ORC] Move DylibManager ownership out of ExecutorProcessControl. (#188711)
This removes an unnecessary coupling between ExecutorProcessControl and
DylibManager, allowing clients to select DylibManager implementations
independently.
To simplify the transition, the
ExecutorProcessControl::createDefaultJITDylib method will return an
instance of whatever DylibManager the ExecutorProcessControl
implementation had been using previously.
Added:
Modified:
clang/lib/Interpreter/OrcIncrementalExecutor.cpp
llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/LLJITWithRemoteDebugging.cpp
llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.cpp
llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.h
llvm/include/llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h
llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
llvm/include/llvm/ExecutionEngine/Orc/ExecutorResolutionGenerator.h
llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h
llvm/include/llvm/ExecutionEngine/Orc/LookupAndRecordAddrs.h
llvm/include/llvm/ExecutionEngine/Orc/SelfExecutorProcessControl.h
llvm/include/llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h
llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp
llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp
llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
llvm/lib/ExecutionEngine/Orc/LookupAndRecordAddrs.cpp
llvm/lib/ExecutionEngine/Orc/SelfExecutorProcessControl.cpp
llvm/lib/ExecutionEngine/Orc/SimpleRemoteEPC.cpp
llvm/tools/llvm-jitlink/llvm-jitlink.cpp
llvm/tools/llvm-jitlink/llvm-jitlink.h
llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp
llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h
Removed:
################################################################################
diff --git a/clang/lib/Interpreter/OrcIncrementalExecutor.cpp b/clang/lib/Interpreter/OrcIncrementalExecutor.cpp
index c74e03bb7942a..7134437e6a9ad 100644
--- a/clang/lib/Interpreter/OrcIncrementalExecutor.cpp
+++ b/clang/lib/Interpreter/OrcIncrementalExecutor.cpp
@@ -109,7 +109,8 @@ llvm::Error OrcIncrementalExecutor::LoadDynamicLibrary(const char *name) {
// FIXME: Eventually we should put each library in its own JITDylib and
// turn off process symbols by default.
llvm::orc::ExecutionSession &ES = Jit->getExecutionSession();
- auto DLSGOrErr = llvm::orc::EPCDynamicLibrarySearchGenerator::Load(ES, name);
+ auto DLSGOrErr = llvm::orc::EPCDynamicLibrarySearchGenerator::Load(
+ ES, Jit->getDylibMgr(), name);
if (!DLSGOrErr)
return DLSGOrErr.takeError();
diff --git a/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/LLJITWithRemoteDebugging.cpp b/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/LLJITWithRemoteDebugging.cpp
index 1f69415649e84..995e3d7eb0d64 100644
--- a/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/LLJITWithRemoteDebugging.cpp
+++ b/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/LLJITWithRemoteDebugging.cpp
@@ -187,7 +187,7 @@ int main(int argc, char *argv[]) {
// for each of it, so the compiler can lookup their symbols.
for (const std::string &Path : Dylibs)
J->getMainJITDylib().addGenerator(
- ExitOnErr(loadDylib(J->getExecutionSession(), Path)));
+ ExitOnErr(loadDylib(J->getExecutionSession(), J->getDylibMgr(), Path)));
// Add the loaded IR module to the JIT. This will set up symbol tables and
// prepare for materialization.
diff --git a/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.cpp b/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.cpp
index 6e2aaf32325a9..511b568e36bd4 100644
--- a/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.cpp
+++ b/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.cpp
@@ -27,10 +27,10 @@ using namespace llvm;
using namespace llvm::orc;
Expected<std::unique_ptr<DefinitionGenerator>>
-loadDylib(ExecutionSession &ES, StringRef RemotePath) {
- if (auto Handle = ES.getExecutorProcessControl().getDylibMgr().loadDylib(
- RemotePath.data()))
- return std::make_unique<EPCDynamicLibrarySearchGenerator>(ES, *Handle);
+loadDylib(ExecutionSession &ES, DylibManager &DylibMgr, StringRef RemotePath) {
+ if (auto Handle = DylibMgr.loadDylib(RemotePath.data()))
+ return std::make_unique<EPCDynamicLibrarySearchGenerator>(ES, DylibMgr,
+ *Handle);
else
return Handle.takeError();
}
diff --git a/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.h b/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.h
index 3663307109bdb..70f08787798d7 100644
--- a/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.h
+++ b/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.h
@@ -16,6 +16,7 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/ExecutionEngine/Orc/Core.h"
+#include "llvm/ExecutionEngine/Orc/DylibManager.h"
#include "llvm/ExecutionEngine/Orc/Layer.h"
#include "llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h"
#include "llvm/Support/Error.h"
@@ -37,6 +38,7 @@ llvm::Expected<std::unique_ptr<llvm::orc::SimpleRemoteEPC>>
connectTCPSocket(llvm::StringRef NetworkAddress);
llvm::Expected<std::unique_ptr<llvm::orc::DefinitionGenerator>>
-loadDylib(llvm::orc::ExecutionSession &ES, llvm::StringRef RemotePath);
+loadDylib(llvm::orc::ExecutionSession &ES, llvm::orc::DylibManager &DylibMgr,
+ llvm::StringRef RemotePath);
#endif
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h b/llvm/include/llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h
index ccb855160d6f7..43f7751f2dfdb 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h
@@ -16,6 +16,7 @@
#include "llvm/ADT/FunctionExtras.h"
#include "llvm/ExecutionEngine/Orc/Core.h"
+#include "llvm/ExecutionEngine/Orc/DylibManager.h"
#include "llvm/Support/Compiler.h"
namespace llvm {
@@ -38,10 +39,10 @@ class LLVM_ABI EPCDynamicLibrarySearchGenerator : public DefinitionGenerator {
/// If \p AddAbsoluteSymbols is provided, it is used to add the symbols to the
/// \c JITDylib; otherwise it uses JD.define(absoluteSymbols(...)).
EPCDynamicLibrarySearchGenerator(
- ExecutionSession &ES, tpctypes::DylibHandle H,
+ ExecutionSession &ES, DylibManager &DylibMgr, tpctypes::DylibHandle H,
SymbolPredicate Allow = SymbolPredicate(),
AddAbsoluteSymbolsFn AddAbsoluteSymbols = nullptr)
- : EPC(ES.getExecutorProcessControl()), H(H), Allow(std::move(Allow)),
+ : ES(ES), DylibMgr(DylibMgr), H(H), Allow(std::move(Allow)),
AddAbsoluteSymbols(std::move(AddAbsoluteSymbols)) {}
/// Create an EPCDynamicLibrarySearchGenerator that resolves all symbols
@@ -52,9 +53,9 @@ class LLVM_ABI EPCDynamicLibrarySearchGenerator : public DefinitionGenerator {
/// "missing symbol" behavior in ORC. This distinction shouldn't matter for
/// most use-cases).
EPCDynamicLibrarySearchGenerator(
- ExecutionSession &ES, SymbolPredicate Allow,
+ ExecutionSession &ES, DylibManager &DylibMgr, SymbolPredicate Allow,
AddAbsoluteSymbolsFn AddAbsoluteSymbols = nullptr)
- : EPC(ES.getExecutorProcessControl()), Allow(std::move(Allow)),
+ : ES(ES), DylibMgr(DylibMgr), Allow(std::move(Allow)),
AddAbsoluteSymbols(std::move(AddAbsoluteSymbols)) {}
/// Permanently loads the library at the given path and, on success, returns
@@ -62,17 +63,18 @@ class LLVM_ABI EPCDynamicLibrarySearchGenerator : public DefinitionGenerator {
/// definitions in the library. On failure returns the reason the library
/// failed to load.
static Expected<std::unique_ptr<EPCDynamicLibrarySearchGenerator>>
- Load(ExecutionSession &ES, const char *LibraryPath,
+ Load(ExecutionSession &ES, DylibManager &DylibMgr, const char *LibraryPath,
SymbolPredicate Allow = SymbolPredicate(),
AddAbsoluteSymbolsFn AddAbsoluteSymbols = nullptr);
/// Creates a EPCDynamicLibrarySearchGenerator that searches for symbols in
/// the target process.
static Expected<std::unique_ptr<EPCDynamicLibrarySearchGenerator>>
- GetForTargetProcess(ExecutionSession &ES,
+ GetForTargetProcess(ExecutionSession &ES, DylibManager &DylibMgr,
SymbolPredicate Allow = SymbolPredicate(),
AddAbsoluteSymbolsFn AddAbsoluteSymbols = nullptr) {
- return Load(ES, nullptr, std::move(Allow), std::move(AddAbsoluteSymbols));
+ return Load(ES, DylibMgr, nullptr, std::move(Allow),
+ std::move(AddAbsoluteSymbols));
}
Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD,
@@ -82,7 +84,8 @@ class LLVM_ABI EPCDynamicLibrarySearchGenerator : public DefinitionGenerator {
private:
Error addAbsolutes(JITDylib &JD, SymbolMap Symbols);
- ExecutorProcessControl &EPC;
+ ExecutionSession &ES;
+ DylibManager &DylibMgr;
std::optional<tpctypes::DylibHandle> H;
SymbolPredicate Allow;
AddAbsoluteSymbolsFn AddAbsoluteSymbols;
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h b/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
index 379f8e42dfce7..b05543ec0a869 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
@@ -146,11 +146,8 @@ class LLVM_ABI ExecutorProcessControl {
return *MemMgr;
}
- /// Return the DylibManager for the target process.
- DylibManager &getDylibMgr() const {
- assert(DylibMgr && "No DylibMgr object set");
- return *DylibMgr;
- }
+ /// Create a default DylibManager for the target process.
+ virtual Expected<std::unique_ptr<DylibManager>> createDefaultDylibMgr() = 0;
/// Returns the bootstrap map.
const StringMap<std::vector<char>> &getBootstrapMap() const {
@@ -317,7 +314,6 @@ class LLVM_ABI ExecutorProcessControl {
JITDispatchInfo JDI;
MemoryAccess *MemAccess = nullptr;
jitlink::JITLinkMemoryManager *MemMgr = nullptr;
- DylibManager *DylibMgr = nullptr;
StringMap<std::vector<char>> BootstrapMap;
StringMap<ExecutorAddr> BootstrapSymbols;
};
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/ExecutorResolutionGenerator.h b/llvm/include/llvm/ExecutionEngine/Orc/ExecutorResolutionGenerator.h
index 9b972edf3e18c..d0d27e8bcbb11 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/ExecutorResolutionGenerator.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/ExecutorResolutionGenerator.h
@@ -18,6 +18,7 @@
#include "llvm/ADT/FunctionExtras.h"
#include "llvm/ExecutionEngine/Orc/AbsoluteSymbols.h"
#include "llvm/ExecutionEngine/Orc/Core.h"
+#include "llvm/ExecutionEngine/Orc/DylibManager.h"
namespace llvm::orc {
@@ -28,16 +29,17 @@ class ExecutorResolutionGenerator : public DefinitionGenerator {
unique_function<std::unique_ptr<MaterializationUnit>(SymbolMap)>;
ExecutorResolutionGenerator(
- ExecutionSession &ES, tpctypes::ResolverHandle H,
+ ExecutionSession &ES, DylibManager &DylibMgr, tpctypes::ResolverHandle H,
SymbolPredicate Allow = SymbolPredicate(),
AbsoluteSymbolsFn AbsoluteSymbols = absoluteSymbols)
- : EPC(ES.getExecutorProcessControl()), H(H), Allow(std::move(Allow)),
+ : ES(ES), DylibMgr(DylibMgr), H(H), Allow(std::move(Allow)),
AbsoluteSymbols(std::move(AbsoluteSymbols)) {}
ExecutorResolutionGenerator(
- ExecutionSession &ES, SymbolPredicate Allow = SymbolPredicate(),
+ ExecutionSession &ES, DylibManager &DylibMgr,
+ SymbolPredicate Allow = SymbolPredicate(),
AbsoluteSymbolsFn AbsoluteSymbols = absoluteSymbols)
- : EPC(ES.getExecutorProcessControl()), Allow(std::move(Allow)),
+ : ES(ES), DylibMgr(DylibMgr), Allow(std::move(Allow)),
AbsoluteSymbols(std::move(AbsoluteSymbols)) {}
/// Permanently loads the library at the given path and, on success, returns
@@ -45,17 +47,18 @@ class ExecutorResolutionGenerator : public DefinitionGenerator {
/// definitions in the library. On failure returns the reason the library
/// failed to load.
static Expected<std::unique_ptr<ExecutorResolutionGenerator>>
- Load(ExecutionSession &ES, const char *LibraryPath,
+ Load(ExecutionSession &ES, DylibManager &DylibMgr, const char *LibraryPath,
SymbolPredicate Allow = SymbolPredicate(),
AbsoluteSymbolsFn AbsoluteSymbols = absoluteSymbols);
/// Creates a ExecutorResolutionGenerator that searches for symbols in
/// the target process.
static Expected<std::unique_ptr<ExecutorResolutionGenerator>>
- GetForTargetProcess(ExecutionSession &ES,
+ GetForTargetProcess(ExecutionSession &ES, DylibManager &DylibMgr,
SymbolPredicate Allow = SymbolPredicate(),
AbsoluteSymbolsFn AbsoluteSymbols = absoluteSymbols) {
- return Load(ES, nullptr, std::move(Allow), std::move(AbsoluteSymbols));
+ return Load(ES, DylibMgr, nullptr, std::move(Allow),
+ std::move(AbsoluteSymbols));
}
Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD,
@@ -63,7 +66,8 @@ class ExecutorResolutionGenerator : public DefinitionGenerator {
const SymbolLookupSet &LookupSet) override;
private:
- ExecutorProcessControl &EPC;
+ ExecutionSession &ES;
+ DylibManager &DylibMgr;
tpctypes::ResolverHandle H;
SymbolPredicate Allow;
AbsoluteSymbolsFn AbsoluteSymbols;
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h b/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h
index 9c0d6e86d279f..c5f3ece6277d4 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h
@@ -17,6 +17,7 @@
#include "llvm/ExecutionEngine/Orc/AbsoluteSymbols.h"
#include "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h"
#include "llvm/ExecutionEngine/Orc/CompileUtils.h"
+#include "llvm/ExecutionEngine/Orc/DylibManager.h"
#include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
#include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
#include "llvm/ExecutionEngine/Orc/IRPartitionLayer.h"
@@ -213,6 +214,12 @@ class LLVM_ABI LLJIT {
return PS->deinitialize(JD);
}
+ /// Returns a reference to the DylibManager for the target process.
+ DylibManager &getDylibMgr() {
+ assert(DylibMgr && "No DylibMgr set");
+ return *DylibMgr;
+ }
+
/// Returns a reference to the ObjLinkingLayer
ObjectLayer &getObjLinkingLayer() { return *ObjLinkingLayer; }
@@ -247,6 +254,7 @@ class LLVM_ABI LLJIT {
std::unique_ptr<ExecutionSession> ES;
std::unique_ptr<PlatformSupport> PS;
+ std::unique_ptr<DylibManager> DylibMgr;
JITDylib *ProcessSymbols = nullptr;
JITDylib *Platform = nullptr;
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/LookupAndRecordAddrs.h b/llvm/include/llvm/ExecutionEngine/Orc/LookupAndRecordAddrs.h
index 26a7801f00123..fbe69ee99db08 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/LookupAndRecordAddrs.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/LookupAndRecordAddrs.h
@@ -18,6 +18,7 @@
#include "llvm/ADT/FunctionExtras.h"
#include "llvm/ExecutionEngine/Orc/Core.h"
+#include "llvm/ExecutionEngine/Orc/DylibManager.h"
#include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h"
#include "llvm/Support/Compiler.h"
@@ -56,15 +57,6 @@ LLVM_ABI Error lookupAndRecordAddrs(
std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs,
SymbolLookupFlags LookupFlags = SymbolLookupFlags::RequiredSymbol);
-/// Record addresses of given symbols in the given ExecutorAddrs.
-///
-/// ExecutorProcessControl lookup version. Lookups are always implicitly
-/// weak.
-LLVM_ABI Error lookupAndRecordAddrs(
- ExecutorProcessControl &EPC, tpctypes::DylibHandle H,
- std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs,
- SymbolLookupFlags LookupFlags = SymbolLookupFlags::RequiredSymbol);
-
} // End namespace orc
} // End namespace llvm
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/SelfExecutorProcessControl.h b/llvm/include/llvm/ExecutionEngine/Orc/SelfExecutorProcessControl.h
index 475ef562deb6c..7027a561410ce 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/SelfExecutorProcessControl.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/SelfExecutorProcessControl.h
@@ -50,6 +50,8 @@ class LLVM_ABI SelfExecutorProcessControl : public ExecutorProcessControl {
IncomingWFRHandler OnComplete,
ArrayRef<char> ArgBuffer) override;
+ Expected<std::unique_ptr<DylibManager>> createDefaultDylibMgr() override;
+
Error disconnect() override;
private:
@@ -74,7 +76,6 @@ class LLVM_ABI SelfExecutorProcessControl : public ExecutorProcessControl {
std::unique_ptr<UnwindInfoManager> UnwindInfoMgr;
#endif // __APPLE__
InProcessMemoryAccess IPMA;
- InProcessDylibManager IPDM;
};
} // namespace llvm::orc
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h b/llvm/include/llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h
index ab97fb5f19ee2..bfc96f3a72443 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h
@@ -15,7 +15,6 @@
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/FunctionExtras.h"
-#include "llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h"
#include "llvm/ExecutionEngine/Orc/EPCGenericJITLinkMemoryManager.h"
#include "llvm/ExecutionEngine/Orc/EPCGenericMemoryAccess.h"
#include "llvm/ExecutionEngine/Orc/ExecutorProcessControl.h"
@@ -81,6 +80,8 @@ class LLVM_ABI SimpleRemoteEPC : public ExecutorProcessControl,
IncomingWFRHandler OnComplete,
ArrayRef<char> ArgBuffer) override;
+ Expected<std::unique_ptr<DylibManager>> createDefaultDylibMgr() override;
+
Error disconnect() override;
Expected<HandleMessageAction>
@@ -127,7 +128,6 @@ class LLVM_ABI SimpleRemoteEPC : public ExecutorProcessControl,
std::unique_ptr<jitlink::JITLinkMemoryManager> OwnedMemMgr;
std::unique_ptr<MemoryAccess> OwnedMemAccess;
- std::unique_ptr<EPCGenericDylibManager> EPCDylibMgr;
ExecutorAddr RunAsMainAddr;
ExecutorAddr RunAsVoidFunctionAddr;
ExecutorAddr RunAsIntFunctionAddr;
diff --git a/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp b/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp
index 1e83c07f4bdb1..fbee8cc2a96b9 100644
--- a/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp
@@ -19,15 +19,14 @@ namespace orc {
Expected<std::unique_ptr<EPCDynamicLibrarySearchGenerator>>
EPCDynamicLibrarySearchGenerator::Load(
- ExecutionSession &ES, const char *LibraryPath, SymbolPredicate Allow,
- AddAbsoluteSymbolsFn AddAbsoluteSymbols) {
- auto Handle =
- ES.getExecutorProcessControl().getDylibMgr().loadDylib(LibraryPath);
+ ExecutionSession &ES, DylibManager &DylibMgr, const char *LibraryPath,
+ SymbolPredicate Allow, AddAbsoluteSymbolsFn AddAbsoluteSymbols) {
+ auto Handle = DylibMgr.loadDylib(LibraryPath);
if (!Handle)
return Handle.takeError();
return std::make_unique<EPCDynamicLibrarySearchGenerator>(
- ES, *Handle, std::move(Allow), std::move(AddAbsoluteSymbols));
+ ES, DylibMgr, *Handle, std::move(Allow), std::move(AddAbsoluteSymbols));
}
Error EPCDynamicLibrarySearchGenerator::tryToGenerate(
@@ -65,9 +64,8 @@ Error EPCDynamicLibrarySearchGenerator::tryToGenerate(
DylibManager::LookupRequest Request(*H, LookupSymbols);
// Copy-capture LookupSymbols, since LookupRequest keeps a reference.
- EPC.getDylibMgr().lookupSymbolsAsync(Request, [this, &JD, LS = std::move(LS),
- LookupSymbols](
- auto Result) mutable {
+ DylibMgr.lookupSymbolsAsync(Request, [this, &JD, LS = std::move(LS),
+ LookupSymbols](auto Result) mutable {
if (!Result) {
LLVM_DEBUG({
dbgs() << "EPCDynamicLibrarySearchGenerator lookup failed due to error";
@@ -102,7 +100,7 @@ Error EPCDynamicLibrarySearchGenerator::tryToGenerate(
if (LLVM_UNLIKELY(!MissingSymbols.empty()))
return LS.continueLookup(make_error<SymbolsNotFound>(
- this->EPC.getSymbolStringPool(), std::move(MissingSymbols)));
+ this->ES.getSymbolStringPool(), std::move(MissingSymbols)));
// Define resolved symbols.
Error Err = addAbsolutes(JD, std::move(NewSymbols));
diff --git a/llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp b/llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp
index e5b0bd3dbc5c3..b63698a553763 100644
--- a/llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/ExecutorResolutionGenerator.cpp
@@ -18,14 +18,15 @@ namespace llvm {
namespace orc {
Expected<std::unique_ptr<ExecutorResolutionGenerator>>
-ExecutorResolutionGenerator::Load(ExecutionSession &ES, const char *LibraryPath,
+ExecutorResolutionGenerator::Load(ExecutionSession &ES, DylibManager &DylibMgr,
+ const char *LibraryPath,
SymbolPredicate Allow,
AbsoluteSymbolsFn AbsoluteSymbols) {
- auto H = ES.getExecutorProcessControl().getDylibMgr().loadDylib(LibraryPath);
+ auto H = DylibMgr.loadDylib(LibraryPath);
if (H)
return H.takeError();
return std::make_unique<ExecutorResolutionGenerator>(
- ES, *H, std::move(Allow), std::move(AbsoluteSymbols));
+ ES, DylibMgr, *H, std::move(Allow), std::move(AbsoluteSymbols));
}
Error ExecutorResolutionGenerator::tryToGenerate(
@@ -48,7 +49,7 @@ Error ExecutorResolutionGenerator::tryToGenerate(
}
DylibManager::LookupRequest LR(H, LookupSymbols);
- EPC.getDylibMgr().lookupSymbolsAsync(
+ DylibMgr.lookupSymbolsAsync(
LR, [this, LS = std::move(LS), JD = JITDylibSP(&JD),
LookupSymbols](auto Result) mutable {
if (Result) {
@@ -86,7 +87,7 @@ Error ExecutorResolutionGenerator::tryToGenerate(
if (LLVM_UNLIKELY(!MissingSymbols.empty()))
return LS.continueLookup(make_error<SymbolsNotFound>(
- this->EPC.getSymbolStringPool(), std::move(MissingSymbols)));
+ this->ES.getSymbolStringPool(), std::move(MissingSymbols)));
LS.continueLookup(JD->define(AbsoluteSymbols(std::move(NewSyms))));
});
diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
index 7487526c5d059..2b9bae1591701 100644
--- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
@@ -843,7 +843,7 @@ Error LLJITBuilderState::prepareForConstruction() {
auto &JD =
J.getExecutionSession().createBareJITDylib("<Process Symbols>");
auto G = EPCDynamicLibrarySearchGenerator::GetForTargetProcess(
- J.getExecutionSession());
+ J.getExecutionSession(), J.getDylibMgr());
if (!G)
return G.takeError();
JD.addGenerator(std::move(*G));
@@ -873,7 +873,7 @@ Expected<JITDylib &> LLJIT::createJITDylib(std::string Name) {
}
Expected<JITDylib &> LLJIT::loadPlatformDynamicLibrary(const char *Path) {
- auto G = EPCDynamicLibrarySearchGenerator::Load(*ES, Path);
+ auto G = EPCDynamicLibrarySearchGenerator::Load(*ES, *DylibMgr, Path);
if (!G)
return G.takeError();
@@ -1012,6 +1012,13 @@ LLJIT::LLJIT(LLJITBuilderState &S, Error &Err)
}
}
+ if (auto DM = ES->getExecutorProcessControl().createDefaultDylibMgr())
+ DylibMgr = std::move(*DM);
+ else {
+ Err = DM.takeError();
+ return;
+ }
+
auto ObjLayer = createObjectLinkingLayer(S, *ES);
if (!ObjLayer) {
Err = ObjLayer.takeError();
diff --git a/llvm/lib/ExecutionEngine/Orc/LookupAndRecordAddrs.cpp b/llvm/lib/ExecutionEngine/Orc/LookupAndRecordAddrs.cpp
index 42d630d690864..480196817e76d 100644
--- a/llvm/lib/ExecutionEngine/Orc/LookupAndRecordAddrs.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/LookupAndRecordAddrs.cpp
@@ -51,33 +51,5 @@ Error lookupAndRecordAddrs(
return ResultF.get();
}
-Error lookupAndRecordAddrs(
- ExecutorProcessControl &EPC, tpctypes::DylibHandle H,
- std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs,
- SymbolLookupFlags LookupFlags) {
-
- SymbolLookupSet Symbols;
- for (auto &KV : Pairs)
- Symbols.add(KV.first, LookupFlags);
-
- DylibManager::LookupRequest LR(H, Symbols);
- auto Result = EPC.getDylibMgr().lookupSymbols(LR);
- if (!Result)
- return Result.takeError();
-
- if (Result->size() != 1)
- return make_error<StringError>("Error in lookup result",
- inconvertibleErrorCode());
- if (Result->front().size() != Pairs.size())
- return make_error<StringError>("Error in lookup result elements",
- inconvertibleErrorCode());
-
- for (unsigned I = 0; I != Pairs.size(); ++I) {
- if (Result->front()[I])
- *Pairs[I].second = Result->front()[I]->getAddress();
- }
- return Error::success();
-}
-
} // End namespace orc.
} // End namespace llvm.
diff --git a/llvm/lib/ExecutionEngine/Orc/SelfExecutorProcessControl.cpp b/llvm/lib/ExecutionEngine/Orc/SelfExecutorProcessControl.cpp
index a0488fdab93d0..3c07f64a92cbe 100644
--- a/llvm/lib/ExecutionEngine/Orc/SelfExecutorProcessControl.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/SelfExecutorProcessControl.cpp
@@ -24,8 +24,7 @@ SelfExecutorProcessControl::SelfExecutorProcessControl(
Triple TargetTriple, unsigned PageSize,
std::unique_ptr<jitlink::JITLinkMemoryManager> MemMgr)
: ExecutorProcessControl(std::move(SSP), std::move(D)),
- IPMA(TargetTriple.isArch64Bit()),
- IPDM(TargetTriple.isOSBinFormatMachO() ? '_' : '\0') {
+ IPMA(TargetTriple.isArch64Bit()) {
OwnedMemMgr = std::move(MemMgr);
if (!OwnedMemMgr)
@@ -36,7 +35,6 @@ SelfExecutorProcessControl::SelfExecutorProcessControl(
this->PageSize = PageSize;
this->MemMgr = OwnedMemMgr.get();
this->MemAccess = &IPMA;
- this->DylibMgr = &IPDM;
this->JDI = {ExecutorAddr::fromPtr(jitDispatchViaWrapperFunctionManager),
ExecutorAddr::fromPtr(this)};
@@ -107,6 +105,12 @@ Error SelfExecutorProcessControl::disconnect() {
return Error::success();
}
+Expected<std::unique_ptr<DylibManager>>
+SelfExecutorProcessControl::createDefaultDylibMgr() {
+ char Prefix = TargetTriple.isOSBinFormatMachO() ? '_' : '\0';
+ return std::make_unique<InProcessDylibManager>(Prefix);
+}
+
shared::CWrapperFunctionBuffer
SelfExecutorProcessControl::jitDispatchViaWrapperFunctionManager(
void *Ctx, const void *FnTag, const char *Data, size_t Size) {
diff --git a/llvm/lib/ExecutionEngine/Orc/SimpleRemoteEPC.cpp b/llvm/lib/ExecutionEngine/Orc/SimpleRemoteEPC.cpp
index 18132523a33f0..676d6f6e3fae0 100644
--- a/llvm/lib/ExecutionEngine/Orc/SimpleRemoteEPC.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/SimpleRemoteEPC.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h"
+#include "llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h"
#include "llvm/ExecutionEngine/Orc/EPCGenericJITLinkMemoryManager.h"
#include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
#include "llvm/Support/FormatVariadic.h"
@@ -85,6 +86,14 @@ void SimpleRemoteEPC::callWrapperAsync(ExecutorAddr WrapperFnAddr,
}
}
+Expected<std::unique_ptr<DylibManager>>
+SimpleRemoteEPC::createDefaultDylibMgr() {
+ auto DM = EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols(*this);
+ if (!DM)
+ return DM.takeError();
+ return std::make_unique<EPCGenericDylibManager>(std::move(*DM));
+}
+
Error SimpleRemoteEPC::disconnect() {
T->disconnect();
D->shutdown();
@@ -332,14 +341,6 @@ Error SimpleRemoteEPC::setup(Setup S) {
{RunAsIntFunctionAddr, rt::RunAsIntFunctionWrapperName}}))
return Err;
- if (auto DM =
- EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols(*this))
- EPCDylibMgr = std::make_unique<EPCGenericDylibManager>(std::move(*DM));
- else
- return DM.takeError();
-
- this->DylibMgr = EPCDylibMgr.get();
-
// Set a default CreateMemoryManager if none is specified.
if (!S.CreateMemoryManager)
S.CreateMemoryManager = createDefaultMemoryManager;
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
index 33792bacd2c17..b6903fcef1011 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
@@ -891,7 +891,7 @@ static Error loadProcessSymbols(Session &S) {
};
S.ProcessSymsJD->addGenerator(
ExitOnErr(orc::EPCDynamicLibrarySearchGenerator::GetForTargetProcess(
- S.ES, std::move(FilterMainEntryPoint))));
+ S.ES, *S.DylibMgr, std::move(FilterMainEntryPoint))));
return Error::success();
}
@@ -1222,6 +1222,13 @@ Session::Session(std::unique_ptr<ExecutorProcessControl> EPC, Error &Err)
ErrorAsOutParameter _(&Err);
+ if (auto DM = ES.getExecutorProcessControl().createDefaultDylibMgr())
+ DylibMgr = std::move(*DM);
+ else {
+ Err = DM.takeError();
+ return;
+ }
+
ES.setErrorReporter(reportLLVMJITLinkError);
// Attach WaitingOnGraph recorder if requested.
@@ -1483,7 +1490,8 @@ Expected<JITDylib *> Session::getOrLoadDynamicLibrary(StringRef LibPath) {
if (It != DynLibJDs.end()) {
return It->second;
}
- auto G = EPCDynamicLibrarySearchGenerator::Load(ES, LibPath.data());
+ auto G =
+ EPCDynamicLibrarySearchGenerator::Load(ES, *DylibMgr, LibPath.data());
if (!G)
return G.takeError();
auto JD = &ES.createBareJITDylib(LibPath.str());
@@ -2245,7 +2253,8 @@ LoadLibraryWeak(Session &S, StringRef Path) {
return Symbols.takeError();
return std::make_unique<EPCDynamicLibrarySearchGenerator>(
- S.ES, [Symbols = std::move(*Symbols)](const SymbolStringPtr &Sym) {
+ S.ES, *S.DylibMgr,
+ [Symbols = std::move(*Symbols)](const SymbolStringPtr &Sym) {
return Symbols.count(Sym);
});
}
@@ -2778,12 +2787,12 @@ static Error runChecks(Session &S, Triple TT, SubtargetFeatures Features) {
LLVM_DEBUG(dbgs() << "Running checks...\n");
auto IsSymbolValid = [&S](StringRef Symbol) {
- auto InternedSymbol = S.ES.getSymbolStringPool()->intern(Symbol);
+ auto InternedSymbol = S.ES.intern(Symbol);
return S.isSymbolRegistered(InternedSymbol);
};
auto GetSymbolInfo = [&S](StringRef Symbol) {
- auto InternedSymbol = S.ES.getSymbolStringPool()->intern(Symbol);
+ auto InternedSymbol = S.ES.intern(Symbol);
return S.findSymbolInfo(InternedSymbol, "Can not get symbol info");
};
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.h b/llvm/tools/llvm-jitlink/llvm-jitlink.h
index c88725c8e70a3..fc309b2ae5170 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink.h
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink.h
@@ -16,6 +16,7 @@
#include "llvm/ADT/StringSet.h"
#include "llvm/ExecutionEngine/Orc/COFF.h"
#include "llvm/ExecutionEngine/Orc/Core.h"
+#include "llvm/ExecutionEngine/Orc/DylibManager.h"
#include "llvm/ExecutionEngine/Orc/ExecutorProcessControl.h"
#include "llvm/ExecutionEngine/Orc/LazyObjectLinkingLayer.h"
#include "llvm/ExecutionEngine/Orc/LazyReexports.h"
@@ -74,6 +75,7 @@ struct Session {
};
orc::ExecutionSession ES;
+ std::unique_ptr<orc::DylibManager> DylibMgr;
orc::JITDylib *MainJD = nullptr;
orc::JITDylib *ProcessSymsJD = nullptr;
orc::JITDylib *PlatformJD = nullptr;
diff --git a/llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp
index 5deebec967be1..88aabb54bf285 100644
--- a/llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp
@@ -291,9 +291,7 @@ TEST(ObjectLinkingLayerSearchGeneratorTest, AbsoluteSymbolsObjectLayer) {
public:
TestEPC()
: UnsupportedExecutorProcessControl(nullptr, nullptr,
- "x86_64-apple-darwin") {
- this->DylibMgr = this;
- }
+ "x86_64-apple-darwin") {}
Expected<tpctypes::DylibHandle> loadDylib(const char *DylibPath) override {
return ExecutorAddr::fromPtr((void *)nullptr);
@@ -317,15 +315,21 @@ TEST(ObjectLinkingLayerSearchGeneratorTest, AbsoluteSymbolsObjectLayer) {
}
Complete(std::vector<tpctypes::LookupResult>{1, Result});
}
+
+ Expected<std::unique_ptr<DylibManager>> createDefaultDylibMgr() override {
+ llvm_unreachable("Unsupported");
+ }
};
- ExecutionSession ES{std::make_unique<TestEPC>()};
+ auto TestEPCPtr = std::make_unique<TestEPC>();
+ auto &TestDylibMgr = static_cast<DylibManager &>(*TestEPCPtr);
+ ExecutionSession ES{std::move(TestEPCPtr)};
JITDylib &JD = ES.createBareJITDylib("main");
ObjectLinkingLayer ObjLinkingLayer{
ES, std::make_unique<InProcessMemoryManager>(4096)};
auto G = EPCDynamicLibrarySearchGenerator::GetForTargetProcess(
- ES, {}, [&](JITDylib &JD, SymbolMap Syms) {
+ ES, TestDylibMgr, {}, [&](JITDylib &JD, SymbolMap Syms) {
auto G =
absoluteSymbolsLinkGraph(Triple("x86_64-apple-darwin"),
ES.getSymbolStringPool(), std::move(Syms));
diff --git a/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h b/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h
index e22c35f1332f7..4e9b90f0b0db3 100644
--- a/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h
+++ b/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h
@@ -121,6 +121,10 @@ class UnsupportedExecutorProcessControl : public ExecutorProcessControl,
llvm_unreachable("Unsupported");
}
+ Expected<std::unique_ptr<DylibManager>> createDefaultDylibMgr() override {
+ llvm_unreachable("Unsupported");
+ }
+
Error disconnect() override { return Error::success(); }
};
More information about the cfe-commits
mailing list