diff options
| author | Lang Hames <lhames@gmail.com> | 2018-03-15 00:30:14 +0000 |
|---|---|---|
| committer | Lang Hames <lhames@gmail.com> | 2018-03-15 00:30:14 +0000 |
| commit | 5721ee48a2a8f9202a21936747090115c9abf584 (patch) | |
| tree | 7a49d8303b9cadb83667aa72d53d4b151ca1e414 /llvm/lib/ExecutionEngine | |
| parent | f4a0e9a78c46e9b59c6e549e465dfbbbd93475d9 (diff) | |
| download | bcm5719-llvm-5721ee48a2a8f9202a21936747090115c9abf584.tar.gz bcm5719-llvm-5721ee48a2a8f9202a21936747090115c9abf584.zip | |
[ORC] Re-apply r327566 with a fix for test-global-ctors.ll.
Also clang-formats the patch, which I should have done the first time around.
llvm-svn: 327594
Diffstat (limited to 'llvm/lib/ExecutionEngine')
| -rw-r--r-- | llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp | 24 | ||||
| -rw-r--r-- | llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h | 8 | ||||
| -rw-r--r-- | llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.cpp | 9 | ||||
| -rw-r--r-- | llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h | 73 |
5 files changed, 69 insertions, 47 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp b/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp index b7220dba88e..f6e6ed66ef9 100644 --- a/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp +++ b/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp @@ -67,7 +67,7 @@ CtorDtorIterator::Element CtorDtorIterator::operator*() const { } ConstantInt *Priority = dyn_cast<ConstantInt>(CS->getOperand(0)); - Value *Data = CS->getOperand(2); + Value *Data = CS->getNumOperands() == 3 ? CS->getOperand(2) : nullptr; return Element(Priority->getZExtValue(), Func, Data); } diff --git a/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp b/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp index f945acaf95e..0ea7a663989 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp +++ b/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp @@ -12,14 +12,6 @@ using namespace llvm; -LLVMSharedModuleRef LLVMOrcMakeSharedModule(LLVMModuleRef Mod) { - return wrap(new std::shared_ptr<Module>(unwrap(Mod))); -} - -void LLVMOrcDisposeSharedModuleRef(LLVMSharedModuleRef SharedMod) { - delete unwrap(SharedMod); -} - LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM) { TargetMachine *TM2(unwrap(TM)); @@ -75,24 +67,24 @@ LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack, LLVMOrcErrorCode LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, - LLVMOrcModuleHandle *RetHandle, - LLVMSharedModuleRef Mod, + LLVMOrcModuleHandle *RetHandle, LLVMModuleRef Mod, LLVMOrcSymbolResolverFn SymbolResolver, void *SymbolResolverCtx) { OrcCBindingsStack &J = *unwrap(JITStack); - std::shared_ptr<Module> *M(unwrap(Mod)); - return J.addIRModuleEager(*RetHandle, *M, SymbolResolver, SymbolResolverCtx); + std::unique_ptr<Module> M(unwrap(Mod)); + return J.addIRModuleEager(*RetHandle, std::move(M), SymbolResolver, + SymbolResolverCtx); } LLVMOrcErrorCode LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, - LLVMOrcModuleHandle *RetHandle, - LLVMSharedModuleRef Mod, + LLVMOrcModuleHandle *RetHandle, LLVMModuleRef Mod, LLVMOrcSymbolResolverFn SymbolResolver, void *SymbolResolverCtx) { OrcCBindingsStack &J = *unwrap(JITStack); - std::shared_ptr<Module> *M(unwrap(Mod)); - return J.addIRModuleLazy(*RetHandle, *M, SymbolResolver, SymbolResolverCtx); + std::unique_ptr<Module> M(unwrap(Mod)); + return J.addIRModuleLazy(*RetHandle, std::move(M), SymbolResolver, + SymbolResolverCtx); } LLVMOrcErrorCode diff --git a/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h b/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h index 382b9a32e09..a9621172d30 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h +++ b/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h @@ -43,8 +43,6 @@ namespace llvm { class OrcCBindingsStack; -DEFINE_SIMPLE_CONVERSION_FUNCTIONS(std::shared_ptr<Module>, - LLVMSharedModuleRef) DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcCBindingsStack, LLVMOrcJITStackRef) DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef) @@ -284,7 +282,7 @@ public: } template <typename LayerT> LLVMOrcErrorCode - addIRModule(orc::VModuleKey &RetKey, LayerT &Layer, std::shared_ptr<Module> M, + addIRModule(orc::VModuleKey &RetKey, LayerT &Layer, std::unique_ptr<Module> M, std::unique_ptr<RuntimeDyld::MemoryManager> MemMgr, LLVMOrcSymbolResolverFn ExternalResolver, void *ExternalResolverCtx) { @@ -323,7 +321,7 @@ public: } LLVMOrcErrorCode addIRModuleEager(orc::VModuleKey &RetKey, - std::shared_ptr<Module> M, + std::unique_ptr<Module> M, LLVMOrcSymbolResolverFn ExternalResolver, void *ExternalResolverCtx) { return addIRModule(RetKey, CompileLayer, std::move(M), @@ -332,7 +330,7 @@ public: } LLVMOrcErrorCode addIRModuleLazy(orc::VModuleKey &RetKey, - std::shared_ptr<Module> M, + std::unique_ptr<Module> M, LLVMOrcSymbolResolverFn ExternalResolver, void *ExternalResolverCtx) { return addIRModule(RetKey, CODLayer, std::move(M), diff --git a/llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.cpp b/llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.cpp index f89f21adff4..4def579e709 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.cpp +++ b/llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.cpp @@ -125,8 +125,13 @@ OrcMCJITReplacement::runFunction(Function *F, } void OrcMCJITReplacement::runStaticConstructorsDestructors(bool isDtors) { - for (auto &M : LocalModules) - ExecutionEngine::runStaticConstructorsDestructors(*M, isDtors); + auto &CtorDtorsMap = isDtors ? UnexecutedDestructors : UnexecutedConstructors; + + for (auto &KV : CtorDtorsMap) + cantFail(CtorDtorRunner<LazyEmitLayerT>(std::move(KV.second), KV.first) + .runViaLayer(LazyEmitLayer)); + + CtorDtorsMap.clear(); } } // End namespace orc. diff --git a/llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h b/llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h index 0a067501170..bdb4d07b132 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h +++ b/llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h @@ -21,6 +21,7 @@ #include "llvm/ExecutionEngine/GenericValue.h" #include "llvm/ExecutionEngine/JITSymbol.h" #include "llvm/ExecutionEngine/Orc/CompileUtils.h" +#include "llvm/ExecutionEngine/Orc/ExecutionUtils.h" #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" #include "llvm/ExecutionEngine/Orc/LazyEmittingLayer.h" #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" @@ -54,6 +55,7 @@ class ObjectCache; namespace orc { class OrcMCJITReplacement : public ExecutionEngine { + // OrcMCJITReplacement needs to do a little extra book-keeping to ensure that // Orc's automatic finalization doesn't kick in earlier than MCJIT clients are // expecting - see finalizeMemory. @@ -235,7 +237,10 @@ public: return ObjectLayerT::Resources{this->MemMgr, this->Resolver}; }, NotifyObjectLoaded, NotifyFinalized), - CompileLayer(ObjectLayer, SimpleCompiler(*this->TM)), + CompileLayer(ObjectLayer, SimpleCompiler(*this->TM), + [this](VModuleKey K, std::unique_ptr<Module> M) { + Modules.push_back(std::move(M)); + }), LazyEmitLayer(CompileLayer) {} static void Register() { @@ -250,16 +255,36 @@ public: } else { assert(M->getDataLayout() == getDataLayout() && "DataLayout Mismatch"); } - auto *MPtr = M.release(); - ShouldDelete[MPtr] = true; - auto Deleter = [this](Module *Mod) { - auto I = ShouldDelete.find(Mod); - if (I != ShouldDelete.end() && I->second) - delete Mod; - }; - LocalModules.push_back(std::shared_ptr<Module>(MPtr, std::move(Deleter))); - cantFail( - LazyEmitLayer.addModule(ES.allocateVModule(), LocalModules.back())); + + // Rename, bump linkage and record static constructors and destructors. + // We have to do this before we hand over ownership of the module to the + // JIT. + std::vector<std::string> CtorNames, DtorNames; + { + unsigned CtorId = 0, DtorId = 0; + for (auto Ctor : orc::getConstructors(*M)) { + std::string NewCtorName = ("$static_ctor." + Twine(CtorId++)).str(); + Ctor.Func->setName(NewCtorName); + Ctor.Func->setLinkage(GlobalValue::ExternalLinkage); + Ctor.Func->setVisibility(GlobalValue::HiddenVisibility); + CtorNames.push_back(mangle(NewCtorName)); + } + for (auto Dtor : orc::getDestructors(*M)) { + std::string NewDtorName = ("$static_dtor." + Twine(DtorId++)).str(); + dbgs() << "Found dtor: " << NewDtorName << "\n"; + Dtor.Func->setName(NewDtorName); + Dtor.Func->setLinkage(GlobalValue::ExternalLinkage); + Dtor.Func->setVisibility(GlobalValue::HiddenVisibility); + DtorNames.push_back(mangle(NewDtorName)); + } + } + + auto K = ES.allocateVModule(); + + UnexecutedConstructors[K] = std::move(CtorNames); + UnexecutedDestructors[K] = std::move(DtorNames); + + cantFail(LazyEmitLayer.addModule(K, std::move(M))); } void addObjectFile(std::unique_ptr<object::ObjectFile> O) override { @@ -277,16 +302,16 @@ public: void addArchive(object::OwningBinary<object::Archive> A) override { Archives.push_back(std::move(A)); } - + bool removeModule(Module *M) override { - for (auto I = LocalModules.begin(), E = LocalModules.end(); I != E; ++I) { - if (I->get() == M) { - ShouldDelete[M] = false; - LocalModules.erase(I); - return true; - } - } - return false; + auto I = Modules.begin(); + for (auto E = Modules.end(); I != E; ++I) + if (I->get() == M) + break; + if (I == Modules.end()) + return false; + Modules.erase(I); + return true; } uint64_t getSymbolAddress(StringRef Name) { @@ -294,7 +319,7 @@ public: } JITSymbol findSymbol(StringRef Name) { - return findMangledSymbol(Mangle(Name)); + return findMangledSymbol(mangle(Name)); } void finalizeObject() override { @@ -412,7 +437,7 @@ private: OrcMCJITReplacement &M; }; - std::string Mangle(StringRef Name) { + std::string mangle(StringRef Name) { std::string MangledName; { raw_string_ostream MangledNameStream(MangledName); @@ -438,7 +463,6 @@ private: // delete blocks in LocalModules refer to the ShouldDelete map, so // LocalModules needs to be destructed before ShouldDelete. std::map<Module*, bool> ShouldDelete; - std::vector<std::shared_ptr<Module>> LocalModules; NotifyObjectLoadedT NotifyObjectLoaded; NotifyFinalizedT NotifyFinalized; @@ -447,6 +471,9 @@ private: CompileLayerT CompileLayer; LazyEmitLayerT LazyEmitLayer; + std::map<VModuleKey, std::vector<std::string>> UnexecutedConstructors; + std::map<VModuleKey, std::vector<std::string>> UnexecutedDestructors; + // We need to store ObjLayerT::ObjSetHandles for each of the object sets // that have been emitted but not yet finalized so that we can forward the // mapSectionAddress calls appropriately. |

