diff options
author | Lang Hames <lhames@gmail.com> | 2018-09-27 21:13:07 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2018-09-27 21:13:07 +0000 |
commit | 8b81395db9b38c665eba763270e0fd3c65cd598d (patch) | |
tree | ea1264fe0f4e7bdf9dbafcdb9f4095c20ed8da15 /llvm/lib/ExecutionEngine/Orc/LLJIT.cpp | |
parent | 305b0343cee31bb500b00786d48b8f8f945a141d (diff) | |
download | bcm5719-llvm-8b81395db9b38c665eba763270e0fd3c65cd598d.tar.gz bcm5719-llvm-8b81395db9b38c665eba763270e0fd3c65cd598d.zip |
[ORC] Add definition for IRLayer::setCloneToNewContextOnEmit, use it to set the
flag to true in LLJIT when running in multithreaded mode.
The IRLayer::setCloneToNewContextOnEmit method sets a flag within the IRLayer
that causes modules added to that layer to be moved to a new context (by
serializing to/from a memory buffer) when they are emitted. This allows modules
that were all loaded on the same context to be compiled in parallel.
llvm-svn: 343266
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/LLJIT.cpp')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/LLJIT.cpp | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp index 91fa4ec2077..2d53e294e12 100644 --- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp +++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp @@ -83,34 +83,38 @@ Expected<JITEvaluatedSymbol> LLJIT::lookupLinkerMangled(JITDylib &JD, LLJIT::LLJIT(std::unique_ptr<ExecutionSession> ES, std::unique_ptr<TargetMachine> TM, DataLayout DL) - : ES(std::move(ES)), Main(this->ES->getMainJITDylib()), - DL(std::move(DL)), + : ES(std::move(ES)), Main(this->ES->getMainJITDylib()), DL(std::move(DL)), ObjLinkingLayer(*this->ES, [this](VModuleKey K) { return getMemoryManager(K); }), - CompileLayer(*this->ES, ObjLinkingLayer, TMOwningSimpleCompiler(std::move(TM))), + CompileLayer(*this->ES, ObjLinkingLayer, + TMOwningSimpleCompiler(std::move(TM))), CtorRunner(Main), DtorRunner(Main) {} -LLJIT::LLJIT(std::unique_ptr<ExecutionSession> ES, - JITTargetMachineBuilder JTMB, DataLayout DL, - unsigned NumCompileThreads) - : ES(std::move(ES)), Main(this->ES->getMainJITDylib()), - DL(std::move(DL)), +LLJIT::LLJIT(std::unique_ptr<ExecutionSession> ES, JITTargetMachineBuilder JTMB, + DataLayout DL, unsigned NumCompileThreads) + : ES(std::move(ES)), Main(this->ES->getMainJITDylib()), DL(std::move(DL)), ObjLinkingLayer(*this->ES, [this](VModuleKey K) { return getMemoryManager(K); }), - CompileLayer(*this->ES, ObjLinkingLayer, MultiThreadedSimpleCompiler(std::move(JTMB))), + CompileLayer(*this->ES, ObjLinkingLayer, + MultiThreadedSimpleCompiler(std::move(JTMB))), CtorRunner(Main), DtorRunner(Main) { assert(NumCompileThreads != 0 && "Multithreaded LLJIT instance can not be created with 0 threads"); + // Move modules to new contexts when they're emitted so that we can compile + // them in parallel. + CompileLayer.setCloneToNewContextOnEmit(true); + + // Create a thread pool to compile on and set the execution session + // dispatcher to use the thread pool. CompileThreads = llvm::make_unique<ThreadPool>(NumCompileThreads); - this->ES->setDispatchMaterialization([this](JITDylib &JD, std::unique_ptr<MaterializationUnit> MU) { - // FIXME: Switch to move capture once we have c++14. - auto SharedMU = std::shared_ptr<MaterializationUnit>(std::move(MU)); - auto Work = [SharedMU, &JD]() { - SharedMU->doMaterialize(JD); - }; - CompileThreads->async(std::move(Work)); - }); + this->ES->setDispatchMaterialization( + [this](JITDylib &JD, std::unique_ptr<MaterializationUnit> MU) { + // FIXME: Switch to move capture once we have c++14. + auto SharedMU = std::shared_ptr<MaterializationUnit>(std::move(MU)); + auto Work = [SharedMU, &JD]() { SharedMU->doMaterialize(JD); }; + CompileThreads->async(std::move(Work)); + }); } std::unique_ptr<RuntimeDyld::MemoryManager> @@ -206,7 +210,9 @@ LLLazyJIT::LLLazyJIT( : LLJIT(std::move(ES), std::move(JTMB), std::move(DL), NumCompileThreads), LCTMgr(std::move(LCTMgr)), TransformLayer(*this->ES, CompileLayer), CODLayer(*this->ES, TransformLayer, *this->LCTMgr, - std::move(ISMBuilder)) {} + std::move(ISMBuilder)) { + CODLayer.setCloneToNewContextOnEmit(true); +} } // End namespace orc. } // End namespace llvm. |