diff options
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/CompileOnDemandLayer.cpp | 20 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/Core.cpp | 25 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/IRCompileLayer.cpp | 8 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/IRTransformLayer.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp | 8 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/LLJIT.cpp | 24 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/Layer.cpp | 27 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/ObjectTransformLayer.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp | 15 |
10 files changed, 70 insertions, 71 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/CompileOnDemandLayer.cpp b/llvm/lib/ExecutionEngine/Orc/CompileOnDemandLayer.cpp index f27a814f33f..de1fa079dde 100644 --- a/llvm/lib/ExecutionEngine/Orc/CompileOnDemandLayer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/CompileOnDemandLayer.cpp @@ -68,14 +68,16 @@ namespace orc { class PartitioningIRMaterializationUnit : public IRMaterializationUnit { public: PartitioningIRMaterializationUnit(ExecutionSession &ES, ThreadSafeModule TSM, - CompileOnDemandLayer &Parent) - : IRMaterializationUnit(ES, std::move(TSM)), Parent(Parent) {} + VModuleKey K, CompileOnDemandLayer &Parent) + : IRMaterializationUnit(ES, std::move(TSM), std::move(K)), + Parent(Parent) {} PartitioningIRMaterializationUnit( ThreadSafeModule TSM, SymbolFlagsMap SymbolFlags, SymbolNameToDefinitionMap SymbolToDefinition, CompileOnDemandLayer &Parent) - : IRMaterializationUnit(std::move(TSM), std::move(SymbolFlags), + : IRMaterializationUnit(std::move(TSM), std::move(K), + std::move(SymbolFlags), std::move(SymbolToDefinition)), Parent(Parent) {} @@ -116,8 +118,8 @@ void CompileOnDemandLayer::setPartitionFunction(PartitionFunction Partition) { this->Partition = std::move(Partition); } -void CompileOnDemandLayer::emit(MaterializationResponsibility R, VModuleKey K, - ThreadSafeModule TSM) { +void CompileOnDemandLayer::emit(MaterializationResponsibility R, + ThreadSafeModule TSM) { assert(TSM.getModule() && "Null module"); auto &ES = getExecutionSession(); @@ -149,7 +151,7 @@ void CompileOnDemandLayer::emit(MaterializationResponsibility R, VModuleKey K, // implementation dylib. if (auto Err = PDR.getImplDylib().define( llvm::make_unique<PartitioningIRMaterializationUnit>( - ES, std::move(TSM), *this))) { + ES, std::move(TSM), R.getVModuleKey(), *this))) { ES.reportError(std::move(Err)); R.failMaterialization(); return; @@ -245,7 +247,7 @@ void CompileOnDemandLayer::emitPartition( // unmodified to the base layer. if (GVsToExtract == None) { Defs.clear(); - BaseLayer.emit(std::move(R), ES.allocateVModule(), std::move(TSM)); + BaseLayer.emit(std::move(R), std::move(TSM)); return; } @@ -285,9 +287,9 @@ void CompileOnDemandLayer::emitPartition( auto ExtractedTSM = extractSubModule(TSM, ".submodule", ShouldExtract); R.replace(llvm::make_unique<PartitioningIRMaterializationUnit>( - ES, std::move(TSM), *this)); + ES, std::move(TSM), R.getVModuleKey(), *this)); - BaseLayer.emit(std::move(R), ES.allocateVModule(), std::move(ExtractedTSM)); + BaseLayer.emit(std::move(R), std::move(ExtractedTSM)); } } // end namespace orc diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp index d477ca523d8..5e31e448c7d 100644 --- a/llvm/lib/ExecutionEngine/Orc/Core.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp @@ -368,8 +368,8 @@ void AsynchronousSymbolQuery::detach() { } MaterializationResponsibility::MaterializationResponsibility( - JITDylib &JD, SymbolFlagsMap SymbolFlags) - : JD(JD), SymbolFlags(std::move(SymbolFlags)) { + JITDylib &JD, SymbolFlagsMap SymbolFlags, VModuleKey K) + : JD(JD), SymbolFlags(std::move(SymbolFlags)), K(std::move(K)) { assert(!this->SymbolFlags.empty() && "Materializing nothing?"); #ifndef NDEBUG @@ -461,7 +461,12 @@ void MaterializationResponsibility::replace( } MaterializationResponsibility -MaterializationResponsibility::delegate(const SymbolNameSet &Symbols) { +MaterializationResponsibility::delegate(const SymbolNameSet &Symbols, + VModuleKey NewKey) { + + if (NewKey == VModuleKey()) + NewKey = K; + SymbolFlagsMap DelegatedFlags; for (auto &Name : Symbols) { @@ -474,7 +479,8 @@ MaterializationResponsibility::delegate(const SymbolNameSet &Symbols) { SymbolFlags.erase(I); } - return MaterializationResponsibility(JD, std::move(DelegatedFlags)); + return MaterializationResponsibility(JD, std::move(DelegatedFlags), + std::move(NewKey)); } void MaterializationResponsibility::addDependencies( @@ -491,8 +497,9 @@ void MaterializationResponsibility::addDependenciesForAll( } AbsoluteSymbolsMaterializationUnit::AbsoluteSymbolsMaterializationUnit( - SymbolMap Symbols) - : MaterializationUnit(extractFlags(Symbols)), Symbols(std::move(Symbols)) {} + SymbolMap Symbols, VModuleKey K) + : MaterializationUnit(extractFlags(Symbols), std::move(K)), + Symbols(std::move(Symbols)) {} StringRef AbsoluteSymbolsMaterializationUnit::getName() const { return "<Absolute Symbols>"; @@ -519,9 +526,9 @@ AbsoluteSymbolsMaterializationUnit::extractFlags(const SymbolMap &Symbols) { } ReExportsMaterializationUnit::ReExportsMaterializationUnit( - JITDylib *SourceJD, SymbolAliasMap Aliases) - : MaterializationUnit(extractFlags(Aliases)), SourceJD(SourceJD), - Aliases(std::move(Aliases)) {} + JITDylib *SourceJD, SymbolAliasMap Aliases, VModuleKey K) + : MaterializationUnit(extractFlags(Aliases), std::move(K)), + SourceJD(SourceJD), Aliases(std::move(Aliases)) {} StringRef ReExportsMaterializationUnit::getName() const { return "<Reexports>"; diff --git a/llvm/lib/ExecutionEngine/Orc/IRCompileLayer.cpp b/llvm/lib/ExecutionEngine/Orc/IRCompileLayer.cpp index 6d029e16ba9..d952d1be70d 100644 --- a/llvm/lib/ExecutionEngine/Orc/IRCompileLayer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/IRCompileLayer.cpp @@ -21,19 +21,19 @@ void IRCompileLayer::setNotifyCompiled(NotifyCompiledFunction NotifyCompiled) { this->NotifyCompiled = std::move(NotifyCompiled); } -void IRCompileLayer::emit(MaterializationResponsibility R, VModuleKey K, - ThreadSafeModule TSM) { +void IRCompileLayer::emit(MaterializationResponsibility R, + ThreadSafeModule TSM) { assert(TSM.getModule() && "Module must not be null"); if (auto Obj = Compile(*TSM.getModule())) { { std::lock_guard<std::mutex> Lock(IRLayerMutex); if (NotifyCompiled) - NotifyCompiled(K, std::move(TSM)); + NotifyCompiled(R.getVModuleKey(), std::move(TSM)); else TSM = ThreadSafeModule(); } - BaseLayer.emit(std::move(R), std::move(K), std::move(*Obj)); + BaseLayer.emit(std::move(R), std::move(*Obj)); } else { R.failMaterialization(); getExecutionSession().reportError(Obj.takeError()); diff --git a/llvm/lib/ExecutionEngine/Orc/IRTransformLayer.cpp b/llvm/lib/ExecutionEngine/Orc/IRTransformLayer.cpp index acba7916d40..7bc0d696e3a 100644 --- a/llvm/lib/ExecutionEngine/Orc/IRTransformLayer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/IRTransformLayer.cpp @@ -18,12 +18,12 @@ IRTransformLayer::IRTransformLayer(ExecutionSession &ES, TransformFunction Transform) : IRLayer(ES), BaseLayer(BaseLayer), Transform(std::move(Transform)) {} -void IRTransformLayer::emit(MaterializationResponsibility R, VModuleKey K, - ThreadSafeModule TSM) { +void IRTransformLayer::emit(MaterializationResponsibility R, + ThreadSafeModule TSM) { assert(TSM.getModule() && "Module must not be null"); if (auto TransformedTSM = Transform(std::move(TSM), R)) - BaseLayer.emit(std::move(R), std::move(K), std::move(*TransformedTSM)); + BaseLayer.emit(std::move(R), std::move(*TransformedTSM)); else { R.failMaterialization(); getExecutionSession().reportError(TransformedTSM.takeError()); diff --git a/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp b/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp index 6bc33c90cbc..c10d15ab117 100644 --- a/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp +++ b/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp @@ -27,8 +27,9 @@ public: using CompileFunction = JITCompileCallbackManager::CompileFunction; CompileCallbackMaterializationUnit(SymbolStringPtr Name, - CompileFunction Compile) - : MaterializationUnit(SymbolFlagsMap({{Name, JITSymbolFlags::Exported}})), + CompileFunction Compile, VModuleKey K) + : MaterializationUnit(SymbolFlagsMap({{Name, JITSymbolFlags::Exported}}), + std::move(K)), Name(std::move(Name)), Compile(std::move(Compile)) {} StringRef getName() const override { return "<Compile Callbacks>"; } @@ -67,7 +68,8 @@ JITCompileCallbackManager::getCompileCallback(CompileFunction Compile) { AddrToSymbol[*TrampolineAddr] = CallbackName; cantFail(CallbacksJD.define( llvm::make_unique<CompileCallbackMaterializationUnit>( - std::move(CallbackName), std::move(Compile)))); + std::move(CallbackName), std::move(Compile), + ES.allocateVModule()))); return *TrampolineAddr; } else return TrampolineAddr.takeError(); diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp index e464da267ae..ac71a5e7673 100644 --- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp +++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp @@ -65,15 +65,13 @@ Error LLJIT::addIRModule(JITDylib &JD, ThreadSafeModule TSM) { if (auto Err = applyDataLayout(*TSM.getModule())) return Err; - auto K = ES->allocateVModule(); - return CompileLayer.add(JD, K, std::move(TSM)); + return CompileLayer.add(JD, std::move(TSM), ES->allocateVModule()); } Error LLJIT::addObjectFile(JITDylib &JD, std::unique_ptr<MemoryBuffer> Obj) { assert(Obj && "Can not add null object"); - auto K = ES->allocateVModule(); - return ObjLinkingLayer.add(JD, K, std::move(Obj)); + return ObjLinkingLayer.add(JD, std::move(Obj), ES->allocateVModule()); } Expected<JITEvaluatedSymbol> LLJIT::lookupLinkerMangled(JITDylib &JD, @@ -84,8 +82,9 @@ Expected<JITEvaluatedSymbol> LLJIT::lookupLinkerMangled(JITDylib &JD, LLJIT::LLJIT(std::unique_ptr<ExecutionSession> ES, std::unique_ptr<TargetMachine> TM, DataLayout DL) : ES(std::move(ES)), Main(this->ES->getMainJITDylib()), DL(std::move(DL)), - ObjLinkingLayer(*this->ES, - [this](VModuleKey K) { return getMemoryManager(K); }), + ObjLinkingLayer( + *this->ES, + []() { return llvm::make_unique<SectionMemoryManager>(); }), CompileLayer(*this->ES, ObjLinkingLayer, TMOwningSimpleCompiler(std::move(TM))), CtorRunner(Main), DtorRunner(Main) {} @@ -93,8 +92,9 @@ LLJIT::LLJIT(std::unique_ptr<ExecutionSession> ES, LLJIT::LLJIT(std::unique_ptr<ExecutionSession> ES, JITTargetMachineBuilder JTMB, DataLayout DL, unsigned NumCompileThreads) : ES(std::move(ES)), Main(this->ES->getMainJITDylib()), DL(std::move(DL)), - ObjLinkingLayer(*this->ES, - [this](VModuleKey K) { return getMemoryManager(K); }), + ObjLinkingLayer( + *this->ES, + []() { return llvm::make_unique<SectionMemoryManager>(); }), CompileLayer(*this->ES, ObjLinkingLayer, ConcurrentIRCompiler(std::move(JTMB))), CtorRunner(Main), DtorRunner(Main) { @@ -117,11 +117,6 @@ LLJIT::LLJIT(std::unique_ptr<ExecutionSession> ES, JITTargetMachineBuilder JTMB, }); } -std::unique_ptr<RuntimeDyld::MemoryManager> -LLJIT::getMemoryManager(VModuleKey K) { - return llvm::make_unique<SectionMemoryManager>(); -} - std::string LLJIT::mangle(StringRef UnmangledName) { std::string MangledName; { @@ -187,8 +182,7 @@ Error LLLazyJIT::addLazyIRModule(JITDylib &JD, ThreadSafeModule TSM) { recordCtorDtors(*TSM.getModule()); - auto K = ES->allocateVModule(); - return CODLayer.add(JD, K, std::move(TSM)); + return CODLayer.add(JD, std::move(TSM), ES->allocateVModule()); } LLLazyJIT::LLLazyJIT( diff --git a/llvm/lib/ExecutionEngine/Orc/Layer.cpp b/llvm/lib/ExecutionEngine/Orc/Layer.cpp index 22dbf5c26d1..11af76825e9 100644 --- a/llvm/lib/ExecutionEngine/Orc/Layer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Layer.cpp @@ -19,14 +19,14 @@ namespace orc { IRLayer::IRLayer(ExecutionSession &ES) : ES(ES) {} IRLayer::~IRLayer() {} -Error IRLayer::add(JITDylib &JD, VModuleKey K, ThreadSafeModule TSM) { +Error IRLayer::add(JITDylib &JD, ThreadSafeModule TSM, VModuleKey K) { return JD.define(llvm::make_unique<BasicIRLayerMaterializationUnit>( *this, std::move(K), std::move(TSM))); } IRMaterializationUnit::IRMaterializationUnit(ExecutionSession &ES, - ThreadSafeModule TSM) - : MaterializationUnit(SymbolFlagsMap()), TSM(std::move(TSM)) { + ThreadSafeModule TSM, VModuleKey K) + : MaterializationUnit(SymbolFlagsMap(), std::move(K)), TSM(std::move(TSM)) { assert(this->TSM && "Module must not be null"); @@ -42,10 +42,10 @@ IRMaterializationUnit::IRMaterializationUnit(ExecutionSession &ES, } IRMaterializationUnit::IRMaterializationUnit( - ThreadSafeModule TSM, SymbolFlagsMap SymbolFlags, + ThreadSafeModule TSM, VModuleKey K, SymbolFlagsMap SymbolFlags, SymbolNameToDefinitionMap SymbolToDefinition) - : MaterializationUnit(std::move(SymbolFlags)), TSM(std::move(TSM)), - SymbolToDefinition(std::move(SymbolToDefinition)) {} + : MaterializationUnit(std::move(SymbolFlags), std::move(K)), + TSM(std::move(TSM)), SymbolToDefinition(std::move(SymbolToDefinition)) {} StringRef IRMaterializationUnit::getName() const { if (TSM.getModule()) @@ -71,8 +71,9 @@ void IRMaterializationUnit::discard(const JITDylib &JD, BasicIRLayerMaterializationUnit::BasicIRLayerMaterializationUnit( IRLayer &L, VModuleKey K, ThreadSafeModule TSM) - : IRMaterializationUnit(L.getExecutionSession(), std::move(TSM)), L(L), - K(std::move(K)) {} + : IRMaterializationUnit(L.getExecutionSession(), std::move(TSM), + std::move(K)), + L(L), K(std::move(K)) {} void BasicIRLayerMaterializationUnit::materialize( MaterializationResponsibility R) { @@ -94,7 +95,7 @@ void BasicIRLayerMaterializationUnit::materialize( dbgs() << "Emitting, for " << R.getTargetJITDylib().getName() << ", " << *this << "\n"; });); - L.emit(std::move(R), std::move(K), std::move(TSM)); + L.emit(std::move(R), std::move(TSM)); LLVM_DEBUG(ES.runSessionLocked([&]() { dbgs() << "Finished emitting, for " << R.getTargetJITDylib().getName() << ", " << *this << "\n"; @@ -105,8 +106,8 @@ ObjectLayer::ObjectLayer(ExecutionSession &ES) : ES(ES) {} ObjectLayer::~ObjectLayer() {} -Error ObjectLayer::add(JITDylib &JD, VModuleKey K, - std::unique_ptr<MemoryBuffer> O) { +Error ObjectLayer::add(JITDylib &JD, std::unique_ptr<MemoryBuffer> O, + VModuleKey K) { auto ObjMU = BasicObjectLayerMaterializationUnit::Create(*this, std::move(K), std::move(O)); if (!ObjMU) @@ -131,7 +132,7 @@ BasicObjectLayerMaterializationUnit::Create(ObjectLayer &L, VModuleKey K, BasicObjectLayerMaterializationUnit::BasicObjectLayerMaterializationUnit( ObjectLayer &L, VModuleKey K, std::unique_ptr<MemoryBuffer> O, SymbolFlagsMap SymbolFlags) - : MaterializationUnit(std::move(SymbolFlags)), L(L), K(std::move(K)), + : MaterializationUnit(std::move(SymbolFlags), std::move(K)), L(L), O(std::move(O)) {} StringRef BasicObjectLayerMaterializationUnit::getName() const { @@ -142,7 +143,7 @@ StringRef BasicObjectLayerMaterializationUnit::getName() const { void BasicObjectLayerMaterializationUnit::materialize( MaterializationResponsibility R) { - L.emit(std::move(R), std::move(K), std::move(O)); + L.emit(std::move(R), std::move(O)); } void BasicObjectLayerMaterializationUnit::discard(const JITDylib &JD, diff --git a/llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp b/llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp index 1cce0c6cd2c..af4c508d7f1 100644 --- a/llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp +++ b/llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp @@ -125,8 +125,8 @@ createLocalLazyCallThroughManager(const Triple &T, ExecutionSession &ES, LazyReexportsMaterializationUnit::LazyReexportsMaterializationUnit( LazyCallThroughManager &LCTManager, IndirectStubsManager &ISManager, - JITDylib &SourceJD, SymbolAliasMap CallableAliases) - : MaterializationUnit(extractFlags(CallableAliases)), + JITDylib &SourceJD, SymbolAliasMap CallableAliases, VModuleKey K) + : MaterializationUnit(extractFlags(CallableAliases), std::move(K)), LCTManager(LCTManager), ISManager(ISManager), SourceJD(SourceJD), CallableAliases(std::move(CallableAliases)), NotifyResolved(LazyCallThroughManager::createNotifyResolvedFunction( diff --git a/llvm/lib/ExecutionEngine/Orc/ObjectTransformLayer.cpp b/llvm/lib/ExecutionEngine/Orc/ObjectTransformLayer.cpp index 0be23f2e1a4..825f5320473 100644 --- a/llvm/lib/ExecutionEngine/Orc/ObjectTransformLayer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/ObjectTransformLayer.cpp @@ -18,12 +18,12 @@ ObjectTransformLayer::ObjectTransformLayer(ExecutionSession &ES, TransformFunction Transform) : ObjectLayer(ES), BaseLayer(BaseLayer), Transform(std::move(Transform)) {} -void ObjectTransformLayer::emit(MaterializationResponsibility R, VModuleKey K, +void ObjectTransformLayer::emit(MaterializationResponsibility R, std::unique_ptr<MemoryBuffer> O) { assert(O && "Module must not be null"); if (auto TransformedObj = Transform(std::move(O))) - BaseLayer.emit(std::move(R), std::move(K), std::move(*TransformedObj)); + BaseLayer.emit(std::move(R), std::move(*TransformedObj)); else { R.failMaterialization(); getExecutionSession().reportError(TransformedObj.takeError()); diff --git a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp index fa574140d48..8511e41c4f2 100644 --- a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp @@ -84,8 +84,7 @@ RTDyldObjectLinkingLayer::RTDyldObjectLinkingLayer( NotifyEmitted(std::move(NotifyEmitted)) {} void RTDyldObjectLinkingLayer::emit(MaterializationResponsibility R, - VModuleKey K, - std::unique_ptr<MemoryBuffer> O) { + std::unique_ptr<MemoryBuffer> O) { assert(O && "Object must not be null"); // This method launches an asynchronous link step that will fulfill our @@ -121,15 +120,9 @@ void RTDyldObjectLinkingLayer::emit(MaterializationResponsibility R, } } - auto MemoryManager = GetMemoryManager(K); - auto &MemMgr = *MemoryManager; - { - std::lock_guard<std::mutex> Lock(RTDyldLayerMutex); - - assert(!MemMgrs.count(K) && - "A memory manager already exists for this key?"); - MemMgrs[K] = std::move(MemoryManager); - } + auto K = R.getVModuleKey(); + MemMgrs.push_back(GetMemoryManager()); + auto &MemMgr = *MemMgrs.back(); JITDylibSearchOrderResolver Resolver(*SharedR); |