blob: b0464380b31ea768ced0740605526b47607efe6b [file] [log] [blame]
Eugene Zelenkof292a2f2017-06-19 23:37:52 +00001//===- OrcCBindingsStack.h - Orc JIT stack for C bindings -----*- C++ -*---===//
Lang Hames130a7c42015-10-28 02:40:04 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Lang Hames130a7c42015-10-28 02:40:04 +00006//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_LIB_EXECUTIONENGINE_ORC_ORCCBINDINGSSTACK_H
10#define LLVM_LIB_EXECUTIONENGINE_ORC_ORCCBINDINGSSTACK_H
11
Lang Hames1fa0e0e2016-04-25 21:21:20 +000012#include "llvm-c/OrcBindings.h"
Eugene Zelenkof292a2f2017-06-19 23:37:52 +000013#include "llvm-c/TargetMachine.h"
14#include "llvm/ADT/STLExtras.h"
15#include "llvm/ADT/StringRef.h"
16#include "llvm/ExecutionEngine/JITSymbol.h"
Andres Freund6801fee2018-05-24 21:32:50 +000017#include "llvm/ExecutionEngine/JITEventListener.h"
Lang Hames130a7c42015-10-28 02:40:04 +000018#include "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h"
19#include "llvm/ExecutionEngine/Orc/CompileUtils.h"
20#include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
21#include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
Eugene Zelenkof292a2f2017-06-19 23:37:52 +000022#include "llvm/ExecutionEngine/Orc/LambdaResolver.h"
Lang Hames67de5d22017-02-20 05:45:14 +000023#include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"
Eugene Zelenkof292a2f2017-06-19 23:37:52 +000024#include "llvm/ExecutionEngine/RuntimeDyld.h"
25#include "llvm/ExecutionEngine/SectionMemoryManager.h"
26#include "llvm/IR/DataLayout.h"
27#include "llvm/IR/Mangler.h"
28#include "llvm/IR/Module.h"
29#include "llvm/Support/CBindingWrapping.h"
Lang Hamesef5a0ee2016-04-25 19:56:45 +000030#include "llvm/Support/Error.h"
Eugene Zelenkof292a2f2017-06-19 23:37:52 +000031#include "llvm/Support/raw_ostream.h"
32#include "llvm/Target/TargetMachine.h"
33#include <algorithm>
34#include <cstdint>
35#include <functional>
Lang Hames0976cee2018-02-09 02:30:40 +000036#include <map>
Eugene Zelenkof292a2f2017-06-19 23:37:52 +000037#include <memory>
38#include <set>
39#include <string>
40#include <vector>
Lang Hames130a7c42015-10-28 02:40:04 +000041
42namespace llvm {
43
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000044class OrcCBindingsStack;
45
46DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcCBindingsStack, LLVMOrcJITStackRef)
47DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef)
48
Lang Hamesec300632017-09-17 03:25:03 +000049namespace detail {
Lang Hames26620222017-06-22 21:06:54 +000050
Lang Hames0976cee2018-02-09 02:30:40 +000051// FIXME: Kill this off once the Layer concept becomes an interface.
52class GenericLayer {
53public:
54 virtual ~GenericLayer() = default;
Lang Hames130a7c42015-10-28 02:40:04 +000055
Lang Hames0976cee2018-02-09 02:30:40 +000056 virtual JITSymbol findSymbolIn(orc::VModuleKey K, const std::string &Name,
57 bool ExportedSymbolsOnly) = 0;
58 virtual Error removeModule(orc::VModuleKey K) = 0;
Lang Hames130a7c42015-10-28 02:40:04 +000059 };
60
Lang Hames0976cee2018-02-09 02:30:40 +000061 template <typename LayerT> class GenericLayerImpl : public GenericLayer {
Lang Hames130a7c42015-10-28 02:40:04 +000062 public:
Lang Hames0976cee2018-02-09 02:30:40 +000063 GenericLayerImpl(LayerT &Layer) : Layer(Layer) {}
Lang Hames130a7c42015-10-28 02:40:04 +000064
Lang Hames0976cee2018-02-09 02:30:40 +000065 JITSymbol findSymbolIn(orc::VModuleKey K, const std::string &Name,
Lang Hamesad4a9112016-08-01 20:49:11 +000066 bool ExportedSymbolsOnly) override {
Lang Hames0976cee2018-02-09 02:30:40 +000067 return Layer.findSymbolIn(K, Name, ExportedSymbolsOnly);
Lang Hames130a7c42015-10-28 02:40:04 +000068 }
69
Lang Hames0976cee2018-02-09 02:30:40 +000070 Error removeModule(orc::VModuleKey K) override {
71 return Layer.removeModule(K);
Lang Hames4b546c92018-02-06 21:25:11 +000072 }
Lang Hames130a7c42015-10-28 02:40:04 +000073
74 private:
75 LayerT &Layer;
Lang Hames130a7c42015-10-28 02:40:04 +000076 };
77
Lang Hamesec300632017-09-17 03:25:03 +000078 template <>
Lang Hames079df9a2018-10-15 22:56:10 +000079 class GenericLayerImpl<orc::LegacyRTDyldObjectLinkingLayer> : public GenericLayer {
Lang Hamesec300632017-09-17 03:25:03 +000080 private:
Lang Hames079df9a2018-10-15 22:56:10 +000081 using LayerT = orc::LegacyRTDyldObjectLinkingLayer;
Lang Hamesec300632017-09-17 03:25:03 +000082 public:
Lang Hames0976cee2018-02-09 02:30:40 +000083 GenericLayerImpl(LayerT &Layer) : Layer(Layer) {}
Lang Hamesec300632017-09-17 03:25:03 +000084
Lang Hames0976cee2018-02-09 02:30:40 +000085 JITSymbol findSymbolIn(orc::VModuleKey K, const std::string &Name,
Lang Hamesec300632017-09-17 03:25:03 +000086 bool ExportedSymbolsOnly) override {
Lang Hames0976cee2018-02-09 02:30:40 +000087 return Layer.findSymbolIn(K, Name, ExportedSymbolsOnly);
Lang Hamesec300632017-09-17 03:25:03 +000088 }
89
Lang Hames0976cee2018-02-09 02:30:40 +000090 Error removeModule(orc::VModuleKey K) override {
91 return Layer.removeObject(K);
Lang Hames4b546c92018-02-06 21:25:11 +000092 }
Lang Hamesec300632017-09-17 03:25:03 +000093
94 private:
95 LayerT &Layer;
Lang Hamesec300632017-09-17 03:25:03 +000096 };
97
Lang Hames0976cee2018-02-09 02:30:40 +000098 template <typename LayerT>
99 std::unique_ptr<GenericLayerImpl<LayerT>> createGenericLayer(LayerT &Layer) {
100 return llvm::make_unique<GenericLayerImpl<LayerT>>(Layer);
Lang Hames130a7c42015-10-28 02:40:04 +0000101 }
102
Lang Hamesec300632017-09-17 03:25:03 +0000103} // end namespace detail
104
105class OrcCBindingsStack {
106public:
107
108 using CompileCallbackMgr = orc::JITCompileCallbackManager;
Lang Hames079df9a2018-10-15 22:56:10 +0000109 using ObjLayerT = orc::LegacyRTDyldObjectLinkingLayer;
110 using CompileLayerT = orc::LegacyIRCompileLayer<ObjLayerT, orc::SimpleCompiler>;
Lang Hamesec300632017-09-17 03:25:03 +0000111 using CODLayerT =
Lang Hames079df9a2018-10-15 22:56:10 +0000112 orc::LegacyCompileOnDemandLayer<CompileLayerT, CompileCallbackMgr>;
Lang Hamesec300632017-09-17 03:25:03 +0000113
114 using CallbackManagerBuilder =
115 std::function<std::unique_ptr<CompileCallbackMgr>()>;
116
117 using IndirectStubsManagerBuilder = CODLayerT::IndirectStubsManagerBuilderT;
118
119private:
120
121 using OwningObject = object::OwningBinary<object::ObjectFile>;
122
Lang Hames4b546c92018-02-06 21:25:11 +0000123 class CBindingsResolver : public orc::SymbolResolver {
124 public:
125 CBindingsResolver(OrcCBindingsStack &Stack,
126 LLVMOrcSymbolResolverFn ExternalResolver,
127 void *ExternalResolverCtx)
128 : Stack(Stack), ExternalResolver(std::move(ExternalResolver)),
129 ExternalResolverCtx(std::move(ExternalResolverCtx)) {}
130
Lang Hames6cadc7c2018-08-28 21:18:05 +0000131 orc::SymbolNameSet
132 getResponsibilitySet(const orc::SymbolNameSet &Symbols) override {
133 orc::SymbolNameSet Result;
Lang Hames4b546c92018-02-06 21:25:11 +0000134
135 for (auto &S : Symbols) {
Lang Hames6cadc7c2018-08-28 21:18:05 +0000136 if (auto Sym = findSymbol(*S)) {
137 if (!Sym.getFlags().isStrong())
138 Result.insert(S);
139 } else if (auto Err = Sym.takeError()) {
Lang Hames4b546c92018-02-06 21:25:11 +0000140 Stack.reportError(std::move(Err));
Lang Hames6cadc7c2018-08-28 21:18:05 +0000141 return orc::SymbolNameSet();
Lang Hamesd4df0f12018-07-20 18:31:52 +0000142 }
Lang Hames4b546c92018-02-06 21:25:11 +0000143 }
144
Lang Hames6cadc7c2018-08-28 21:18:05 +0000145 return Result;
Lang Hames4b546c92018-02-06 21:25:11 +0000146 }
147
Lang Hamese833fe82018-02-14 22:12:56 +0000148 orc::SymbolNameSet
149 lookup(std::shared_ptr<orc::AsynchronousSymbolQuery> Query,
150 orc::SymbolNameSet Symbols) override {
Lang Hames4b546c92018-02-06 21:25:11 +0000151 orc::SymbolNameSet UnresolvedSymbols;
152
153 for (auto &S : Symbols) {
154 if (auto Sym = findSymbol(*S)) {
Lang Hames253584f2018-06-12 20:43:17 +0000155 if (auto Addr = Sym.getAddress()) {
Lang Hames9d8877b2018-04-12 18:35:08 +0000156 Query->resolve(S, JITEvaluatedSymbol(*Addr, Sym.getFlags()));
Lang Hames253584f2018-06-12 20:43:17 +0000157 Query->notifySymbolReady();
158 } else {
Lang Hamesa48d1082018-07-20 22:22:19 +0000159 Stack.ES.legacyFailQuery(*Query, Addr.takeError());
Lang Hames0ccef9e2018-02-06 22:17:09 +0000160 return orc::SymbolNameSet();
Lang Hames4b546c92018-02-06 21:25:11 +0000161 }
162 } else if (auto Err = Sym.takeError()) {
Lang Hamesa48d1082018-07-20 22:22:19 +0000163 Stack.ES.legacyFailQuery(*Query, std::move(Err));
Lang Hames0ccef9e2018-02-06 22:17:09 +0000164 return orc::SymbolNameSet();
Lang Hames4b546c92018-02-06 21:25:11 +0000165 } else
166 UnresolvedSymbols.insert(S);
167 }
168
Lang Hamesd261e122018-05-16 22:24:30 +0000169 if (Query->isFullyResolved())
170 Query->handleFullyResolved();
171
Lang Hames253584f2018-06-12 20:43:17 +0000172 if (Query->isFullyReady())
173 Query->handleFullyReady();
174
Lang Hames4b546c92018-02-06 21:25:11 +0000175 return UnresolvedSymbols;
176 }
177
178 private:
179 JITSymbol findSymbol(const std::string &Name) {
180 // Search order:
181 // 1. JIT'd symbols.
182 // 2. Runtime overrides.
183 // 3. External resolver (if present).
184
Lang Hames50b33442018-09-26 03:32:12 +0000185 if (Stack.CODLayer) {
186 if (auto Sym = Stack.CODLayer->findSymbol(Name, true))
187 return Sym;
188 else if (auto Err = Sym.takeError())
189 return Sym.takeError();
190 } else {
191 if (auto Sym = Stack.CompileLayer.findSymbol(Name, true))
192 return Sym;
193 else if (auto Err = Sym.takeError())
194 return Sym.takeError();
195 }
Lang Hames4b546c92018-02-06 21:25:11 +0000196
197 if (auto Sym = Stack.CXXRuntimeOverrides.searchOverrides(Name))
198 return Sym;
199
200 if (ExternalResolver)
201 return JITSymbol(ExternalResolver(Name.c_str(), ExternalResolverCtx),
202 JITSymbolFlags::Exported);
203
204 return JITSymbol(nullptr);
205 }
206
207 OrcCBindingsStack &Stack;
208 LLVMOrcSymbolResolverFn ExternalResolver;
209 void *ExternalResolverCtx = nullptr;
210 };
211
Lang Hames130a7c42015-10-28 02:40:04 +0000212public:
Rafael Espindolae63e0182015-11-03 16:40:37 +0000213 OrcCBindingsStack(TargetMachine &TM,
Lang Hames130a7c42015-10-28 02:40:04 +0000214 IndirectStubsManagerBuilder IndirectStubsMgrBuilder)
Lang Hames50b33442018-09-26 03:32:12 +0000215 : CCMgr(createCompileCallbackManager(TM, ES)), DL(TM.createDataLayout()),
216 IndirectStubsMgr(IndirectStubsMgrBuilder()),
Lang Hames4b546c92018-02-06 21:25:11 +0000217 ObjectLayer(ES,
Lang Hames4b546c92018-02-06 21:25:11 +0000218 [this](orc::VModuleKey K) {
219 auto ResolverI = Resolvers.find(K);
220 assert(ResolverI != Resolvers.end() &&
221 "No resolver for module K");
222 auto Resolver = std::move(ResolverI->second);
223 Resolvers.erase(ResolverI);
Lang Hames1cd3dd02018-02-14 22:13:02 +0000224 return ObjLayerT::Resources{
225 std::make_shared<SectionMemoryManager>(), Resolver};
Andres Freund6801fee2018-05-24 21:32:50 +0000226 },
Lang Hamesbd0cb782018-05-30 01:57:45 +0000227 nullptr,
228 [this](orc::VModuleKey K, const object::ObjectFile &Obj,
229 const RuntimeDyld::LoadedObjectInfo &LoadedObjInfo) {
Andres Freund6801fee2018-05-24 21:32:50 +0000230 this->notifyFinalized(K, Obj, LoadedObjInfo);
Lang Hamesbd0cb782018-05-30 01:57:45 +0000231 },
232 [this](orc::VModuleKey K, const object::ObjectFile &Obj) {
Andres Freund6801fee2018-05-24 21:32:50 +0000233 this->notifyFreed(K, Obj);
Lang Hamesbd0cb782018-05-30 01:57:45 +0000234 }),
David Blaikie8ecf9932016-01-20 22:24:26 +0000235 CompileLayer(ObjectLayer, orc::SimpleCompiler(TM)),
Lang Hames50b33442018-09-26 03:32:12 +0000236 CODLayer(createCODLayer(ES, CompileLayer, CCMgr.get(),
237 std::move(IndirectStubsMgrBuilder), Resolvers)),
David Blaikie8ecf9932016-01-20 22:24:26 +0000238 CXXRuntimeOverrides(
239 [this](const std::string &S) { return mangle(S); }) {}
Lang Hames130a7c42015-10-28 02:40:04 +0000240
Lang Hames72d195e2018-09-23 02:09:18 +0000241 Error shutdown() {
Lang Hames130a7c42015-10-28 02:40:04 +0000242 // Run any destructors registered with __cxa_atexit.
243 CXXRuntimeOverrides.runDestructors();
244 // Run any IR destructors.
245 for (auto &DtorRunner : IRStaticDestructorRunners)
Lang Hames4ce98662017-07-07 02:59:13 +0000246 if (auto Err = DtorRunner.runViaLayer(*this))
Lang Hames72d195e2018-09-23 02:09:18 +0000247 return Err;
248 return Error::success();
Lang Hames130a7c42015-10-28 02:40:04 +0000249 }
250
251 std::string mangle(StringRef Name) {
252 std::string MangledName;
253 {
254 raw_string_ostream MangledNameStream(MangledName);
255 Mangler::getNameWithPrefix(MangledNameStream, Name, DL);
256 }
257 return MangledName;
258 }
259
260 template <typename PtrTy>
Lang Hamesad4a9112016-08-01 20:49:11 +0000261 static PtrTy fromTargetAddress(JITTargetAddress Addr) {
Lang Hames130a7c42015-10-28 02:40:04 +0000262 return reinterpret_cast<PtrTy>(static_cast<uintptr_t>(Addr));
263 }
264
Lang Hames72d195e2018-09-23 02:09:18 +0000265 Expected<JITTargetAddress>
266 createLazyCompileCallback(LLVMOrcLazyCompileCallbackFn Callback,
Lang Hamesfd6e8dc2015-10-30 03:20:21 +0000267 void *CallbackCtx) {
Lang Hamesbd0cb782018-05-30 01:57:45 +0000268 auto WrappedCallback = [=]() -> JITTargetAddress {
269 return Callback(wrap(this), CallbackCtx);
270 };
271
Lang Hames72d195e2018-09-23 02:09:18 +0000272 return CCMgr->getCompileCallback(std::move(WrappedCallback));
Lang Hamesfd6e8dc2015-10-30 03:20:21 +0000273 }
274
Lang Hames72d195e2018-09-23 02:09:18 +0000275 Error createIndirectStub(StringRef StubName, JITTargetAddress Addr) {
276 return IndirectStubsMgr->createStub(StubName, Addr,
277 JITSymbolFlags::Exported);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +0000278 }
279
Lang Hames72d195e2018-09-23 02:09:18 +0000280 Error setIndirectStubPointer(StringRef Name, JITTargetAddress Addr) {
281 return IndirectStubsMgr->updatePointer(Name, Addr);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +0000282 }
Lang Hames50b33442018-09-26 03:32:12 +0000283
Lang Hames130a7c42015-10-28 02:40:04 +0000284 template <typename LayerT>
Lang Hames72d195e2018-09-23 02:09:18 +0000285 Expected<orc::VModuleKey>
286 addIRModule(LayerT &Layer, std::unique_ptr<Module> M,
Lang Hames4ce98662017-07-07 02:59:13 +0000287 std::unique_ptr<RuntimeDyld::MemoryManager> MemMgr,
288 LLVMOrcSymbolResolverFn ExternalResolver,
289 void *ExternalResolverCtx) {
290
Lang Hames130a7c42015-10-28 02:40:04 +0000291 // Attach a data-layout if one isn't already present.
292 if (M->getDataLayout().isDefault())
293 M->setDataLayout(DL);
294
295 // Record the static constructors and destructors. We have to do this before
296 // we hand over ownership of the module to the JIT.
297 std::vector<std::string> CtorNames, DtorNames;
298 for (auto Ctor : orc::getConstructors(*M))
299 CtorNames.push_back(mangle(Ctor.Func->getName()));
300 for (auto Dtor : orc::getDestructors(*M))
301 DtorNames.push_back(mangle(Dtor.Func->getName()));
302
Lang Hames130a7c42015-10-28 02:40:04 +0000303 // Add the module to the JIT.
Lang Hames72d195e2018-09-23 02:09:18 +0000304 auto K = ES.allocateVModule();
305 Resolvers[K] = std::make_shared<CBindingsResolver>(*this, ExternalResolver,
306 ExternalResolverCtx);
307 if (auto Err = Layer.addModule(K, std::move(M)))
308 return std::move(Err);
Lang Hames0976cee2018-02-09 02:30:40 +0000309
Lang Hames72d195e2018-09-23 02:09:18 +0000310 KeyLayers[K] = detail::createGenericLayer(Layer);
Lang Hames130a7c42015-10-28 02:40:04 +0000311
312 // Run the static constructors, and save the static destructor runner for
313 // execution when the JIT is torn down.
Lang Hames079df9a2018-10-15 22:56:10 +0000314 orc::LegacyCtorDtorRunner<OrcCBindingsStack> CtorRunner(std::move(CtorNames), K);
Lang Hames4ce98662017-07-07 02:59:13 +0000315 if (auto Err = CtorRunner.runViaLayer(*this))
Lang Hames72d195e2018-09-23 02:09:18 +0000316 return std::move(Err);
Lang Hames130a7c42015-10-28 02:40:04 +0000317
Lang Hames72d195e2018-09-23 02:09:18 +0000318 IRStaticDestructorRunners.emplace_back(std::move(DtorNames), K);
Lang Hames130a7c42015-10-28 02:40:04 +0000319
Lang Hames72d195e2018-09-23 02:09:18 +0000320 return K;
Lang Hames130a7c42015-10-28 02:40:04 +0000321 }
322
Lang Hames72d195e2018-09-23 02:09:18 +0000323 Expected<orc::VModuleKey>
324 addIRModuleEager(std::unique_ptr<Module> M,
325 LLVMOrcSymbolResolverFn ExternalResolver,
326 void *ExternalResolverCtx) {
327 return addIRModule(CompileLayer, std::move(M),
Lang Hames130a7c42015-10-28 02:40:04 +0000328 llvm::make_unique<SectionMemoryManager>(),
329 std::move(ExternalResolver), ExternalResolverCtx);
330 }
331
Lang Hames72d195e2018-09-23 02:09:18 +0000332 Expected<orc::VModuleKey>
333 addIRModuleLazy(std::unique_ptr<Module> M,
334 LLVMOrcSymbolResolverFn ExternalResolver,
335 void *ExternalResolverCtx) {
Lang Hames50b33442018-09-26 03:32:12 +0000336 if (!CODLayer)
337 return make_error<StringError>("Can not add lazy module: No compile "
338 "callback manager available",
339 inconvertibleErrorCode());
340
341 return addIRModule(*CODLayer, std::move(M),
Lang Hames1fa0e0e2016-04-25 21:21:20 +0000342 llvm::make_unique<SectionMemoryManager>(),
Lang Hames130a7c42015-10-28 02:40:04 +0000343 std::move(ExternalResolver), ExternalResolverCtx);
344 }
345
Lang Hames72d195e2018-09-23 02:09:18 +0000346 Error removeModule(orc::VModuleKey K) {
Lang Hames0976cee2018-02-09 02:30:40 +0000347 // FIXME: Should error release the module key?
348 if (auto Err = KeyLayers[K]->removeModule(K))
Lang Hames72d195e2018-09-23 02:09:18 +0000349 return Err;
Lang Hames0976cee2018-02-09 02:30:40 +0000350 ES.releaseVModule(K);
351 KeyLayers.erase(K);
Lang Hames72d195e2018-09-23 02:09:18 +0000352 return Error::success();
Lang Hames130a7c42015-10-28 02:40:04 +0000353 }
354
Lang Hames72d195e2018-09-23 02:09:18 +0000355 Expected<orc::VModuleKey> addObject(std::unique_ptr<MemoryBuffer> ObjBuffer,
356 LLVMOrcSymbolResolverFn ExternalResolver,
357 void *ExternalResolverCtx) {
Lang Hames589eece2018-02-21 21:55:49 +0000358 if (auto Obj = object::ObjectFile::createObjectFile(
359 ObjBuffer->getMemBufferRef())) {
Lang Hamesec300632017-09-17 03:25:03 +0000360
Lang Hames72d195e2018-09-23 02:09:18 +0000361 auto K = ES.allocateVModule();
362 Resolvers[K] = std::make_shared<CBindingsResolver>(
Lang Hames4b546c92018-02-06 21:25:11 +0000363 *this, ExternalResolver, ExternalResolverCtx);
Lang Hamesec300632017-09-17 03:25:03 +0000364
Lang Hames72d195e2018-09-23 02:09:18 +0000365 if (auto Err = ObjectLayer.addObject(K, std::move(ObjBuffer)))
366 return std::move(Err);
Lang Hamesec300632017-09-17 03:25:03 +0000367
Lang Hames72d195e2018-09-23 02:09:18 +0000368 KeyLayers[K] = detail::createGenericLayer(ObjectLayer);
Lang Hamesec300632017-09-17 03:25:03 +0000369
Lang Hames72d195e2018-09-23 02:09:18 +0000370 return K;
Lang Hamesec300632017-09-17 03:25:03 +0000371 } else
Lang Hames72d195e2018-09-23 02:09:18 +0000372 return Obj.takeError();
Lang Hamesec300632017-09-17 03:25:03 +0000373 }
374
Lang Hames4ce98662017-07-07 02:59:13 +0000375 JITSymbol findSymbol(const std::string &Name,
376 bool ExportedSymbolsOnly) {
Lang Hamesfd6e8dc2015-10-30 03:20:21 +0000377 if (auto Sym = IndirectStubsMgr->findStub(Name, ExportedSymbolsOnly))
378 return Sym;
Lang Hames50b33442018-09-26 03:32:12 +0000379 if (CODLayer)
380 return CODLayer->findSymbol(mangle(Name), ExportedSymbolsOnly);
381 return CompileLayer.findSymbol(mangle(Name), ExportedSymbolsOnly);
Lang Hames130a7c42015-10-28 02:40:04 +0000382 }
383
Lang Hames0976cee2018-02-09 02:30:40 +0000384 JITSymbol findSymbolIn(orc::VModuleKey K, const std::string &Name,
Lang Hamesad4a9112016-08-01 20:49:11 +0000385 bool ExportedSymbolsOnly) {
Andres Freund54ddd742018-05-24 18:44:34 +0000386 assert(KeyLayers.count(K) && "looking up symbol in unknown module");
Andres Freundac15cab2018-05-24 17:03:06 +0000387 return KeyLayers[K]->findSymbolIn(K, mangle(Name), ExportedSymbolsOnly);
Lang Hames130a7c42015-10-28 02:40:04 +0000388 }
389
Lang Hames72d195e2018-09-23 02:09:18 +0000390 Expected<JITTargetAddress> findSymbolAddress(const std::string &Name,
391 bool ExportedSymbolsOnly) {
Lang Hames4ce98662017-07-07 02:59:13 +0000392 if (auto Sym = findSymbol(Name, ExportedSymbolsOnly)) {
393 // Successful lookup, non-null symbol:
Lang Hames72d195e2018-09-23 02:09:18 +0000394 if (auto AddrOrErr = Sym.getAddress())
395 return *AddrOrErr;
396 else
397 return AddrOrErr.takeError();
Lang Hames4ce98662017-07-07 02:59:13 +0000398 } else if (auto Err = Sym.takeError()) {
399 // Lookup failure - report error.
Lang Hames72d195e2018-09-23 02:09:18 +0000400 return std::move(Err);
Lang Hames4ce98662017-07-07 02:59:13 +0000401 }
Lang Hames72d195e2018-09-23 02:09:18 +0000402
403 // No symbol not found. Return 0.
404 return 0;
Lang Hames4ce98662017-07-07 02:59:13 +0000405 }
406
Lang Hames72d195e2018-09-23 02:09:18 +0000407 Expected<JITTargetAddress> findSymbolAddressIn(orc::VModuleKey K,
408 const std::string &Name,
409 bool ExportedSymbolsOnly) {
Andres Freund54ddd742018-05-24 18:44:34 +0000410 if (auto Sym = findSymbolIn(K, Name, ExportedSymbolsOnly)) {
411 // Successful lookup, non-null symbol:
Lang Hames72d195e2018-09-23 02:09:18 +0000412 if (auto AddrOrErr = Sym.getAddress())
413 return *AddrOrErr;
414 else
415 return AddrOrErr.takeError();
Andres Freund54ddd742018-05-24 18:44:34 +0000416 } else if (auto Err = Sym.takeError()) {
417 // Lookup failure - report error.
Lang Hames72d195e2018-09-23 02:09:18 +0000418 return std::move(Err);
Andres Freund54ddd742018-05-24 18:44:34 +0000419 }
Lang Hames72d195e2018-09-23 02:09:18 +0000420
421 // Symbol not found. Return 0.
422 return 0;
Andres Freund54ddd742018-05-24 18:44:34 +0000423 }
424
Lang Hames1fa0e0e2016-04-25 21:21:20 +0000425 const std::string &getErrorMessage() const { return ErrMsg; }
Lang Hamesef5a0ee2016-04-25 19:56:45 +0000426
Andres Freund6801fee2018-05-24 21:32:50 +0000427 void RegisterJITEventListener(JITEventListener *L) {
428 if (!L)
429 return;
430 EventListeners.push_back(L);
431 }
432
433 void UnregisterJITEventListener(JITEventListener *L) {
434 if (!L)
435 return;
436
437 auto I = find(reverse(EventListeners), L);
438 if (I != EventListeners.rend()) {
439 std::swap(*I, EventListeners.back());
440 EventListeners.pop_back();
441 }
442 }
443
Lang Hames130a7c42015-10-28 02:40:04 +0000444private:
Lang Hames50b33442018-09-26 03:32:12 +0000445 using ResolverMap =
446 std::map<orc::VModuleKey, std::shared_ptr<orc::SymbolResolver>>;
447
448 static std::unique_ptr<CompileCallbackMgr>
449 createCompileCallbackManager(TargetMachine &TM, orc::ExecutionSession &ES) {
450 auto CCMgr = createLocalCompileCallbackManager(TM.getTargetTriple(), ES, 0);
451 if (!CCMgr) {
452 // FIXME: It would be good if we could report this somewhere, but we do
453 // have an instance yet.
454 logAllUnhandledErrors(CCMgr.takeError(), errs(), "ORC error: ");
455 return nullptr;
456 }
457 return std::move(*CCMgr);
458 }
459
460 static std::unique_ptr<CODLayerT>
461 createCODLayer(orc::ExecutionSession &ES, CompileLayerT &CompileLayer,
462 CompileCallbackMgr *CCMgr,
463 IndirectStubsManagerBuilder IndirectStubsMgrBuilder,
464 ResolverMap &Resolvers) {
465 // If there is no compile callback manager available we can not create a
466 // compile on demand layer.
467 if (!CCMgr)
468 return nullptr;
469
470 return llvm::make_unique<CODLayerT>(
471 ES, CompileLayer,
472 [&Resolvers](orc::VModuleKey K) {
473 auto ResolverI = Resolvers.find(K);
474 assert(ResolverI != Resolvers.end() && "No resolver for module K");
475 return ResolverI->second;
476 },
477 [&Resolvers](orc::VModuleKey K,
478 std::shared_ptr<orc::SymbolResolver> Resolver) {
479 assert(!Resolvers.count(K) && "Resolver already present");
480 Resolvers[K] = std::move(Resolver);
481 },
482 [](Function &F) { return std::set<Function *>({&F}); }, *CCMgr,
483 std::move(IndirectStubsMgrBuilder), false);
484 }
Lang Hames130a7c42015-10-28 02:40:04 +0000485
Lang Hames4b546c92018-02-06 21:25:11 +0000486 void reportError(Error Err) {
487 // FIXME: Report errors on the execution session.
488 logAllUnhandledErrors(std::move(Err), errs(), "ORC error: ");
489 };
490
Andres Freund6801fee2018-05-24 21:32:50 +0000491 void notifyFinalized(orc::VModuleKey K,
492 const object::ObjectFile &Obj,
493 const RuntimeDyld::LoadedObjectInfo &LoadedObjInfo) {
Lang Hameseca6d4b2018-12-04 00:55:15 +0000494 uint64_t Key = static_cast<uint64_t>(
495 reinterpret_cast<uintptr_t>(Obj.getData().data()));
Andres Freund6801fee2018-05-24 21:32:50 +0000496 for (auto &Listener : EventListeners)
Lang Hameseca6d4b2018-12-04 00:55:15 +0000497 Listener->notifyObjectLoaded(Key, Obj, LoadedObjInfo);
Andres Freund6801fee2018-05-24 21:32:50 +0000498 }
499
500 void notifyFreed(orc::VModuleKey K, const object::ObjectFile &Obj) {
Lang Hameseca6d4b2018-12-04 00:55:15 +0000501 uint64_t Key = static_cast<uint64_t>(
502 reinterpret_cast<uintptr_t>(Obj.getData().data()));
Andres Freund6801fee2018-05-24 21:32:50 +0000503 for (auto &Listener : EventListeners)
Lang Hameseca6d4b2018-12-04 00:55:15 +0000504 Listener->notifyFreeingObject(Key);
Andres Freund6801fee2018-05-24 21:32:50 +0000505 }
506
Lang Hames4b546c92018-02-06 21:25:11 +0000507 orc::ExecutionSession ES;
Lang Hamesbd0cb782018-05-30 01:57:45 +0000508 std::unique_ptr<CompileCallbackMgr> CCMgr;
Lang Hames4b546c92018-02-06 21:25:11 +0000509
Andres Freund6801fee2018-05-24 21:32:50 +0000510 std::vector<JITEventListener *> EventListeners;
511
Lang Hames130a7c42015-10-28 02:40:04 +0000512 DataLayout DL;
513 SectionMemoryManager CCMgrMemMgr;
514
Lang Hames6c3e7902016-01-20 17:39:52 +0000515 std::unique_ptr<orc::IndirectStubsManager> IndirectStubsMgr;
516
Lang Hames130a7c42015-10-28 02:40:04 +0000517 ObjLayerT ObjectLayer;
518 CompileLayerT CompileLayer;
Lang Hames50b33442018-09-26 03:32:12 +0000519 std::unique_ptr<CODLayerT> CODLayer;
Lang Hames130a7c42015-10-28 02:40:04 +0000520
Lang Hames0976cee2018-02-09 02:30:40 +0000521 std::map<orc::VModuleKey, std::unique_ptr<detail::GenericLayer>> KeyLayers;
Lang Hames130a7c42015-10-28 02:40:04 +0000522
Lang Hames079df9a2018-10-15 22:56:10 +0000523 orc::LegacyLocalCXXRuntimeOverrides CXXRuntimeOverrides;
524 std::vector<orc::LegacyCtorDtorRunner<OrcCBindingsStack>> IRStaticDestructorRunners;
Lang Hamesef5a0ee2016-04-25 19:56:45 +0000525 std::string ErrMsg;
Lang Hames4b546c92018-02-06 21:25:11 +0000526
Lang Hames50b33442018-09-26 03:32:12 +0000527 ResolverMap Resolvers;
Lang Hames130a7c42015-10-28 02:40:04 +0000528};
529
530} // end namespace llvm
531
532#endif // LLVM_LIB_EXECUTIONENGINE_ORC_ORCCBINDINGSSTACK_H