diff options
author | Lang Hames <lhames@gmail.com> | 2018-09-26 16:26:59 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2018-09-26 16:26:59 +0000 |
commit | f0a3fd885dfb416423f525e58c901d8632e2780a (patch) | |
tree | 09f039531b75264c7cba6e5a99a2da22ad3764d1 /llvm/lib/ExecutionEngine/Orc/LLJIT.cpp | |
parent | b0189289bf31582c0e7bcfcbeddd6a54f844e3f6 (diff) | |
download | bcm5719-llvm-f0a3fd885dfb416423f525e58c901d8632e2780a.tar.gz bcm5719-llvm-f0a3fd885dfb416423f525e58c901d8632e2780a.zip |
Reapply r343058 with a fix for -DLLVM_ENABLE_THREADS=OFF.
Modifies lit to add a 'thread_support' feature that can be used in lit test
REQUIRES clauses. The thread_support flag is set if -DLLVM_ENABLE_THREADS=ON
and unset if -DLLVM_ENABLE_THREADS=OFF. The lit flag is used to disable the
multiple-compile-threads-basic.ll testcase when threading is disabled.
llvm-svn: 343122
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/LLJIT.cpp')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/LLJIT.cpp | 93 |
1 files changed, 84 insertions, 9 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp index 34402506a60..0a0faaa681c 100644 --- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp +++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp @@ -12,13 +12,45 @@ #include "llvm/ExecutionEngine/SectionMemoryManager.h" #include "llvm/IR/Mangler.h" +namespace { + + // A SimpleCompiler that owns its TargetMachine. + class TMOwningSimpleCompiler : public llvm::orc::SimpleCompiler { + public: + TMOwningSimpleCompiler(std::unique_ptr<llvm::TargetMachine> TM) + : llvm::orc::SimpleCompiler(*TM), TM(std::move(TM)) {} + private: + // FIXME: shared because std::functions (and thus + // IRCompileLayer2::CompileFunction) are not moveable. + std::shared_ptr<llvm::TargetMachine> TM; + }; + +} // end anonymous namespace + namespace llvm { namespace orc { +LLJIT::~LLJIT() { + if (CompileThreads) + CompileThreads->wait(); +} + Expected<std::unique_ptr<LLJIT>> -LLJIT::Create(std::unique_ptr<TargetMachine> TM, DataLayout DL) { +LLJIT::Create(JITTargetMachineBuilder JTMB, DataLayout DL, + unsigned NumCompileThreads) { + + if (NumCompileThreads == 0) { + // If NumCompileThreads == 0 then create a single-threaded LLJIT instance. + auto TM = JTMB.createTargetMachine(); + if (!TM) + return TM.takeError(); + return std::unique_ptr<LLJIT>(new LLJIT(llvm::make_unique<ExecutionSession>(), + std::move(*TM), std::move(DL))); + } + return std::unique_ptr<LLJIT>(new LLJIT(llvm::make_unique<ExecutionSession>(), - std::move(TM), std::move(DL))); + std::move(JTMB), std::move(DL), + NumCompileThreads)); } Error LLJIT::defineAbsolute(StringRef Name, JITEvaluatedSymbol Sym) { @@ -52,12 +84,35 @@ 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->createJITDylib("main")), - TM(std::move(TM)), DL(std::move(DL)), + DL(std::move(DL)), ObjLinkingLayer(*this->ES, [this](VModuleKey K) { return getMemoryManager(K); }), - CompileLayer(*this->ES, ObjLinkingLayer, SimpleCompiler(*this->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->createJITDylib("main")), + DL(std::move(DL)), + ObjLinkingLayer(*this->ES, + [this](VModuleKey K) { return getMemoryManager(K); }), + 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"); + + 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)); + }); +} + std::unique_ptr<RuntimeDyld::MemoryManager> LLJIT::getMemoryManager(VModuleKey K) { return llvm::make_unique<SectionMemoryManager>(); @@ -90,10 +145,11 @@ void LLJIT::recordCtorDtors(Module &M) { } Expected<std::unique_ptr<LLLazyJIT>> -LLLazyJIT::Create(std::unique_ptr<TargetMachine> TM, DataLayout DL) { + LLLazyJIT::Create(JITTargetMachineBuilder JTMB, DataLayout DL, + unsigned NumCompileThreads) { auto ES = llvm::make_unique<ExecutionSession>(); - const Triple &TT = TM->getTargetTriple(); + const Triple &TT = JTMB.getTargetTriple(); auto LCTMgr = createLocalLazyCallThroughManager(TT, *ES, 0); if (!LCTMgr) @@ -105,9 +161,18 @@ LLLazyJIT::Create(std::unique_ptr<TargetMachine> TM, DataLayout DL) { std::string("No indirect stubs manager builder for ") + TT.str(), inconvertibleErrorCode()); - return std::unique_ptr<LLLazyJIT>( - new LLLazyJIT(std::move(ES), std::move(TM), std::move(DL), - std::move(*LCTMgr), std::move(ISMBuilder))); + if (NumCompileThreads == 0) { + auto TM = JTMB.createTargetMachine(); + if (!TM) + return TM.takeError(); + return std::unique_ptr<LLLazyJIT>( + new LLLazyJIT(std::move(ES), std::move(*TM), std::move(DL), + std::move(*LCTMgr), std::move(ISMBuilder))); + } + + return std::unique_ptr<LLLazyJIT>(new LLLazyJIT( + std::move(ES), std::move(JTMB), std::move(DL), NumCompileThreads, + std::move(*LCTMgr), std::move(ISMBuilder))); } Error LLLazyJIT::addLazyIRModule(JITDylib &JD, ThreadSafeModule TSM) { @@ -133,5 +198,15 @@ LLLazyJIT::LLLazyJIT( CODLayer(*this->ES, TransformLayer, *this->LCTMgr, std::move(ISMBuilder)) {} +LLLazyJIT::LLLazyJIT( + std::unique_ptr<ExecutionSession> ES, JITTargetMachineBuilder JTMB, + DataLayout DL, unsigned NumCompileThreads, + std::unique_ptr<LazyCallThroughManager> LCTMgr, + std::function<std::unique_ptr<IndirectStubsManager>()> ISMBuilder) + : 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)) {} + } // End namespace orc. } // End namespace llvm. |