From: Lang Hames Date: Mon, 30 Mar 2015 18:37:01 +0000 (+0000) Subject: [Orc] Separate callback manager selection from callback manager construction for X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=70c2586498eafe0320f49eeffff820fea272e2f2 [Orc] Separate callback manager selection from callback manager construction for OrcLazyJIT in lli. Separating these concerns enables more natural error handling. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233579 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/lli/OrcLazyJIT.cpp b/tools/lli/OrcLazyJIT.cpp index d17672c1445..0e4e2a579b6 100644 --- a/tools/lli/OrcLazyJIT.cpp +++ b/tools/lli/OrcLazyJIT.cpp @@ -12,31 +12,36 @@ using namespace llvm; -std::unique_ptr -OrcLazyJIT::createCallbackMgr(Triple T, LLVMContext &Context) { +OrcLazyJIT::CallbackManagerBuilder +OrcLazyJIT::createCallbackManagerBuilder(Triple T) { switch (T.getArch()) { - default: - // Flag error. - Error = true; - return nullptr; + default: return nullptr; case Triple::x86_64: { typedef orc::JITCompileCallbackManager CCMgrT; - return make_unique(CompileLayer, CCMgrMemMgr, Context, 0, 64); + return [](CompileLayerT &CompileLayer, RuntimeDyld::MemoryManager &MemMgr, + LLVMContext &Context) { + return make_unique(CompileLayer, MemMgr, Context, 0, 64); + }; } } } int llvm::runOrcLazyJIT(std::unique_ptr M, int ArgC, char* ArgV[]) { - OrcLazyJIT J(std::unique_ptr(EngineBuilder().selectTarget()), - getGlobalContext()); - - if (!J.Ok()) { - errs() << "Could not construct JIT.\n"; + auto TM = std::unique_ptr(EngineBuilder().selectTarget()); + auto &Context = getGlobalContext(); + auto CallbackMgrBuilder = + OrcLazyJIT::createCallbackManagerBuilder(Triple(TM->getTargetTriple())); + + if (!CallbackMgrBuilder) { + errs() << "No callback manager available for target '" + << TM->getTargetTriple() << "'.\n"; return 1; } + OrcLazyJIT J(std::move(TM), Context, CallbackMgrBuilder); + auto MainHandle = J.addModule(std::move(M)); auto MainSym = J.findSymbolIn(MainHandle, "main"); diff --git a/tools/lli/OrcLazyJIT.h b/tools/lli/OrcLazyJIT.h index fc1d0827cbc..89dfa6ba927 100644 --- a/tools/lli/OrcLazyJIT.h +++ b/tools/lli/OrcLazyJIT.h @@ -36,17 +36,24 @@ public: CompileCallbackMgr> CODLayerT; typedef CODLayerT::ModuleSetHandleT ModuleHandleT; - OrcLazyJIT(std::unique_ptr TM, LLVMContext &Context) - : Error(false), TM(std::move(TM)), + typedef std::function< + std::unique_ptr(CompileLayerT&, + RuntimeDyld::MemoryManager&, + LLVMContext&)> + CallbackManagerBuilder; + + static CallbackManagerBuilder createCallbackManagerBuilder(Triple T); + + OrcLazyJIT(std::unique_ptr TM, LLVMContext &Context, + CallbackManagerBuilder &BuildCallbackMgr) + : TM(std::move(TM)), Mang(this->TM->getDataLayout()), ObjectLayer(), CompileLayer(ObjectLayer, orc::SimpleCompiler(*this->TM)), LazyEmitLayer(CompileLayer), - CCMgr(createCallbackMgr(Triple(this->TM->getTargetTriple()), Context)), + CCMgr(BuildCallbackMgr(CompileLayer, CCMgrMemMgr, Context)), CODLayer(LazyEmitLayer, *CCMgr) { } - bool Ok() const { return !Error; } - ModuleHandleT addModule(std::unique_ptr M) { // Attach a data-layout if one isn't already present. if (M->getDataLayout().isDefault()) @@ -67,9 +74,6 @@ public: private: - std::unique_ptr - createCallbackMgr(Triple T, LLVMContext &Context); - std::string mangle(const std::string &Name) { std::string MangledName; { @@ -79,7 +83,6 @@ private: return MangledName; } - bool Error; std::unique_ptr TM; Mangler Mang; SectionMemoryManager CCMgrMemMgr;