diff --git a/examples/Kaleidoscope/BuildingAJIT/Chapter1/KaleidoscopeJIT.h b/examples/Kaleidoscope/BuildingAJIT/Chapter1/KaleidoscopeJIT.h index a5553f488bb..a7eb1db8625 100644 --- a/examples/Kaleidoscope/BuildingAJIT/Chapter1/KaleidoscopeJIT.h +++ b/examples/Kaleidoscope/BuildingAJIT/Chapter1/KaleidoscopeJIT.h @@ -47,7 +47,6 @@ private: IRCompileLayer CompileLayer; public: - KaleidoscopeJIT() : ES(SSP), Resolver(createLegacyLookupResolver( @@ -63,10 +62,11 @@ public: }, [](Error Err) { cantFail(std::move(Err), "lookupFlags failed"); })), TM(EngineBuilder().selectTarget()), DL(TM->createDataLayout()), - ObjectLayer( - ES, - [](VModuleKey) { return std::make_shared(); }, - [this](VModuleKey K) { return Resolver; }), + ObjectLayer(ES, + [this](VModuleKey) { + return RTDyldObjectLinkingLayer::Resources{ + std::make_shared(), Resolver}; + }), CompileLayer(ObjectLayer, SimpleCompiler(*TM)) { llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr); } diff --git a/examples/Kaleidoscope/BuildingAJIT/Chapter2/KaleidoscopeJIT.h b/examples/Kaleidoscope/BuildingAJIT/Chapter2/KaleidoscopeJIT.h index c04244a4ad7..b6323b8963b 100644 --- a/examples/Kaleidoscope/BuildingAJIT/Chapter2/KaleidoscopeJIT.h +++ b/examples/Kaleidoscope/BuildingAJIT/Chapter2/KaleidoscopeJIT.h @@ -56,7 +56,6 @@ private: IRTransformLayer OptimizeLayer; public: - KaleidoscopeJIT() : ES(SSP), Resolver(createLegacyLookupResolver( @@ -72,10 +71,11 @@ public: }, [](Error Err) { cantFail(std::move(Err), "lookupFlags failed"); })), TM(EngineBuilder().selectTarget()), DL(TM->createDataLayout()), - ObjectLayer( - ES, - [](VModuleKey) { return std::make_shared(); }, - [this](VModuleKey K) { return Resolver; }), + ObjectLayer(ES, + [this](VModuleKey) { + return RTDyldObjectLinkingLayer::Resources{ + std::make_shared(), Resolver}; + }), CompileLayer(ObjectLayer, SimpleCompiler(*TM)), OptimizeLayer(CompileLayer, [this](std::shared_ptr M) { return optimizeModule(std::move(M)); diff --git a/examples/Kaleidoscope/BuildingAJIT/Chapter3/KaleidoscopeJIT.h b/examples/Kaleidoscope/BuildingAJIT/Chapter3/KaleidoscopeJIT.h index 767a1183b44..d6d31870002 100644 --- a/examples/Kaleidoscope/BuildingAJIT/Chapter3/KaleidoscopeJIT.h +++ b/examples/Kaleidoscope/BuildingAJIT/Chapter3/KaleidoscopeJIT.h @@ -63,13 +63,14 @@ private: CompileOnDemandLayer CODLayer; public: - KaleidoscopeJIT() : ES(SSP), TM(EngineBuilder().selectTarget()), DL(TM->createDataLayout()), - ObjectLayer( - ES, - [](VModuleKey) { return std::make_shared(); }, - [&](orc::VModuleKey K) { return Resolvers[K]; }), + ObjectLayer(ES, + [this](VModuleKey K) { + return RTDyldObjectLinkingLayer::Resources{ + std::make_shared(), + Resolvers[K]}; + }), CompileLayer(ObjectLayer, SimpleCompiler(*TM)), OptimizeLayer(CompileLayer, [this](std::shared_ptr M) { diff --git a/examples/Kaleidoscope/BuildingAJIT/Chapter4/KaleidoscopeJIT.h b/examples/Kaleidoscope/BuildingAJIT/Chapter4/KaleidoscopeJIT.h index 1fa169b8b13..f3878918065 100644 --- a/examples/Kaleidoscope/BuildingAJIT/Chapter4/KaleidoscopeJIT.h +++ b/examples/Kaleidoscope/BuildingAJIT/Chapter4/KaleidoscopeJIT.h @@ -89,7 +89,6 @@ private: std::unique_ptr IndirectStubsMgr; public: - KaleidoscopeJIT() : ES(SSP), Resolver(createLegacyLookupResolver( @@ -107,10 +106,11 @@ public: }, [](Error Err) { cantFail(std::move(Err), "lookupFlags failed"); })), TM(EngineBuilder().selectTarget()), DL(TM->createDataLayout()), - ObjectLayer( - ES, - [](VModuleKey) { return std::make_shared(); }, - [&](VModuleKey K) { return Resolver; }), + ObjectLayer(ES, + [this](VModuleKey K) { + return RTDyldObjectLinkingLayer::Resources{ + std::make_shared(), Resolver}; + }), CompileLayer(ObjectLayer, SimpleCompiler(*TM)), OptimizeLayer(CompileLayer, [this](std::shared_ptr M) { diff --git a/examples/Kaleidoscope/BuildingAJIT/Chapter5/KaleidoscopeJIT.h b/examples/Kaleidoscope/BuildingAJIT/Chapter5/KaleidoscopeJIT.h index 806573f1667..46638c1f720 100644 --- a/examples/Kaleidoscope/BuildingAJIT/Chapter5/KaleidoscopeJIT.h +++ b/examples/Kaleidoscope/BuildingAJIT/Chapter5/KaleidoscopeJIT.h @@ -95,7 +95,6 @@ private: MyRemote &Remote; public: - KaleidoscopeJIT(MyRemote &Remote) : ES(SSP), Resolver(createLegacyLookupResolver( @@ -115,10 +114,11 @@ public: "", SmallVector())), DL(TM->createDataLayout()), ObjectLayer(ES, - [&Remote](VModuleKey) { - return cantFail(Remote.createRemoteMemoryManager()); - }, - [this](VModuleKey) { return Resolver; }), + [this](VModuleKey K) { + return RTDyldObjectLinkingLayer::Resources{ + cantFail(this->Remote.createRemoteMemoryManager()), + Resolver}; + }), CompileLayer(ObjectLayer, SimpleCompiler(*TM)), OptimizeLayer(CompileLayer, [this](std::shared_ptr M) { diff --git a/examples/Kaleidoscope/include/KaleidoscopeJIT.h b/examples/Kaleidoscope/include/KaleidoscopeJIT.h index c2f9d80f636..3e2fe42a5d8 100644 --- a/examples/Kaleidoscope/include/KaleidoscopeJIT.h +++ b/examples/Kaleidoscope/include/KaleidoscopeJIT.h @@ -51,10 +51,11 @@ public: }, [](Error Err) { cantFail(std::move(Err), "lookupFlags failed"); })), TM(EngineBuilder().selectTarget()), DL(TM->createDataLayout()), - ObjectLayer( - ES, - [](VModuleKey) { return std::make_shared(); }, - [this](VModuleKey) { return Resolver; }), + ObjectLayer(ES, + [this](VModuleKey) { + return ObjLayerT::Resources{ + std::make_shared(), Resolver}; + }), CompileLayer(ObjectLayer, SimpleCompiler(*TM)) { llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr); } diff --git a/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h b/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h index c66725766d3..343a65bee6a 100644 --- a/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h +++ b/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h @@ -213,23 +213,20 @@ private: } public: + struct Resources { + std::shared_ptr MemMgr; + std::shared_ptr Resolver; + }; - /// @brief Functor for creating memory managers. - using MemoryManagerGetter = - std::function(VModuleKey)>; - - using ResolverGetter = - std::function(VModuleKey)>; + using ResourcesGetter = std::function; /// @brief Construct an ObjectLinkingLayer with the given NotifyLoaded, /// and NotifyFinalized functors. RTDyldObjectLinkingLayer( - ExecutionSession &ES, MemoryManagerGetter GetMemMgr, - ResolverGetter GetResolver, + ExecutionSession &ES, ResourcesGetter GetResources, NotifyLoadedFtor NotifyLoaded = NotifyLoadedFtor(), NotifyFinalizedFtor NotifyFinalized = NotifyFinalizedFtor()) - : ES(ES), GetMemMgr(std::move(GetMemMgr)), - GetResolver(std::move(GetResolver)), + : ES(ES), GetResources(std::move(GetResources)), NotifyLoaded(std::move(NotifyLoaded)), NotifyFinalized(std::move(NotifyFinalized)), ProcessAllSections(false) { } @@ -270,9 +267,11 @@ public: assert(!LinkedObjects.count(K) && "VModuleKey already in use"); - LinkedObjects[K] = - createLinkedObject(ES, std::move(Obj), GetMemMgr(K), GetResolver(K), - std::move(Finalizer), ProcessAllSections); + auto R = GetResources(K); + + LinkedObjects[K] = createLinkedObject( + ES, std::move(Obj), std::move(R.MemMgr), std::move(R.Resolver), + std::move(Finalizer), ProcessAllSections); return Error::success(); } @@ -339,8 +338,7 @@ private: ExecutionSession &ES; std::map> LinkedObjects; - MemoryManagerGetter GetMemMgr; - ResolverGetter GetResolver; + ResourcesGetter GetResources; NotifyLoadedFtor NotifyLoaded; NotifyFinalizedFtor NotifyFinalized; bool ProcessAllSections = false; diff --git a/lib/ExecutionEngine/Orc/OrcCBindingsStack.h b/lib/ExecutionEngine/Orc/OrcCBindingsStack.h index 499708e7847..7dc39ebba12 100644 --- a/lib/ExecutionEngine/Orc/OrcCBindingsStack.h +++ b/lib/ExecutionEngine/Orc/OrcCBindingsStack.h @@ -205,16 +205,14 @@ public: : ES(SSP), DL(TM.createDataLayout()), IndirectStubsMgr(IndirectStubsMgrBuilder()), CCMgr(std::move(CCMgr)), ObjectLayer(ES, - [](orc::VModuleKey K) { - return std::make_shared(); - }, [this](orc::VModuleKey K) { auto ResolverI = Resolvers.find(K); assert(ResolverI != Resolvers.end() && "No resolver for module K"); auto Resolver = std::move(ResolverI->second); Resolvers.erase(ResolverI); - return Resolver; + return ObjLayerT::Resources{ + std::make_shared(), Resolver}; }), CompileLayer(ObjectLayer, orc::SimpleCompiler(TM)), CODLayer(ES, CompileLayer, diff --git a/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h b/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h index 579d68b1333..7e412f677db 100644 --- a/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h +++ b/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h @@ -229,9 +229,12 @@ public: Resolver(std::make_shared(*this)), ClientResolver(std::move(ClientResolver)), NotifyObjectLoaded(*this), NotifyFinalized(*this), - ObjectLayer(ES, [this](VModuleKey K) { return this->MemMgr; }, - [this](VModuleKey K) { return this->Resolver; }, - NotifyObjectLoaded, NotifyFinalized), + ObjectLayer( + ES, + [this](VModuleKey K) { + return ObjectLayerT::Resources{this->MemMgr, this->Resolver}; + }, + NotifyObjectLoaded, NotifyFinalized), CompileLayer(ObjectLayer, SimpleCompiler(*this->TM)), LazyEmitLayer(CompileLayer) {} diff --git a/tools/lli/OrcLazyJIT.h b/tools/lli/OrcLazyJIT.h index e07c0a7fae3..6b057c4d293 100644 --- a/tools/lli/OrcLazyJIT.h +++ b/tools/lli/OrcLazyJIT.h @@ -63,16 +63,15 @@ public: : ES(SSP), TM(std::move(TM)), DL(this->TM->createDataLayout()), CCMgr(std::move(CCMgr)), ObjectLayer(ES, - [](orc::VModuleKey) { - return std::make_shared(); - }, - [&](orc::VModuleKey K) { + [this](orc::VModuleKey K) { auto ResolverI = Resolvers.find(K); assert(ResolverI != Resolvers.end() && "Missing resolver for module K"); auto Resolver = std::move(ResolverI->second); Resolvers.erase(ResolverI); - return Resolver; + return ObjLayerT::Resources{ + std::make_shared(), + std::move(Resolver)}; }), CompileLayer(ObjectLayer, orc::SimpleCompiler(*this->TM)), IRDumpLayer(CompileLayer, createDebugDumper()), diff --git a/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp b/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp index 61e5749fa07..3f7d530d57e 100644 --- a/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp +++ b/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp @@ -11,6 +11,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" +#include "llvm/ExecutionEngine/Orc/NullResolver.h" #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" #include "llvm/ExecutionEngine/SectionMemoryManager.h" #include "llvm/Object/ObjectFile.h" @@ -281,12 +282,11 @@ TEST(ObjectTransformLayerTest, Main) { }; // Construct the jit layers. - RTDyldObjectLinkingLayer BaseLayer( - ES, - [](VModuleKey) { return std::make_shared(); }, - [](VModuleKey) -> std::shared_ptr { - llvm_unreachable("Should never be called"); - }); + RTDyldObjectLinkingLayer BaseLayer(ES, [](VModuleKey) { + return RTDyldObjectLinkingLayer::Resources{ + std::make_shared(), + std::make_shared()}; + }); auto IdentityTransform = [](std::shared_ptr> diff --git a/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp b/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp index 9b9bedbecc7..740abedeed9 100644 --- a/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp +++ b/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp @@ -70,9 +70,10 @@ TEST(RTDyldObjectLinkingLayerTest, TestSetProcessAllSections) { SymbolStringPool SSP; ExecutionSession ES(SSP); - RTDyldObjectLinkingLayer ObjLayer( - ES, [&MM](VModuleKey) { return MM; }, - [](orc::VModuleKey) { return std::make_shared(); }); + RTDyldObjectLinkingLayer ObjLayer(ES, [&MM](VModuleKey) { + return RTDyldObjectLinkingLayer::Resources{ + MM, std::make_shared()}; + }); LLVMContext Context; auto M = llvm::make_unique("", Context); @@ -131,15 +132,13 @@ TEST_F(RTDyldObjectLinkingLayerExecutionTest, NoDuplicateFinalization) { std::map> Resolvers; - RTDyldObjectLinkingLayer ObjLayer(ES, [&MM](VModuleKey) { return MM; }, - [&](VModuleKey K) { - auto I = Resolvers.find(K); - assert(I != Resolvers.end() && - "Missing resolver"); - auto R = std::move(I->second); - Resolvers.erase(I); - return R; - }); + RTDyldObjectLinkingLayer ObjLayer(ES, [&](VModuleKey K) { + auto I = Resolvers.find(K); + assert(I != Resolvers.end() && "Missing resolver"); + auto R = std::move(I->second); + Resolvers.erase(I); + return RTDyldObjectLinkingLayer::Resources{MM, std::move(R)}; + }); SimpleCompiler Compile(*TM); // Create a pair of modules that will trigger recursive finalization: @@ -220,9 +219,10 @@ TEST_F(RTDyldObjectLinkingLayerExecutionTest, NoPrematureAllocation) { auto MM = std::make_shared(); - RTDyldObjectLinkingLayer ObjLayer( - ES, [&MM](VModuleKey) { return MM; }, - [](VModuleKey) { return std::make_shared(); }); + RTDyldObjectLinkingLayer ObjLayer(ES, [&MM](VModuleKey K) { + return RTDyldObjectLinkingLayer::Resources{ + MM, std::make_shared()}; + }); SimpleCompiler Compile(*TM); // Create a pair of unrelated modules: @@ -283,8 +283,11 @@ TEST_F(RTDyldObjectLinkingLayerExecutionTest, TestNotifyLoadedSignature) { SymbolStringPool SSP; ExecutionSession ES(SSP); RTDyldObjectLinkingLayer ObjLayer( - ES, [](VModuleKey) { return nullptr; }, - [](VModuleKey) { return std::make_shared(); }, + ES, + [](VModuleKey) { + return RTDyldObjectLinkingLayer::Resources{ + nullptr, std::make_shared()}; + }, [](VModuleKey, const RTDyldObjectLinkingLayer::ObjectPtr &obj, const RuntimeDyld::LoadedObjectInfo &info) {}); }