diff options
author | Lang Hames <lhames@gmail.com> | 2018-09-26 03:32:12 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2018-09-26 03:32:12 +0000 |
commit | 50b33441487f9ccd447e17b1ecbd8799793993d4 (patch) | |
tree | 081d7699c50e46662b000327fea43425eed02669 /llvm/lib/ExecutionEngine/Orc | |
parent | 225a32af72b6f9dac6adb35263201ec7a2a08901 (diff) | |
download | bcm5719-llvm-50b33441487f9ccd447e17b1ecbd8799793993d4.tar.gz bcm5719-llvm-50b33441487f9ccd447e17b1ecbd8799793993d4.zip |
[ORC] Refactor trampoline pool management out of JITCompileCallbackManager.
This will allow trampoline pools to be re-used for a new lazy-reexport utility
that generates looks up function bodies using the standard symbol lookup process
(rather than using a user provided compile function). This new utility provides
the same capabilities (since MaterializationUnits already allow user supplied
compile functions to be run) as JITCompileCallbackManager, but can use the new
asynchronous lookup functions to avoid blocking a compile thread.
This patch also updates createLocalCompileCallbackManager to return an error if
a callback manager can not be created, and updates clients of that API to
account for the change. Finally, the OrcCBindingsStack is updates so that if
a callback manager is not available for the target platform a valid stack
(without support for lazy compilation) can still be constructed.
llvm-svn: 343059
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp | 34 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/LLJIT.cpp | 14 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h | 91 |
3 files changed, 91 insertions, 48 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp b/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp index 80a227f0a1e..54baed237b2 100644 --- a/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp +++ b/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp @@ -52,12 +52,12 @@ private: namespace llvm { namespace orc { -void JITCompileCallbackManager::anchor() {} void IndirectStubsManager::anchor() {} +void TrampolinePool::anchor() {} Expected<JITTargetAddress> JITCompileCallbackManager::getCompileCallback(CompileFunction Compile) { - if (auto TrampolineAddr = getAvailableTrampolineAddr()) { + if (auto TrampolineAddr = TP->getTrampoline()) { auto CallbackName = ES.getSymbolStringPool().intern( std::string("cc") + std::to_string(++NextCallbackId)); @@ -107,44 +107,46 @@ JITTargetAddress JITCompileCallbackManager::executeCompileCallback( } } -std::unique_ptr<JITCompileCallbackManager> +Expected<std::unique_ptr<JITCompileCallbackManager>> createLocalCompileCallbackManager(const Triple &T, ExecutionSession &ES, JITTargetAddress ErrorHandlerAddress) { switch (T.getArch()) { - default: return nullptr; - - case Triple::aarch64: { - typedef orc::LocalJITCompileCallbackManager<orc::OrcAArch64> CCMgrT; - return llvm::make_unique<CCMgrT>(ES, ErrorHandlerAddress); + default: + return make_error<StringError>( + std::string("No callback manager available for ") + T.str(), + inconvertibleErrorCode()); + case Triple::aarch64: { + typedef orc::LocalJITCompileCallbackManager<orc::OrcAArch64> CCMgrT; + return CCMgrT::Create(ES, ErrorHandlerAddress); } case Triple::x86: { typedef orc::LocalJITCompileCallbackManager<orc::OrcI386> CCMgrT; - return llvm::make_unique<CCMgrT>(ES, ErrorHandlerAddress); + return CCMgrT::Create(ES, ErrorHandlerAddress); } case Triple::mips: { typedef orc::LocalJITCompileCallbackManager<orc::OrcMips32Be> CCMgrT; - return llvm::make_unique<CCMgrT>(ES, ErrorHandlerAddress); + return CCMgrT::Create(ES, ErrorHandlerAddress); } case Triple::mipsel: { typedef orc::LocalJITCompileCallbackManager<orc::OrcMips32Le> CCMgrT; - return llvm::make_unique<CCMgrT>(ES, ErrorHandlerAddress); + return CCMgrT::Create(ES, ErrorHandlerAddress); } - + case Triple::mips64: case Triple::mips64el: { typedef orc::LocalJITCompileCallbackManager<orc::OrcMips64> CCMgrT; - return llvm::make_unique<CCMgrT>(ES, ErrorHandlerAddress); + return CCMgrT::Create(ES, ErrorHandlerAddress); } - + case Triple::x86_64: { if ( T.getOS() == Triple::OSType::Win32 ) { typedef orc::LocalJITCompileCallbackManager<orc::OrcX86_64_Win32> CCMgrT; - return llvm::make_unique<CCMgrT>(ES, ErrorHandlerAddress); + return CCMgrT::Create(ES, ErrorHandlerAddress); } else { typedef orc::LocalJITCompileCallbackManager<orc::OrcX86_64_SysV> CCMgrT; - return llvm::make_unique<CCMgrT>(ES, ErrorHandlerAddress); + return CCMgrT::Create(ES, ErrorHandlerAddress); } } diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp index ecdfd862c3b..a3da0741e11 100644 --- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp +++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp @@ -153,9 +153,7 @@ Expected<std::unique_ptr<LLLazyJIT>> auto CCMgr = createLocalCompileCallbackManager(TT, *ES, 0); if (!CCMgr) - return make_error<StringError>( - std::string("No callback manager available for ") + TT.str(), - inconvertibleErrorCode()); + return CCMgr.takeError(); auto ISMBuilder = createLocalIndirectStubsManagerBuilder(TT); if (!ISMBuilder) @@ -168,13 +166,13 @@ Expected<std::unique_ptr<LLLazyJIT>> if (!TM) return TM.takeError(); return std::unique_ptr<LLLazyJIT>( - new LLLazyJIT(std::move(ES), std::move(*TM), std::move(DL), - std::move(CCMgr), std::move(ISMBuilder))); + new LLLazyJIT(std::move(ES), std::move(*TM), std::move(DL), + std::move(*CCMgr), std::move(ISMBuilder))); } - return std::unique_ptr<LLLazyJIT>( - new LLLazyJIT(std::move(ES), std::move(JTMB), std::move(DL), - NumCompileThreads, std::move(CCMgr), std::move(ISMBuilder))); + return std::unique_ptr<LLLazyJIT>(new LLLazyJIT( + std::move(ES), std::move(JTMB), std::move(DL), NumCompileThreads, + std::move(*CCMgr), std::move(ISMBuilder))); } Error LLLazyJIT::addLazyIRModule(JITDylib &JD, ThreadSafeModule TSM) { diff --git a/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h b/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h index d59030abab3..3fedba1caa6 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h +++ b/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h @@ -183,10 +183,17 @@ private: // 2. Runtime overrides. // 3. External resolver (if present). - if (auto Sym = Stack.CODLayer.findSymbol(Name, true)) - return Sym; - else if (auto Err = Sym.takeError()) - return Sym.takeError(); + if (Stack.CODLayer) { + if (auto Sym = Stack.CODLayer->findSymbol(Name, true)) + return Sym; + else if (auto Err = Sym.takeError()) + return Sym.takeError(); + } else { + if (auto Sym = Stack.CompileLayer.findSymbol(Name, true)) + return Sym; + else if (auto Err = Sym.takeError()) + return Sym.takeError(); + } if (auto Sym = Stack.CXXRuntimeOverrides.searchOverrides(Name)) return Sym; @@ -206,8 +213,8 @@ private: public: OrcCBindingsStack(TargetMachine &TM, IndirectStubsManagerBuilder IndirectStubsMgrBuilder) - : CCMgr(createLocalCompileCallbackManager(TM.getTargetTriple(), ES, 0)), - DL(TM.createDataLayout()), IndirectStubsMgr(IndirectStubsMgrBuilder()), + : CCMgr(createCompileCallbackManager(TM, ES)), DL(TM.createDataLayout()), + IndirectStubsMgr(IndirectStubsMgrBuilder()), ObjectLayer(ES, [this](orc::VModuleKey K) { auto ResolverI = Resolvers.find(K); @@ -227,20 +234,8 @@ public: this->notifyFreed(K, Obj); }), CompileLayer(ObjectLayer, orc::SimpleCompiler(TM)), - CODLayer(ES, CompileLayer, - [this](orc::VModuleKey K) { - auto ResolverI = Resolvers.find(K); - assert(ResolverI != Resolvers.end() && - "No resolver for module K"); - return ResolverI->second; - }, - [this](orc::VModuleKey K, - std::shared_ptr<orc::SymbolResolver> Resolver) { - assert(!Resolvers.count(K) && "Resolver already present"); - Resolvers[K] = std::move(Resolver); - }, - [](Function &F) { return std::set<Function *>({&F}); }, - *this->CCMgr, std::move(IndirectStubsMgrBuilder), false), + CODLayer(createCODLayer(ES, CompileLayer, CCMgr.get(), + std::move(IndirectStubsMgrBuilder), Resolvers)), CXXRuntimeOverrides( [this](const std::string &S) { return mangle(S); }) {} @@ -286,6 +281,7 @@ public: Error setIndirectStubPointer(StringRef Name, JITTargetAddress Addr) { return IndirectStubsMgr->updatePointer(Name, Addr); } + template <typename LayerT> Expected<orc::VModuleKey> addIRModule(LayerT &Layer, std::unique_ptr<Module> M, @@ -338,7 +334,12 @@ public: addIRModuleLazy(std::unique_ptr<Module> M, LLVMOrcSymbolResolverFn ExternalResolver, void *ExternalResolverCtx) { - return addIRModule(CODLayer, std::move(M), + if (!CODLayer) + return make_error<StringError>("Can not add lazy module: No compile " + "callback manager available", + inconvertibleErrorCode()); + + return addIRModule(*CODLayer, std::move(M), llvm::make_unique<SectionMemoryManager>(), std::move(ExternalResolver), ExternalResolverCtx); } @@ -376,7 +377,9 @@ public: bool ExportedSymbolsOnly) { if (auto Sym = IndirectStubsMgr->findStub(Name, ExportedSymbolsOnly)) return Sym; - return CODLayer.findSymbol(mangle(Name), ExportedSymbolsOnly); + if (CODLayer) + return CODLayer->findSymbol(mangle(Name), ExportedSymbolsOnly); + return CompileLayer.findSymbol(mangle(Name), ExportedSymbolsOnly); } JITSymbol findSymbolIn(orc::VModuleKey K, const std::string &Name, @@ -440,6 +443,46 @@ public: } private: + using ResolverMap = + std::map<orc::VModuleKey, std::shared_ptr<orc::SymbolResolver>>; + + static std::unique_ptr<CompileCallbackMgr> + createCompileCallbackManager(TargetMachine &TM, orc::ExecutionSession &ES) { + auto CCMgr = createLocalCompileCallbackManager(TM.getTargetTriple(), ES, 0); + if (!CCMgr) { + // FIXME: It would be good if we could report this somewhere, but we do + // have an instance yet. + logAllUnhandledErrors(CCMgr.takeError(), errs(), "ORC error: "); + return nullptr; + } + return std::move(*CCMgr); + } + + static std::unique_ptr<CODLayerT> + createCODLayer(orc::ExecutionSession &ES, CompileLayerT &CompileLayer, + CompileCallbackMgr *CCMgr, + IndirectStubsManagerBuilder IndirectStubsMgrBuilder, + ResolverMap &Resolvers) { + // If there is no compile callback manager available we can not create a + // compile on demand layer. + if (!CCMgr) + return nullptr; + + return llvm::make_unique<CODLayerT>( + ES, CompileLayer, + [&Resolvers](orc::VModuleKey K) { + auto ResolverI = Resolvers.find(K); + assert(ResolverI != Resolvers.end() && "No resolver for module K"); + return ResolverI->second; + }, + [&Resolvers](orc::VModuleKey K, + std::shared_ptr<orc::SymbolResolver> Resolver) { + assert(!Resolvers.count(K) && "Resolver already present"); + Resolvers[K] = std::move(Resolver); + }, + [](Function &F) { return std::set<Function *>({&F}); }, *CCMgr, + std::move(IndirectStubsMgrBuilder), false); + } void reportError(Error Err) { // FIXME: Report errors on the execution session. @@ -470,7 +513,7 @@ private: ObjLayerT ObjectLayer; CompileLayerT CompileLayer; - CODLayerT CODLayer; + std::unique_ptr<CODLayerT> CODLayer; std::map<orc::VModuleKey, std::unique_ptr<detail::GenericLayer>> KeyLayers; @@ -478,7 +521,7 @@ private: std::vector<orc::CtorDtorRunner<OrcCBindingsStack>> IRStaticDestructorRunners; std::string ErrMsg; - std::map<orc::VModuleKey, std::shared_ptr<orc::SymbolResolver>> Resolvers; + ResolverMap Resolvers; }; } // end namespace llvm |