diff options
author | Lang Hames <lhames@gmail.com> | 2018-10-16 20:13:06 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2018-10-16 20:13:06 +0000 |
commit | 8b94274f22d8c346103c5682e7899e8b43db16d7 (patch) | |
tree | ab087f3142915bbc8d445561570f4ee30385227d /llvm/include/llvm/ExecutionEngine/Orc | |
parent | 4084df00402bc9b69b15b56cbdd8f5f8be81cc0a (diff) | |
download | bcm5719-llvm-8b94274f22d8c346103c5682e7899e8b43db16d7.tar.gz bcm5719-llvm-8b94274f22d8c346103c5682e7899e8b43db16d7.zip |
[ORC] Make the VModuleKey optional, propagate it via MaterializationUnit and
MaterializationResponsibility.
VModuleKeys are intended to enable selective removal of modules from a JIT
session, however for a wide variety of use cases selective removal is not
needed and introduces unnecessary overhead. As of this commit, the default
constructed VModuleKey value is reserved as a "do not track" value, and
becomes the default when adding a new module to the JIT.
This commit also changes the propagation of VModuleKeys. They were passed
alongside the MaterializationResponsibity instance in XXLayer::emit methods,
but are now propagated as part of the MaterializationResponsibility instance
itself (and as part of MaterializationUnit when stored in a JITDylib).
Associating VModuleKeys with MaterializationUnits in this way should allow
for a thread-safe module removal mechanism in the future, even when a module
is in the process of being compiled, by having the
MaterializationResponsibility object check in on its VModuleKey's state
before commiting its results to the JITDylib.
llvm-svn: 344643
Diffstat (limited to 'llvm/include/llvm/ExecutionEngine/Orc')
9 files changed, 47 insertions, 38 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h b/llvm/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h index 7721f74fe0c..884878925cd 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h @@ -94,8 +94,7 @@ public: /// Emits the given module. This should not be called by clients: it will be /// called by the JIT when a definition added via the add method is requested. - void emit(MaterializationResponsibility R, VModuleKey K, - ThreadSafeModule TSM) override; + void emit(MaterializationResponsibility R, ThreadSafeModule TSM) override; private: struct PerDylibResources { diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Core.h b/llvm/include/llvm/ExecutionEngine/Orc/Core.h index 86c5ebb6d27..2e56854340c 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/Core.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Core.h @@ -168,6 +168,9 @@ public: /// into. JITDylib &getTargetJITDylib() const { return JD; } + /// Returns the VModuleKey for this instance. + VModuleKey getVModuleKey() const { return K; } + /// Returns the symbol flags map for this responsibility instance. /// Note: The returned flags may have transient flags (Lazy, Materializing) /// set. These should be stripped with JITSymbolFlags::stripTransientFlags @@ -218,7 +221,8 @@ public: /// Delegates responsibility for the given symbols to the returned /// materialization responsibility. Useful for breaking up work between /// threads, or different kinds of materialization processes. - MaterializationResponsibility delegate(const SymbolNameSet &Symbols); + MaterializationResponsibility delegate(const SymbolNameSet &Symbols, + VModuleKey NewKey = VModuleKey()); void addDependencies(const SymbolStringPtr &Name, const SymbolDependenceMap &Dependencies); @@ -229,10 +233,12 @@ public: private: /// Create a MaterializationResponsibility for the given JITDylib and /// initial symbols. - MaterializationResponsibility(JITDylib &JD, SymbolFlagsMap SymbolFlags); + MaterializationResponsibility(JITDylib &JD, SymbolFlagsMap SymbolFlags, + VModuleKey K); JITDylib &JD; SymbolFlagsMap SymbolFlags; + VModuleKey K; }; /// A MaterializationUnit represents a set of symbol definitions that can @@ -245,8 +251,8 @@ private: /// stronger definition is added or already present. class MaterializationUnit { public: - MaterializationUnit(SymbolFlagsMap InitalSymbolFlags) - : SymbolFlags(std::move(InitalSymbolFlags)) {} + MaterializationUnit(SymbolFlagsMap InitalSymbolFlags, VModuleKey K) + : SymbolFlags(std::move(InitalSymbolFlags)), K(std::move(K)) {} virtual ~MaterializationUnit() {} @@ -261,7 +267,8 @@ public: /// ExecutionSession::DispatchMaterializationFunction) to trigger /// materialization of this MaterializationUnit. void doMaterialize(JITDylib &JD) { - materialize(MaterializationResponsibility(JD, std::move(SymbolFlags))); + materialize(MaterializationResponsibility(JD, std::move(SymbolFlags), + std::move(K))); } /// Called by JITDylibs to notify MaterializationUnits that the given symbol @@ -273,6 +280,7 @@ public: protected: SymbolFlagsMap SymbolFlags; + VModuleKey K; private: virtual void anchor(); @@ -298,7 +306,7 @@ using MaterializationUnitList = /// materialized. class AbsoluteSymbolsMaterializationUnit : public MaterializationUnit { public: - AbsoluteSymbolsMaterializationUnit(SymbolMap Symbols); + AbsoluteSymbolsMaterializationUnit(SymbolMap Symbols, VModuleKey K); StringRef getName() const override; @@ -321,9 +329,9 @@ private: /// \endcode /// inline std::unique_ptr<AbsoluteSymbolsMaterializationUnit> -absoluteSymbols(SymbolMap Symbols) { +absoluteSymbols(SymbolMap Symbols, VModuleKey K = VModuleKey()) { return llvm::make_unique<AbsoluteSymbolsMaterializationUnit>( - std::move(Symbols)); + std::move(Symbols), std::move(K)); } struct SymbolAliasMapEntry { @@ -349,7 +357,8 @@ public: /// Note: Care must be taken that no sets of aliases form a cycle, as such /// a cycle will result in a deadlock when any symbol in the cycle is /// resolved. - ReExportsMaterializationUnit(JITDylib *SourceJD, SymbolAliasMap Aliases); + ReExportsMaterializationUnit(JITDylib *SourceJD, SymbolAliasMap Aliases, + VModuleKey K); StringRef getName() const override; @@ -374,17 +383,18 @@ private: /// return Err; /// \endcode inline std::unique_ptr<ReExportsMaterializationUnit> -symbolAliases(SymbolAliasMap Aliases) { - return llvm::make_unique<ReExportsMaterializationUnit>(nullptr, - std::move(Aliases)); +symbolAliases(SymbolAliasMap Aliases, VModuleKey K = VModuleKey()) { + return llvm::make_unique<ReExportsMaterializationUnit>( + nullptr, std::move(Aliases), std::move(K)); } /// Create a materialization unit for re-exporting symbols from another JITDylib /// with alternative names/flags. inline std::unique_ptr<ReExportsMaterializationUnit> -reexports(JITDylib &SourceJD, SymbolAliasMap Aliases) { - return llvm::make_unique<ReExportsMaterializationUnit>(&SourceJD, - std::move(Aliases)); +reexports(JITDylib &SourceJD, SymbolAliasMap Aliases, + VModuleKey K = VModuleKey()) { + return llvm::make_unique<ReExportsMaterializationUnit>( + &SourceJD, std::move(Aliases), std::move(K)); } /// Build a SymbolAliasMap for the common case where you want to re-export diff --git a/llvm/include/llvm/ExecutionEngine/Orc/IRCompileLayer.h b/llvm/include/llvm/ExecutionEngine/Orc/IRCompileLayer.h index a62d8be2fa6..30d71e69cd7 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/IRCompileLayer.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/IRCompileLayer.h @@ -41,8 +41,7 @@ public: void setNotifyCompiled(NotifyCompiledFunction NotifyCompiled); - void emit(MaterializationResponsibility R, VModuleKey K, - ThreadSafeModule TSM) override; + void emit(MaterializationResponsibility R, ThreadSafeModule TSM) override; private: mutable std::mutex IRLayerMutex; diff --git a/llvm/include/llvm/ExecutionEngine/Orc/IRTransformLayer.h b/llvm/include/llvm/ExecutionEngine/Orc/IRTransformLayer.h index 55a1ce4c930..49e65b9f2a8 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/IRTransformLayer.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/IRTransformLayer.h @@ -35,8 +35,7 @@ public: this->Transform = std::move(Transform); } - void emit(MaterializationResponsibility R, VModuleKey K, - ThreadSafeModule TSM) override; + void emit(MaterializationResponsibility R, ThreadSafeModule TSM) override; static ThreadSafeModule identityTransform(ThreadSafeModule TSM, diff --git a/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h b/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h index 05a566fedb6..8b6465e1f02 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h @@ -111,8 +111,6 @@ protected: LLJIT(std::unique_ptr<ExecutionSession> ES, JITTargetMachineBuilder JTMB, DataLayout DL, unsigned NumCompileThreads); - std::unique_ptr<RuntimeDyld::MemoryManager> getMemoryManager(VModuleKey K); - std::string mangle(StringRef UnmangledName); Error applyDataLayout(Module &M); diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Layer.h b/llvm/include/llvm/ExecutionEngine/Orc/Layer.h index be5d9653dd8..cd797445a2e 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/Layer.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Layer.h @@ -49,11 +49,11 @@ public: /// Adds a MaterializationUnit representing the given IR to the given /// JITDylib. - virtual Error add(JITDylib &JD, VModuleKey K, ThreadSafeModule TSM); + virtual Error add(JITDylib &JD, ThreadSafeModule TSM, + VModuleKey K = VModuleKey()); /// Emit should materialize the given IR. - virtual void emit(MaterializationResponsibility R, VModuleKey K, - ThreadSafeModule TSM) = 0; + virtual void emit(MaterializationResponsibility R, ThreadSafeModule TSM) = 0; private: bool CloneToNewContextOnEmit = false; @@ -70,14 +70,16 @@ public: /// Create an IRMaterializationLayer. Scans the module to build the /// SymbolFlags and SymbolToDefinition maps. - IRMaterializationUnit(ExecutionSession &ES, ThreadSafeModule TSM); + IRMaterializationUnit(ExecutionSession &ES, ThreadSafeModule TSM, + VModuleKey K); /// Create an IRMaterializationLayer from a module, and pre-existing /// SymbolFlags and SymbolToDefinition maps. The maps must provide /// entries for each definition in M. /// This constructor is useful for delegating work from one /// IRMaterializationUnit to another. - IRMaterializationUnit(ThreadSafeModule TSM, SymbolFlagsMap SymbolFlags, + IRMaterializationUnit(ThreadSafeModule TSM, VModuleKey K, + SymbolFlagsMap SymbolFlags, SymbolNameToDefinitionMap SymbolToDefinition); /// Return the ModuleIdentifier as the name for this MaterializationUnit. @@ -119,10 +121,11 @@ public: /// Adds a MaterializationUnit representing the given IR to the given /// JITDylib. - virtual Error add(JITDylib &JD, VModuleKey K, std::unique_ptr<MemoryBuffer> O); + virtual Error add(JITDylib &JD, std::unique_ptr<MemoryBuffer> O, + VModuleKey K = VModuleKey()); /// Emit should materialize the given IR. - virtual void emit(MaterializationResponsibility R, VModuleKey K, + virtual void emit(MaterializationResponsibility R, std::unique_ptr<MemoryBuffer> O) = 0; private: @@ -149,7 +152,6 @@ private: void discard(const JITDylib &JD, const SymbolStringPtr &Name) override; ObjectLayer &L; - VModuleKey K; std::unique_ptr<MemoryBuffer> O; }; diff --git a/llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h b/llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h index 8f897009ac2..b5041325bce 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h @@ -159,7 +159,8 @@ public: LazyReexportsMaterializationUnit(LazyCallThroughManager &LCTManager, IndirectStubsManager &ISManager, JITDylib &SourceJD, - SymbolAliasMap CallableAliases); + SymbolAliasMap CallableAliases, + VModuleKey K); StringRef getName() const override; @@ -182,9 +183,10 @@ private: inline std::unique_ptr<LazyReexportsMaterializationUnit> lazyReexports(LazyCallThroughManager &LCTManager, IndirectStubsManager &ISManager, JITDylib &SourceJD, - SymbolAliasMap CallableAliases) { + SymbolAliasMap CallableAliases, VModuleKey K = VModuleKey()) { return llvm::make_unique<LazyReexportsMaterializationUnit>( - LCTManager, ISManager, SourceJD, std::move(CallableAliases)); + LCTManager, ISManager, SourceJD, std::move(CallableAliases), + std::move(K)); } } // End namespace orc diff --git a/llvm/include/llvm/ExecutionEngine/Orc/ObjectTransformLayer.h b/llvm/include/llvm/ExecutionEngine/Orc/ObjectTransformLayer.h index 6cd688ad58a..44d6b490e19 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/ObjectTransformLayer.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/ObjectTransformLayer.h @@ -32,7 +32,7 @@ public: ObjectTransformLayer(ExecutionSession &ES, ObjectLayer &BaseLayer, TransformFunction Transform); - void emit(MaterializationResponsibility R, VModuleKey K, + void emit(MaterializationResponsibility R, std::unique_ptr<MemoryBuffer> O) override; private: diff --git a/llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h b/llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h index bbd782fdece..401f6e3fa81 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h @@ -47,7 +47,7 @@ public: using NotifyEmittedFunction = std::function<void(VModuleKey)>; using GetMemoryManagerFunction = - std::function<std::unique_ptr<RuntimeDyld::MemoryManager>(VModuleKey)>; + std::function<std::unique_ptr<RuntimeDyld::MemoryManager>()>; /// Construct an ObjectLinkingLayer with the given NotifyLoaded, /// and NotifyEmitted functors. @@ -57,7 +57,7 @@ public: NotifyEmittedFunction NotifyEmitted = NotifyEmittedFunction()); /// Emit the object. - void emit(MaterializationResponsibility R, VModuleKey K, + void emit(MaterializationResponsibility R, std::unique_ptr<MemoryBuffer> O) override; /// Set the 'ProcessAllSections' flag. @@ -118,7 +118,7 @@ private: bool ProcessAllSections = false; bool OverrideObjectFlags = false; bool AutoClaimObjectSymbols = false; - std::map<VModuleKey, std::shared_ptr<RuntimeDyld::MemoryManager>> MemMgrs; + std::vector<std::unique_ptr<RuntimeDyld::MemoryManager>> MemMgrs; }; class LegacyRTDyldObjectLinkingLayerBase { |