diff options
Diffstat (limited to 'contrib/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp')
| -rw-r--r-- | contrib/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp | 226 |
1 files changed, 0 insertions, 226 deletions
diff --git a/contrib/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/contrib/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp deleted file mode 100644 index b120691faf07..000000000000 --- a/contrib/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp +++ /dev/null @@ -1,226 +0,0 @@ -//===--------- LLJIT.cpp - An ORC-based JIT for compiling LLVM IR ---------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "llvm/ExecutionEngine/Orc/LLJIT.h" -#include "llvm/ExecutionEngine/Orc/OrcError.h" -#include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" -#include "llvm/ExecutionEngine/SectionMemoryManager.h" -#include "llvm/IR/Mangler.h" - -namespace llvm { -namespace orc { - -Error LLJITBuilderState::prepareForConstruction() { - - if (!JTMB) { - if (auto JTMBOrErr = JITTargetMachineBuilder::detectHost()) - JTMB = std::move(*JTMBOrErr); - else - return JTMBOrErr.takeError(); - } - - return Error::success(); -} - -LLJIT::~LLJIT() { - if (CompileThreads) - CompileThreads->wait(); -} - -Error LLJIT::defineAbsolute(StringRef Name, JITEvaluatedSymbol Sym) { - auto InternedName = ES->intern(Name); - SymbolMap Symbols({{InternedName, Sym}}); - return Main.define(absoluteSymbols(std::move(Symbols))); -} - -Error LLJIT::addIRModule(JITDylib &JD, ThreadSafeModule TSM) { - assert(TSM && "Can not add null module"); - - if (auto Err = applyDataLayout(*TSM.getModule())) - return Err; - - return CompileLayer->add(JD, std::move(TSM), ES->allocateVModule()); -} - -Error LLJIT::addObjectFile(JITDylib &JD, std::unique_ptr<MemoryBuffer> Obj) { - assert(Obj && "Can not add null object"); - - return ObjLinkingLayer->add(JD, std::move(Obj), ES->allocateVModule()); -} - -Expected<JITEvaluatedSymbol> LLJIT::lookupLinkerMangled(JITDylib &JD, - StringRef Name) { - return ES->lookup(JITDylibSearchList({{&JD, true}}), ES->intern(Name)); -} - -std::unique_ptr<ObjectLayer> -LLJIT::createObjectLinkingLayer(LLJITBuilderState &S, ExecutionSession &ES) { - - // If the config state provided an ObjectLinkingLayer factory then use it. - if (S.CreateObjectLinkingLayer) - return S.CreateObjectLinkingLayer(ES); - - // Otherwise default to creating an RTDyldObjectLinkingLayer that constructs - // a new SectionMemoryManager for each object. - auto GetMemMgr = []() { return llvm::make_unique<SectionMemoryManager>(); }; - return llvm::make_unique<RTDyldObjectLinkingLayer>(ES, std::move(GetMemMgr)); -} - -Expected<IRCompileLayer::CompileFunction> -LLJIT::createCompileFunction(LLJITBuilderState &S, - JITTargetMachineBuilder JTMB) { - - /// If there is a custom compile function creator set then use it. - if (S.CreateCompileFunction) - return S.CreateCompileFunction(std::move(JTMB)); - - // Otherwise default to creating a SimpleCompiler, or ConcurrentIRCompiler, - // depending on the number of threads requested. - if (S.NumCompileThreads > 0) - return ConcurrentIRCompiler(std::move(JTMB)); - - auto TM = JTMB.createTargetMachine(); - if (!TM) - return TM.takeError(); - - return TMOwningSimpleCompiler(std::move(*TM)); -} - -LLJIT::LLJIT(LLJITBuilderState &S, Error &Err) - : ES(S.ES ? std::move(S.ES) : llvm::make_unique<ExecutionSession>()), - Main(this->ES->getMainJITDylib()), DL(""), CtorRunner(Main), - DtorRunner(Main) { - - ErrorAsOutParameter _(&Err); - - ObjLinkingLayer = createObjectLinkingLayer(S, *ES); - - if (auto DLOrErr = S.JTMB->getDefaultDataLayoutForTarget()) - DL = std::move(*DLOrErr); - else { - Err = DLOrErr.takeError(); - return; - } - - { - auto CompileFunction = createCompileFunction(S, std::move(*S.JTMB)); - if (!CompileFunction) { - Err = CompileFunction.takeError(); - return; - } - CompileLayer = llvm::make_unique<IRCompileLayer>( - *ES, *ObjLinkingLayer, std::move(*CompileFunction)); - } - - if (S.NumCompileThreads > 0) { - CompileLayer->setCloneToNewContextOnEmit(true); - CompileThreads = llvm::make_unique<ThreadPool>(S.NumCompileThreads); - 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::string LLJIT::mangle(StringRef UnmangledName) { - std::string MangledName; - { - raw_string_ostream MangledNameStream(MangledName); - Mangler::getNameWithPrefix(MangledNameStream, UnmangledName, DL); - } - return MangledName; -} - -Error LLJIT::applyDataLayout(Module &M) { - if (M.getDataLayout().isDefault()) - M.setDataLayout(DL); - - if (M.getDataLayout() != DL) - return make_error<StringError>( - "Added modules have incompatible data layouts", - inconvertibleErrorCode()); - - return Error::success(); -} - -void LLJIT::recordCtorDtors(Module &M) { - CtorRunner.add(getConstructors(M)); - DtorRunner.add(getDestructors(M)); -} - -Error LLLazyJITBuilderState::prepareForConstruction() { - if (auto Err = LLJITBuilderState::prepareForConstruction()) - return Err; - TT = JTMB->getTargetTriple(); - return Error::success(); -} - -Error LLLazyJIT::addLazyIRModule(JITDylib &JD, ThreadSafeModule TSM) { - assert(TSM && "Can not add null module"); - - if (auto Err = applyDataLayout(*TSM.getModule())) - return Err; - - recordCtorDtors(*TSM.getModule()); - - return CODLayer->add(JD, std::move(TSM), ES->allocateVModule()); -} - -LLLazyJIT::LLLazyJIT(LLLazyJITBuilderState &S, Error &Err) : LLJIT(S, Err) { - - // If LLJIT construction failed then bail out. - if (Err) - return; - - ErrorAsOutParameter _(&Err); - - /// Take/Create the lazy-compile callthrough manager. - if (S.LCTMgr) - LCTMgr = std::move(S.LCTMgr); - else { - if (auto LCTMgrOrErr = createLocalLazyCallThroughManager( - S.TT, *ES, S.LazyCompileFailureAddr)) - LCTMgr = std::move(*LCTMgrOrErr); - else { - Err = LCTMgrOrErr.takeError(); - return; - } - } - - // Take/Create the indirect stubs manager builder. - auto ISMBuilder = std::move(S.ISMBuilder); - - // If none was provided, try to build one. - if (!ISMBuilder) - ISMBuilder = createLocalIndirectStubsManagerBuilder(S.TT); - - // No luck. Bail out. - if (!ISMBuilder) { - Err = make_error<StringError>("Could not construct " - "IndirectStubsManagerBuilder for target " + - S.TT.str(), - inconvertibleErrorCode()); - return; - } - - // Create the transform layer. - TransformLayer = llvm::make_unique<IRTransformLayer>(*ES, *CompileLayer); - - // Create the COD layer. - CODLayer = llvm::make_unique<CompileOnDemandLayer>( - *ES, *TransformLayer, *LCTMgr, std::move(ISMBuilder)); - - if (S.NumCompileThreads > 0) - CODLayer->setCloneToNewContextOnEmit(true); -} - -} // End namespace orc. -} // End namespace llvm. |
