//===--------- LLJIT.cpp - An ORC-based JIT for compiling LLVM IR ---------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "llvm/ExecutionEngine/Orc/LLJIT.h" #include "llvm/ExecutionEngine/Orc/OrcError.h" #include "llvm/ExecutionEngine/SectionMemoryManager.h" #include "llvm/IR/Mangler.h" namespace llvm { namespace orc { Expected> LLJIT::Create(std::unique_ptr ES, std::unique_ptr TM, DataLayout DL) { return std::unique_ptr( new LLJIT(std::move(ES), std::move(TM), std::move(DL))); } Error LLJIT::defineAbsolute(StringRef Name, JITEvaluatedSymbol Sym) { auto InternedName = ES->getSymbolStringPool().intern(Name); SymbolMap Symbols({{InternedName, Sym}}); return Main.define(absoluteSymbols(std::move(Symbols))); } Error LLJIT::addIRModule(VSO &V, std::unique_ptr M) { assert(M && "Can not add null module"); if (auto Err = applyDataLayout(*M)) return Err; auto K = ES->allocateVModule(); return CompileLayer.add(V, K, std::move(M)); } Expected LLJIT::lookupLinkerMangled(VSO &V, StringRef Name) { return llvm::orc::lookup({&V}, ES->getSymbolStringPool().intern(Name)); } LLJIT::LLJIT(std::unique_ptr ES, std::unique_ptr TM, DataLayout DL) : ES(std::move(ES)), Main(this->ES->createVSO("main")), TM(std::move(TM)), DL(std::move(DL)), ObjLinkingLayer(*this->ES, [this](VModuleKey K) { return getMemoryManager(K); }), CompileLayer(*this->ES, ObjLinkingLayer, SimpleCompiler(*this->TM)), CtorRunner(Main), DtorRunner(Main) {} std::shared_ptr LLJIT::getMemoryManager(VModuleKey K) { return llvm::make_unique(); } 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( "Added modules have incompatible data layouts", inconvertibleErrorCode()); return Error::success(); } void LLJIT::recordCtorDtors(Module &M) { CtorRunner.add(getConstructors(M)); DtorRunner.add(getDestructors(M)); } Expected> LLLazyJIT::Create(std::unique_ptr ES, std::unique_ptr TM, DataLayout DL, LLVMContext &Ctx) { const Triple &TT = TM->getTargetTriple(); auto CCMgr = createLocalCompileCallbackManager(TT, *ES, 0); if (!CCMgr) return make_error( std::string("No callback manager available for ") + TT.str(), inconvertibleErrorCode()); auto ISMBuilder = createLocalIndirectStubsManagerBuilder(TT); if (!ISMBuilder) return make_error( std::string("No indirect stubs manager builder for ") + TT.str(), inconvertibleErrorCode()); return std::unique_ptr( new LLLazyJIT(std::move(ES), std::move(TM), std::move(DL), Ctx, std::move(CCMgr), std::move(ISMBuilder))); } Error LLLazyJIT::addLazyIRModule(VSO &V, std::unique_ptr M) { assert(M && "Can not add null module"); if (auto Err = applyDataLayout(*M)) return Err; makeAllSymbolsExternallyAccessible(*M); recordCtorDtors(*M); auto K = ES->allocateVModule(); return CODLayer.add(V, K, std::move(M)); } LLLazyJIT::LLLazyJIT( std::unique_ptr ES, std::unique_ptr TM, DataLayout DL, LLVMContext &Ctx, std::unique_ptr CCMgr, std::function()> ISMBuilder) : LLJIT(std::move(ES), std::move(TM), std::move(DL)), CCMgr(std::move(CCMgr)), TransformLayer(*this->ES, CompileLayer), CODLayer(*this->ES, TransformLayer, *this->CCMgr, std::move(ISMBuilder), [&]() -> LLVMContext & { return Ctx; }) {} } // End namespace orc. } // End namespace llvm.