blob: 464b1e2413a922b3e4515c2048e183c0665aaadc [file] [log] [blame]
Lang Hames6a941342018-06-26 21:35:48 +00001//===--------- LLJIT.cpp - An ORC-based JIT for compiling LLVM IR ---------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/ExecutionEngine/Orc/LLJIT.h"
11#include "llvm/ExecutionEngine/Orc/OrcError.h"
12#include "llvm/ExecutionEngine/SectionMemoryManager.h"
13#include "llvm/IR/Mangler.h"
14
15namespace llvm {
16namespace orc {
17
18Expected<std::unique_ptr<LLJIT>>
Lang Hames7c481432018-09-10 22:08:57 +000019LLJIT::Create(std::unique_ptr<TargetMachine> TM, DataLayout DL) {
20 return std::unique_ptr<LLJIT>(new LLJIT(llvm::make_unique<ExecutionSession>(),
21 std::move(TM), std::move(DL)));
Lang Hames6a941342018-06-26 21:35:48 +000022}
23
24Error LLJIT::defineAbsolute(StringRef Name, JITEvaluatedSymbol Sym) {
25 auto InternedName = ES->getSymbolStringPool().intern(Name);
26 SymbolMap Symbols({{InternedName, Sym}});
27 return Main.define(absoluteSymbols(std::move(Symbols)));
28}
29
Lang Hamesd5f56c52018-08-17 21:18:18 +000030Error LLJIT::addIRModule(JITDylib &JD, std::unique_ptr<Module> M) {
Lang Hames6a941342018-06-26 21:35:48 +000031 assert(M && "Can not add null module");
32
33 if (auto Err = applyDataLayout(*M))
34 return Err;
35
36 auto K = ES->allocateVModule();
Lang Hamesd5f56c52018-08-17 21:18:18 +000037 return CompileLayer.add(JD, K, std::move(M));
Lang Hames6a941342018-06-26 21:35:48 +000038}
39
Lang Hames37a66412018-08-28 20:20:31 +000040Error LLJIT::addObjectFile(JITDylib &JD, std::unique_ptr<MemoryBuffer> Obj) {
41 assert(Obj && "Can not add null object");
42
43 auto K = ES->allocateVModule();
44 return ObjLinkingLayer.add(JD, K, std::move(Obj));
45}
46
Lang Hamesd5f56c52018-08-17 21:18:18 +000047Expected<JITEvaluatedSymbol> LLJIT::lookupLinkerMangled(JITDylib &JD,
Lang Hames6a941342018-06-26 21:35:48 +000048 StringRef Name) {
Lang Hamesd5f56c52018-08-17 21:18:18 +000049 return llvm::orc::lookup({&JD}, ES->getSymbolStringPool().intern(Name));
Lang Hames6a941342018-06-26 21:35:48 +000050}
51
52LLJIT::LLJIT(std::unique_ptr<ExecutionSession> ES,
53 std::unique_ptr<TargetMachine> TM, DataLayout DL)
Lang Hamesd5f56c52018-08-17 21:18:18 +000054 : ES(std::move(ES)), Main(this->ES->createJITDylib("main")),
55 TM(std::move(TM)), DL(std::move(DL)),
Lang Hames6a941342018-06-26 21:35:48 +000056 ObjLinkingLayer(*this->ES,
Lang Hamesfd0c1e712018-07-20 18:31:50 +000057 [this](VModuleKey K) { return getMemoryManager(K); }),
Lang Hames6a941342018-06-26 21:35:48 +000058 CompileLayer(*this->ES, ObjLinkingLayer, SimpleCompiler(*this->TM)),
Lang Hamesfd0c1e712018-07-20 18:31:50 +000059 CtorRunner(Main), DtorRunner(Main) {}
Lang Hames6a941342018-06-26 21:35:48 +000060
Lang Hamesbf985252018-09-06 19:39:26 +000061std::unique_ptr<RuntimeDyld::MemoryManager>
Lang Hamesfd0c1e712018-07-20 18:31:50 +000062LLJIT::getMemoryManager(VModuleKey K) {
63 return llvm::make_unique<SectionMemoryManager>();
Lang Hames6a941342018-06-26 21:35:48 +000064}
65
66std::string LLJIT::mangle(StringRef UnmangledName) {
67 std::string MangledName;
68 {
69 raw_string_ostream MangledNameStream(MangledName);
70 Mangler::getNameWithPrefix(MangledNameStream, UnmangledName, DL);
71 }
72 return MangledName;
73}
74
Lang Hames6a941342018-06-26 21:35:48 +000075Error LLJIT::applyDataLayout(Module &M) {
76 if (M.getDataLayout().isDefault())
77 M.setDataLayout(DL);
78
79 if (M.getDataLayout() != DL)
80 return make_error<StringError>(
81 "Added modules have incompatible data layouts",
82 inconvertibleErrorCode());
83
84 return Error::success();
85}
86
87void LLJIT::recordCtorDtors(Module &M) {
88 CtorRunner.add(getConstructors(M));
89 DtorRunner.add(getDestructors(M));
90}
91
92Expected<std::unique_ptr<LLLazyJIT>>
Lang Hames7c481432018-09-10 22:08:57 +000093LLLazyJIT::Create(std::unique_ptr<TargetMachine> TM, DataLayout DL,
Lang Hames6a941342018-06-26 21:35:48 +000094 LLVMContext &Ctx) {
Lang Hames7c481432018-09-10 22:08:57 +000095 auto ES = llvm::make_unique<ExecutionSession>();
96
Lang Hames6a941342018-06-26 21:35:48 +000097 const Triple &TT = TM->getTargetTriple();
98
99 auto CCMgr = createLocalCompileCallbackManager(TT, *ES, 0);
100 if (!CCMgr)
101 return make_error<StringError>(
102 std::string("No callback manager available for ") + TT.str(),
103 inconvertibleErrorCode());
104
105 auto ISMBuilder = createLocalIndirectStubsManagerBuilder(TT);
106 if (!ISMBuilder)
107 return make_error<StringError>(
108 std::string("No indirect stubs manager builder for ") + TT.str(),
109 inconvertibleErrorCode());
110
111 return std::unique_ptr<LLLazyJIT>(
112 new LLLazyJIT(std::move(ES), std::move(TM), std::move(DL), Ctx,
113 std::move(CCMgr), std::move(ISMBuilder)));
114}
115
Lang Hamesd5f56c52018-08-17 21:18:18 +0000116Error LLLazyJIT::addLazyIRModule(JITDylib &JD, std::unique_ptr<Module> M) {
Lang Hames6a941342018-06-26 21:35:48 +0000117 assert(M && "Can not add null module");
118
119 if (auto Err = applyDataLayout(*M))
120 return Err;
121
122 makeAllSymbolsExternallyAccessible(*M);
123
124 recordCtorDtors(*M);
125
126 auto K = ES->allocateVModule();
Lang Hamesd5f56c52018-08-17 21:18:18 +0000127 return CODLayer.add(JD, K, std::move(M));
Lang Hames6a941342018-06-26 21:35:48 +0000128}
129
130LLLazyJIT::LLLazyJIT(
131 std::unique_ptr<ExecutionSession> ES, std::unique_ptr<TargetMachine> TM,
132 DataLayout DL, LLVMContext &Ctx,
133 std::unique_ptr<JITCompileCallbackManager> CCMgr,
134 std::function<std::unique_ptr<IndirectStubsManager>()> ISMBuilder)
135 : LLJIT(std::move(ES), std::move(TM), std::move(DL)),
136 CCMgr(std::move(CCMgr)), TransformLayer(*this->ES, CompileLayer),
137 CODLayer(*this->ES, TransformLayer, *this->CCMgr, std::move(ISMBuilder),
Lang Hames6a941342018-06-26 21:35:48 +0000138 [&]() -> LLVMContext & { return Ctx; }) {}
139
Lang Hames6a941342018-06-26 21:35:48 +0000140} // End namespace orc.
141} // End namespace llvm.