diff --git a/include/llvm/ExecutionEngine/Orc/IRCompileLayer.h b/include/llvm/ExecutionEngine/Orc/IRCompileLayer.h index 873deb67376..19f55e9551c 100644 --- a/include/llvm/ExecutionEngine/Orc/IRCompileLayer.h +++ b/include/llvm/ExecutionEngine/Orc/IRCompileLayer.h @@ -111,6 +111,13 @@ public: return BaseLayer.findSymbolIn(H, Name, ExportedSymbolsOnly); } + /// @brief Immediately emit and finalize the moduleOB set represented by the + /// given handle. + /// @param H Handle for module set to emit/finalize. + void emitAndFinalize(ModuleSetHandleT H) { + BaseLayer.emitAndFinalize(H); + } + private: object::OwningBinary tryToLoadFromObjectCache(const Module &M) { diff --git a/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h b/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h index 073fcb87be5..9579cd35cad 100644 --- a/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h +++ b/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h @@ -53,7 +53,7 @@ private: return 0; else if (this->EmitState == NotEmitted) { this->EmitState = Emitting; - Handle = this->emit(B); + Handle = this->emitToBaseLayer(B); this->EmitState = Emitted; } return B.findSymbolIn(Handle, PName, ExportedSymbolsOnly) @@ -78,6 +78,17 @@ private: BaseLayer.removeModuleSet(Handle); } + void emitAndFinalize(BaseLayerT &BaseLayer) { + assert(EmitState != Emitting && + "Cannot emitAndFinalize while already emitting"); + if (EmitState == NotEmitted) { + EmitState = Emitting; + Handle = emitToBaseLayer(BaseLayer); + EmitState = Emitted; + } + BaseLayer.emitAndFinalize(Handle); + } + template static std::unique_ptr create(BaseLayerT &B, ModuleSetT Ms, @@ -85,7 +96,7 @@ private: protected: virtual bool provides(StringRef Name, bool ExportedSymbolsOnly) const = 0; - virtual BaseLayerHandleT emit(BaseLayerT &BaseLayer) = 0; + virtual BaseLayerHandleT emitToBaseLayer(BaseLayerT &BaseLayer) = 0; private: enum { NotEmitted, Emitting, Emitted } EmitState; @@ -100,7 +111,8 @@ private: : Ms(std::move(Ms)), MM(std::move(MM)) {} protected: - BaseLayerHandleT emit(BaseLayerT &BaseLayer) override { + + BaseLayerHandleT emitToBaseLayer(BaseLayerT &BaseLayer) override { // We don't need the mangled names set any more: Once we've emitted this // to the base layer we'll just look for symbols there. MangledNames.reset(); @@ -243,6 +255,14 @@ public: bool ExportedSymbolsOnly) { return (*H)->find(Name, ExportedSymbolsOnly, BaseLayer); } + + /// @brief Immediately emit and finalize the moduleOB set represented by the + /// given handle. + /// @param H Handle for module set to emit/finalize. + void emitAndFinalize(ModuleSetHandleT H) { + (*H)->emitAndFinalize(BaseLayer); + } + }; template diff --git a/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h b/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h index f64a1d1521e..4dcb3808dab 100644 --- a/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h +++ b/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h @@ -178,12 +178,6 @@ public: return Handle; } - /// @brief Map section addresses for the objects associated with the handle H. - void mapSectionAddress(ObjSetHandleT H, const void *LocalAddress, - TargetAddress TargetAddr) { - H->mapSectionAddress(LocalAddress, TargetAddr); - } - /// @brief Remove the set of objects associated with handle H. /// /// All memory allocated for the objects will be freed, and the sections and @@ -233,6 +227,21 @@ public: return nullptr; } + /// @brief Map section addresses for the objects associated with the handle H. + void mapSectionAddress(ObjSetHandleT H, const void *LocalAddress, + TargetAddress TargetAddr) { + H->mapSectionAddress(LocalAddress, TargetAddr); + } + + /// @brief Immediately emit and finalize the object set represented by the + /// given handle. + /// @param H Handle for object set to emit/finalize. + void emitAndFinalize(ObjSetHandleT H) { + H->Finalize(); + if (NotifyFinalized) + NotifyFinalized(H); + } + private: LinkedObjectSetListT LinkedObjSetList; NotifyLoadedFtor NotifyLoaded;