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(); } }; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
