annotate llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h @ 181:df311c476dd5

CreateIdentifierInfo in ParseCbC (not yet worked)
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 31 May 2020 12:30:11 +0900
parents 1d019706d866
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- OrcCBindingsStack.h - Orc JIT stack for C bindings -----*- C++ -*---===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #ifndef LLVM_LIB_EXECUTIONENGINE_ORC_ORCCBINDINGSSTACK_H
anatofuz
parents:
diff changeset
10 #define LLVM_LIB_EXECUTIONENGINE_ORC_ORCCBINDINGSSTACK_H
anatofuz
parents:
diff changeset
11
anatofuz
parents:
diff changeset
12 #include "llvm-c/OrcBindings.h"
anatofuz
parents:
diff changeset
13 #include "llvm-c/TargetMachine.h"
anatofuz
parents:
diff changeset
14 #include "llvm/ADT/STLExtras.h"
anatofuz
parents:
diff changeset
15 #include "llvm/ADT/StringRef.h"
anatofuz
parents:
diff changeset
16 #include "llvm/ExecutionEngine/JITSymbol.h"
anatofuz
parents:
diff changeset
17 #include "llvm/ExecutionEngine/JITEventListener.h"
anatofuz
parents:
diff changeset
18 #include "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h"
anatofuz
parents:
diff changeset
19 #include "llvm/ExecutionEngine/Orc/CompileUtils.h"
anatofuz
parents:
diff changeset
20 #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
anatofuz
parents:
diff changeset
21 #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
anatofuz
parents:
diff changeset
22 #include "llvm/ExecutionEngine/Orc/LambdaResolver.h"
anatofuz
parents:
diff changeset
23 #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"
anatofuz
parents:
diff changeset
24 #include "llvm/ExecutionEngine/RuntimeDyld.h"
anatofuz
parents:
diff changeset
25 #include "llvm/ExecutionEngine/SectionMemoryManager.h"
anatofuz
parents:
diff changeset
26 #include "llvm/IR/DataLayout.h"
anatofuz
parents:
diff changeset
27 #include "llvm/IR/Mangler.h"
anatofuz
parents:
diff changeset
28 #include "llvm/IR/Module.h"
anatofuz
parents:
diff changeset
29 #include "llvm/Support/CBindingWrapping.h"
anatofuz
parents:
diff changeset
30 #include "llvm/Support/Error.h"
anatofuz
parents:
diff changeset
31 #include "llvm/Support/raw_ostream.h"
anatofuz
parents:
diff changeset
32 #include "llvm/Target/TargetMachine.h"
anatofuz
parents:
diff changeset
33 #include <algorithm>
anatofuz
parents:
diff changeset
34 #include <cstdint>
anatofuz
parents:
diff changeset
35 #include <functional>
anatofuz
parents:
diff changeset
36 #include <map>
anatofuz
parents:
diff changeset
37 #include <memory>
anatofuz
parents:
diff changeset
38 #include <set>
anatofuz
parents:
diff changeset
39 #include <string>
anatofuz
parents:
diff changeset
40 #include <vector>
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 namespace llvm {
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44 class OrcCBindingsStack;
anatofuz
parents:
diff changeset
45
anatofuz
parents:
diff changeset
46 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcCBindingsStack, LLVMOrcJITStackRef)
anatofuz
parents:
diff changeset
47 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef)
anatofuz
parents:
diff changeset
48
anatofuz
parents:
diff changeset
49 namespace detail {
anatofuz
parents:
diff changeset
50
anatofuz
parents:
diff changeset
51 // FIXME: Kill this off once the Layer concept becomes an interface.
anatofuz
parents:
diff changeset
52 class GenericLayer {
anatofuz
parents:
diff changeset
53 public:
anatofuz
parents:
diff changeset
54 virtual ~GenericLayer() = default;
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 virtual JITSymbol findSymbolIn(orc::VModuleKey K, const std::string &Name,
anatofuz
parents:
diff changeset
57 bool ExportedSymbolsOnly) = 0;
anatofuz
parents:
diff changeset
58 virtual Error removeModule(orc::VModuleKey K) = 0;
anatofuz
parents:
diff changeset
59 };
anatofuz
parents:
diff changeset
60
anatofuz
parents:
diff changeset
61 template <typename LayerT> class GenericLayerImpl : public GenericLayer {
anatofuz
parents:
diff changeset
62 public:
anatofuz
parents:
diff changeset
63 GenericLayerImpl(LayerT &Layer) : Layer(Layer) {}
anatofuz
parents:
diff changeset
64
anatofuz
parents:
diff changeset
65 JITSymbol findSymbolIn(orc::VModuleKey K, const std::string &Name,
anatofuz
parents:
diff changeset
66 bool ExportedSymbolsOnly) override {
anatofuz
parents:
diff changeset
67 return Layer.findSymbolIn(K, Name, ExportedSymbolsOnly);
anatofuz
parents:
diff changeset
68 }
anatofuz
parents:
diff changeset
69
anatofuz
parents:
diff changeset
70 Error removeModule(orc::VModuleKey K) override {
anatofuz
parents:
diff changeset
71 return Layer.removeModule(K);
anatofuz
parents:
diff changeset
72 }
anatofuz
parents:
diff changeset
73
anatofuz
parents:
diff changeset
74 private:
anatofuz
parents:
diff changeset
75 LayerT &Layer;
anatofuz
parents:
diff changeset
76 };
anatofuz
parents:
diff changeset
77
anatofuz
parents:
diff changeset
78 template <>
anatofuz
parents:
diff changeset
79 class GenericLayerImpl<orc::LegacyRTDyldObjectLinkingLayer> : public GenericLayer {
anatofuz
parents:
diff changeset
80 private:
anatofuz
parents:
diff changeset
81 using LayerT = orc::LegacyRTDyldObjectLinkingLayer;
anatofuz
parents:
diff changeset
82 public:
anatofuz
parents:
diff changeset
83 GenericLayerImpl(LayerT &Layer) : Layer(Layer) {}
anatofuz
parents:
diff changeset
84
anatofuz
parents:
diff changeset
85 JITSymbol findSymbolIn(orc::VModuleKey K, const std::string &Name,
anatofuz
parents:
diff changeset
86 bool ExportedSymbolsOnly) override {
anatofuz
parents:
diff changeset
87 return Layer.findSymbolIn(K, Name, ExportedSymbolsOnly);
anatofuz
parents:
diff changeset
88 }
anatofuz
parents:
diff changeset
89
anatofuz
parents:
diff changeset
90 Error removeModule(orc::VModuleKey K) override {
anatofuz
parents:
diff changeset
91 return Layer.removeObject(K);
anatofuz
parents:
diff changeset
92 }
anatofuz
parents:
diff changeset
93
anatofuz
parents:
diff changeset
94 private:
anatofuz
parents:
diff changeset
95 LayerT &Layer;
anatofuz
parents:
diff changeset
96 };
anatofuz
parents:
diff changeset
97
anatofuz
parents:
diff changeset
98 template <typename LayerT>
anatofuz
parents:
diff changeset
99 std::unique_ptr<GenericLayerImpl<LayerT>> createGenericLayer(LayerT &Layer) {
anatofuz
parents:
diff changeset
100 return std::make_unique<GenericLayerImpl<LayerT>>(Layer);
anatofuz
parents:
diff changeset
101 }
anatofuz
parents:
diff changeset
102
anatofuz
parents:
diff changeset
103 } // end namespace detail
anatofuz
parents:
diff changeset
104
anatofuz
parents:
diff changeset
105 class OrcCBindingsStack {
anatofuz
parents:
diff changeset
106 public:
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 using CompileCallbackMgr = orc::JITCompileCallbackManager;
anatofuz
parents:
diff changeset
109 using ObjLayerT = orc::LegacyRTDyldObjectLinkingLayer;
anatofuz
parents:
diff changeset
110 using CompileLayerT = orc::LegacyIRCompileLayer<ObjLayerT, orc::SimpleCompiler>;
anatofuz
parents:
diff changeset
111 using CODLayerT =
anatofuz
parents:
diff changeset
112 orc::LegacyCompileOnDemandLayer<CompileLayerT, CompileCallbackMgr>;
anatofuz
parents:
diff changeset
113
anatofuz
parents:
diff changeset
114 using CallbackManagerBuilder =
anatofuz
parents:
diff changeset
115 std::function<std::unique_ptr<CompileCallbackMgr>()>;
anatofuz
parents:
diff changeset
116
anatofuz
parents:
diff changeset
117 using IndirectStubsManagerBuilder = CODLayerT::IndirectStubsManagerBuilderT;
anatofuz
parents:
diff changeset
118
anatofuz
parents:
diff changeset
119 private:
anatofuz
parents:
diff changeset
120
anatofuz
parents:
diff changeset
121 using OwningObject = object::OwningBinary<object::ObjectFile>;
anatofuz
parents:
diff changeset
122
anatofuz
parents:
diff changeset
123 class CBindingsResolver : public orc::SymbolResolver {
anatofuz
parents:
diff changeset
124 public:
anatofuz
parents:
diff changeset
125 CBindingsResolver(OrcCBindingsStack &Stack,
anatofuz
parents:
diff changeset
126 LLVMOrcSymbolResolverFn ExternalResolver,
anatofuz
parents:
diff changeset
127 void *ExternalResolverCtx)
anatofuz
parents:
diff changeset
128 : Stack(Stack), ExternalResolver(std::move(ExternalResolver)),
anatofuz
parents:
diff changeset
129 ExternalResolverCtx(std::move(ExternalResolverCtx)) {}
anatofuz
parents:
diff changeset
130
anatofuz
parents:
diff changeset
131 orc::SymbolNameSet
anatofuz
parents:
diff changeset
132 getResponsibilitySet(const orc::SymbolNameSet &Symbols) override {
anatofuz
parents:
diff changeset
133 orc::SymbolNameSet Result;
anatofuz
parents:
diff changeset
134
anatofuz
parents:
diff changeset
135 for (auto &S : Symbols) {
anatofuz
parents:
diff changeset
136 if (auto Sym = findSymbol(std::string(*S))) {
anatofuz
parents:
diff changeset
137 if (!Sym.getFlags().isStrong())
anatofuz
parents:
diff changeset
138 Result.insert(S);
anatofuz
parents:
diff changeset
139 } else if (auto Err = Sym.takeError()) {
anatofuz
parents:
diff changeset
140 Stack.reportError(std::move(Err));
anatofuz
parents:
diff changeset
141 return orc::SymbolNameSet();
anatofuz
parents:
diff changeset
142 }
anatofuz
parents:
diff changeset
143 }
anatofuz
parents:
diff changeset
144
anatofuz
parents:
diff changeset
145 return Result;
anatofuz
parents:
diff changeset
146 }
anatofuz
parents:
diff changeset
147
anatofuz
parents:
diff changeset
148 orc::SymbolNameSet
anatofuz
parents:
diff changeset
149 lookup(std::shared_ptr<orc::AsynchronousSymbolQuery> Query,
anatofuz
parents:
diff changeset
150 orc::SymbolNameSet Symbols) override {
anatofuz
parents:
diff changeset
151 orc::SymbolNameSet UnresolvedSymbols;
anatofuz
parents:
diff changeset
152
anatofuz
parents:
diff changeset
153 for (auto &S : Symbols) {
anatofuz
parents:
diff changeset
154 if (auto Sym = findSymbol(std::string(*S))) {
anatofuz
parents:
diff changeset
155 if (auto Addr = Sym.getAddress()) {
anatofuz
parents:
diff changeset
156 Query->notifySymbolMetRequiredState(
anatofuz
parents:
diff changeset
157 S, JITEvaluatedSymbol(*Addr, Sym.getFlags()));
anatofuz
parents:
diff changeset
158 } else {
anatofuz
parents:
diff changeset
159 Stack.ES.legacyFailQuery(*Query, Addr.takeError());
anatofuz
parents:
diff changeset
160 return orc::SymbolNameSet();
anatofuz
parents:
diff changeset
161 }
anatofuz
parents:
diff changeset
162 } else if (auto Err = Sym.takeError()) {
anatofuz
parents:
diff changeset
163 Stack.ES.legacyFailQuery(*Query, std::move(Err));
anatofuz
parents:
diff changeset
164 return orc::SymbolNameSet();
anatofuz
parents:
diff changeset
165 } else
anatofuz
parents:
diff changeset
166 UnresolvedSymbols.insert(S);
anatofuz
parents:
diff changeset
167 }
anatofuz
parents:
diff changeset
168
anatofuz
parents:
diff changeset
169 if (Query->isComplete())
anatofuz
parents:
diff changeset
170 Query->handleComplete();
anatofuz
parents:
diff changeset
171
anatofuz
parents:
diff changeset
172 return UnresolvedSymbols;
anatofuz
parents:
diff changeset
173 }
anatofuz
parents:
diff changeset
174
anatofuz
parents:
diff changeset
175 private:
anatofuz
parents:
diff changeset
176 JITSymbol findSymbol(const std::string &Name) {
anatofuz
parents:
diff changeset
177 // Search order:
anatofuz
parents:
diff changeset
178 // 1. JIT'd symbols.
anatofuz
parents:
diff changeset
179 // 2. Runtime overrides.
anatofuz
parents:
diff changeset
180 // 3. External resolver (if present).
anatofuz
parents:
diff changeset
181
anatofuz
parents:
diff changeset
182 if (Stack.CODLayer) {
anatofuz
parents:
diff changeset
183 if (auto Sym = Stack.CODLayer->findSymbol(Name, true))
anatofuz
parents:
diff changeset
184 return Sym;
anatofuz
parents:
diff changeset
185 else if (auto Err = Sym.takeError())
anatofuz
parents:
diff changeset
186 return Sym.takeError();
anatofuz
parents:
diff changeset
187 } else {
anatofuz
parents:
diff changeset
188 if (auto Sym = Stack.CompileLayer.findSymbol(Name, true))
anatofuz
parents:
diff changeset
189 return Sym;
anatofuz
parents:
diff changeset
190 else if (auto Err = Sym.takeError())
anatofuz
parents:
diff changeset
191 return Sym.takeError();
anatofuz
parents:
diff changeset
192 }
anatofuz
parents:
diff changeset
193
anatofuz
parents:
diff changeset
194 if (auto Sym = Stack.CXXRuntimeOverrides.searchOverrides(Name))
anatofuz
parents:
diff changeset
195 return Sym;
anatofuz
parents:
diff changeset
196
anatofuz
parents:
diff changeset
197 if (ExternalResolver)
anatofuz
parents:
diff changeset
198 return JITSymbol(ExternalResolver(Name.c_str(), ExternalResolverCtx),
anatofuz
parents:
diff changeset
199 JITSymbolFlags::Exported);
anatofuz
parents:
diff changeset
200
anatofuz
parents:
diff changeset
201 return JITSymbol(nullptr);
anatofuz
parents:
diff changeset
202 }
anatofuz
parents:
diff changeset
203
anatofuz
parents:
diff changeset
204 OrcCBindingsStack &Stack;
anatofuz
parents:
diff changeset
205 LLVMOrcSymbolResolverFn ExternalResolver;
anatofuz
parents:
diff changeset
206 void *ExternalResolverCtx = nullptr;
anatofuz
parents:
diff changeset
207 };
anatofuz
parents:
diff changeset
208
anatofuz
parents:
diff changeset
209 public:
anatofuz
parents:
diff changeset
210 OrcCBindingsStack(TargetMachine &TM,
anatofuz
parents:
diff changeset
211 IndirectStubsManagerBuilder IndirectStubsMgrBuilder)
anatofuz
parents:
diff changeset
212 : CCMgr(createCompileCallbackManager(TM, ES)), DL(TM.createDataLayout()),
anatofuz
parents:
diff changeset
213 IndirectStubsMgr(IndirectStubsMgrBuilder()),
anatofuz
parents:
diff changeset
214 ObjectLayer(
anatofuz
parents:
diff changeset
215 AcknowledgeORCv1Deprecation, ES,
anatofuz
parents:
diff changeset
216 [this](orc::VModuleKey K) {
anatofuz
parents:
diff changeset
217 auto ResolverI = Resolvers.find(K);
anatofuz
parents:
diff changeset
218 assert(ResolverI != Resolvers.end() &&
anatofuz
parents:
diff changeset
219 "No resolver for module K");
anatofuz
parents:
diff changeset
220 auto Resolver = std::move(ResolverI->second);
anatofuz
parents:
diff changeset
221 Resolvers.erase(ResolverI);
anatofuz
parents:
diff changeset
222 return ObjLayerT::Resources{
anatofuz
parents:
diff changeset
223 std::make_shared<SectionMemoryManager>(), Resolver};
anatofuz
parents:
diff changeset
224 },
anatofuz
parents:
diff changeset
225 nullptr,
anatofuz
parents:
diff changeset
226 [this](orc::VModuleKey K, const object::ObjectFile &Obj,
anatofuz
parents:
diff changeset
227 const RuntimeDyld::LoadedObjectInfo &LoadedObjInfo) {
anatofuz
parents:
diff changeset
228 this->notifyFinalized(K, Obj, LoadedObjInfo);
anatofuz
parents:
diff changeset
229 },
anatofuz
parents:
diff changeset
230 [this](orc::VModuleKey K, const object::ObjectFile &Obj) {
anatofuz
parents:
diff changeset
231 this->notifyFreed(K, Obj);
anatofuz
parents:
diff changeset
232 }),
anatofuz
parents:
diff changeset
233 CompileLayer(AcknowledgeORCv1Deprecation, ObjectLayer,
anatofuz
parents:
diff changeset
234 orc::SimpleCompiler(TM)),
anatofuz
parents:
diff changeset
235 CODLayer(createCODLayer(ES, CompileLayer, CCMgr.get(),
anatofuz
parents:
diff changeset
236 std::move(IndirectStubsMgrBuilder), Resolvers)),
anatofuz
parents:
diff changeset
237 CXXRuntimeOverrides(
anatofuz
parents:
diff changeset
238 AcknowledgeORCv1Deprecation,
anatofuz
parents:
diff changeset
239 [this](const std::string &S) { return mangle(S); }) {}
anatofuz
parents:
diff changeset
240
anatofuz
parents:
diff changeset
241 Error shutdown() {
anatofuz
parents:
diff changeset
242 // Run any destructors registered with __cxa_atexit.
anatofuz
parents:
diff changeset
243 CXXRuntimeOverrides.runDestructors();
anatofuz
parents:
diff changeset
244 // Run any IR destructors.
anatofuz
parents:
diff changeset
245 for (auto &DtorRunner : IRStaticDestructorRunners)
anatofuz
parents:
diff changeset
246 if (auto Err = DtorRunner.runViaLayer(*this))
anatofuz
parents:
diff changeset
247 return Err;
anatofuz
parents:
diff changeset
248 return Error::success();
anatofuz
parents:
diff changeset
249 }
anatofuz
parents:
diff changeset
250
anatofuz
parents:
diff changeset
251 std::string mangle(StringRef Name) {
anatofuz
parents:
diff changeset
252 std::string MangledName;
anatofuz
parents:
diff changeset
253 {
anatofuz
parents:
diff changeset
254 raw_string_ostream MangledNameStream(MangledName);
anatofuz
parents:
diff changeset
255 Mangler::getNameWithPrefix(MangledNameStream, Name, DL);
anatofuz
parents:
diff changeset
256 }
anatofuz
parents:
diff changeset
257 return MangledName;
anatofuz
parents:
diff changeset
258 }
anatofuz
parents:
diff changeset
259
anatofuz
parents:
diff changeset
260 template <typename PtrTy>
anatofuz
parents:
diff changeset
261 static PtrTy fromTargetAddress(JITTargetAddress Addr) {
anatofuz
parents:
diff changeset
262 return reinterpret_cast<PtrTy>(static_cast<uintptr_t>(Addr));
anatofuz
parents:
diff changeset
263 }
anatofuz
parents:
diff changeset
264
anatofuz
parents:
diff changeset
265 Expected<JITTargetAddress>
anatofuz
parents:
diff changeset
266 createLazyCompileCallback(LLVMOrcLazyCompileCallbackFn Callback,
anatofuz
parents:
diff changeset
267 void *CallbackCtx) {
anatofuz
parents:
diff changeset
268 auto WrappedCallback = [=]() -> JITTargetAddress {
anatofuz
parents:
diff changeset
269 return Callback(wrap(this), CallbackCtx);
anatofuz
parents:
diff changeset
270 };
anatofuz
parents:
diff changeset
271
anatofuz
parents:
diff changeset
272 return CCMgr->getCompileCallback(std::move(WrappedCallback));
anatofuz
parents:
diff changeset
273 }
anatofuz
parents:
diff changeset
274
anatofuz
parents:
diff changeset
275 Error createIndirectStub(StringRef StubName, JITTargetAddress Addr) {
anatofuz
parents:
diff changeset
276 return IndirectStubsMgr->createStub(StubName, Addr,
anatofuz
parents:
diff changeset
277 JITSymbolFlags::Exported);
anatofuz
parents:
diff changeset
278 }
anatofuz
parents:
diff changeset
279
anatofuz
parents:
diff changeset
280 Error setIndirectStubPointer(StringRef Name, JITTargetAddress Addr) {
anatofuz
parents:
diff changeset
281 return IndirectStubsMgr->updatePointer(Name, Addr);
anatofuz
parents:
diff changeset
282 }
anatofuz
parents:
diff changeset
283
anatofuz
parents:
diff changeset
284 template <typename LayerT>
anatofuz
parents:
diff changeset
285 Expected<orc::VModuleKey>
anatofuz
parents:
diff changeset
286 addIRModule(LayerT &Layer, std::unique_ptr<Module> M,
anatofuz
parents:
diff changeset
287 std::unique_ptr<RuntimeDyld::MemoryManager> MemMgr,
anatofuz
parents:
diff changeset
288 LLVMOrcSymbolResolverFn ExternalResolver,
anatofuz
parents:
diff changeset
289 void *ExternalResolverCtx) {
anatofuz
parents:
diff changeset
290
anatofuz
parents:
diff changeset
291 // Attach a data-layout if one isn't already present.
anatofuz
parents:
diff changeset
292 if (M->getDataLayout().isDefault())
anatofuz
parents:
diff changeset
293 M->setDataLayout(DL);
anatofuz
parents:
diff changeset
294
anatofuz
parents:
diff changeset
295 // Record the static constructors and destructors. We have to do this before
anatofuz
parents:
diff changeset
296 // we hand over ownership of the module to the JIT.
anatofuz
parents:
diff changeset
297 std::vector<std::string> CtorNames, DtorNames;
anatofuz
parents:
diff changeset
298 for (auto Ctor : orc::getConstructors(*M))
anatofuz
parents:
diff changeset
299 CtorNames.push_back(mangle(Ctor.Func->getName()));
anatofuz
parents:
diff changeset
300 for (auto Dtor : orc::getDestructors(*M))
anatofuz
parents:
diff changeset
301 DtorNames.push_back(mangle(Dtor.Func->getName()));
anatofuz
parents:
diff changeset
302
anatofuz
parents:
diff changeset
303 // Add the module to the JIT.
anatofuz
parents:
diff changeset
304 auto K = ES.allocateVModule();
anatofuz
parents:
diff changeset
305 Resolvers[K] = std::make_shared<CBindingsResolver>(*this, ExternalResolver,
anatofuz
parents:
diff changeset
306 ExternalResolverCtx);
anatofuz
parents:
diff changeset
307 if (auto Err = Layer.addModule(K, std::move(M)))
anatofuz
parents:
diff changeset
308 return std::move(Err);
anatofuz
parents:
diff changeset
309
anatofuz
parents:
diff changeset
310 KeyLayers[K] = detail::createGenericLayer(Layer);
anatofuz
parents:
diff changeset
311
anatofuz
parents:
diff changeset
312 // Run the static constructors, and save the static destructor runner for
anatofuz
parents:
diff changeset
313 // execution when the JIT is torn down.
anatofuz
parents:
diff changeset
314 orc::LegacyCtorDtorRunner<OrcCBindingsStack> CtorRunner(
anatofuz
parents:
diff changeset
315 AcknowledgeORCv1Deprecation, std::move(CtorNames), K);
anatofuz
parents:
diff changeset
316 if (auto Err = CtorRunner.runViaLayer(*this))
anatofuz
parents:
diff changeset
317 return std::move(Err);
anatofuz
parents:
diff changeset
318
anatofuz
parents:
diff changeset
319 IRStaticDestructorRunners.emplace_back(AcknowledgeORCv1Deprecation,
anatofuz
parents:
diff changeset
320 std::move(DtorNames), K);
anatofuz
parents:
diff changeset
321
anatofuz
parents:
diff changeset
322 return K;
anatofuz
parents:
diff changeset
323 }
anatofuz
parents:
diff changeset
324
anatofuz
parents:
diff changeset
325 Expected<orc::VModuleKey>
anatofuz
parents:
diff changeset
326 addIRModuleEager(std::unique_ptr<Module> M,
anatofuz
parents:
diff changeset
327 LLVMOrcSymbolResolverFn ExternalResolver,
anatofuz
parents:
diff changeset
328 void *ExternalResolverCtx) {
anatofuz
parents:
diff changeset
329 return addIRModule(CompileLayer, std::move(M),
anatofuz
parents:
diff changeset
330 std::make_unique<SectionMemoryManager>(),
anatofuz
parents:
diff changeset
331 std::move(ExternalResolver), ExternalResolverCtx);
anatofuz
parents:
diff changeset
332 }
anatofuz
parents:
diff changeset
333
anatofuz
parents:
diff changeset
334 Expected<orc::VModuleKey>
anatofuz
parents:
diff changeset
335 addIRModuleLazy(std::unique_ptr<Module> M,
anatofuz
parents:
diff changeset
336 LLVMOrcSymbolResolverFn ExternalResolver,
anatofuz
parents:
diff changeset
337 void *ExternalResolverCtx) {
anatofuz
parents:
diff changeset
338 if (!CODLayer)
anatofuz
parents:
diff changeset
339 return make_error<StringError>("Can not add lazy module: No compile "
anatofuz
parents:
diff changeset
340 "callback manager available",
anatofuz
parents:
diff changeset
341 inconvertibleErrorCode());
anatofuz
parents:
diff changeset
342
anatofuz
parents:
diff changeset
343 return addIRModule(*CODLayer, std::move(M),
anatofuz
parents:
diff changeset
344 std::make_unique<SectionMemoryManager>(),
anatofuz
parents:
diff changeset
345 std::move(ExternalResolver), ExternalResolverCtx);
anatofuz
parents:
diff changeset
346 }
anatofuz
parents:
diff changeset
347
anatofuz
parents:
diff changeset
348 Error removeModule(orc::VModuleKey K) {
anatofuz
parents:
diff changeset
349 // FIXME: Should error release the module key?
anatofuz
parents:
diff changeset
350 if (auto Err = KeyLayers[K]->removeModule(K))
anatofuz
parents:
diff changeset
351 return Err;
anatofuz
parents:
diff changeset
352 ES.releaseVModule(K);
anatofuz
parents:
diff changeset
353 KeyLayers.erase(K);
anatofuz
parents:
diff changeset
354 return Error::success();
anatofuz
parents:
diff changeset
355 }
anatofuz
parents:
diff changeset
356
anatofuz
parents:
diff changeset
357 Expected<orc::VModuleKey> addObject(std::unique_ptr<MemoryBuffer> ObjBuffer,
anatofuz
parents:
diff changeset
358 LLVMOrcSymbolResolverFn ExternalResolver,
anatofuz
parents:
diff changeset
359 void *ExternalResolverCtx) {
anatofuz
parents:
diff changeset
360 if (auto Obj = object::ObjectFile::createObjectFile(
anatofuz
parents:
diff changeset
361 ObjBuffer->getMemBufferRef())) {
anatofuz
parents:
diff changeset
362
anatofuz
parents:
diff changeset
363 auto K = ES.allocateVModule();
anatofuz
parents:
diff changeset
364 Resolvers[K] = std::make_shared<CBindingsResolver>(
anatofuz
parents:
diff changeset
365 *this, ExternalResolver, ExternalResolverCtx);
anatofuz
parents:
diff changeset
366
anatofuz
parents:
diff changeset
367 if (auto Err = ObjectLayer.addObject(K, std::move(ObjBuffer)))
anatofuz
parents:
diff changeset
368 return std::move(Err);
anatofuz
parents:
diff changeset
369
anatofuz
parents:
diff changeset
370 KeyLayers[K] = detail::createGenericLayer(ObjectLayer);
anatofuz
parents:
diff changeset
371
anatofuz
parents:
diff changeset
372 return K;
anatofuz
parents:
diff changeset
373 } else
anatofuz
parents:
diff changeset
374 return Obj.takeError();
anatofuz
parents:
diff changeset
375 }
anatofuz
parents:
diff changeset
376
anatofuz
parents:
diff changeset
377 JITSymbol findSymbol(const std::string &Name,
anatofuz
parents:
diff changeset
378 bool ExportedSymbolsOnly) {
anatofuz
parents:
diff changeset
379 if (auto Sym = IndirectStubsMgr->findStub(Name, ExportedSymbolsOnly))
anatofuz
parents:
diff changeset
380 return Sym;
anatofuz
parents:
diff changeset
381 if (CODLayer)
anatofuz
parents:
diff changeset
382 return CODLayer->findSymbol(mangle(Name), ExportedSymbolsOnly);
anatofuz
parents:
diff changeset
383 return CompileLayer.findSymbol(mangle(Name), ExportedSymbolsOnly);
anatofuz
parents:
diff changeset
384 }
anatofuz
parents:
diff changeset
385
anatofuz
parents:
diff changeset
386 JITSymbol findSymbolIn(orc::VModuleKey K, const std::string &Name,
anatofuz
parents:
diff changeset
387 bool ExportedSymbolsOnly) {
anatofuz
parents:
diff changeset
388 assert(KeyLayers.count(K) && "looking up symbol in unknown module");
anatofuz
parents:
diff changeset
389 return KeyLayers[K]->findSymbolIn(K, mangle(Name), ExportedSymbolsOnly);
anatofuz
parents:
diff changeset
390 }
anatofuz
parents:
diff changeset
391
anatofuz
parents:
diff changeset
392 Expected<JITTargetAddress> findSymbolAddress(const std::string &Name,
anatofuz
parents:
diff changeset
393 bool ExportedSymbolsOnly) {
anatofuz
parents:
diff changeset
394 if (auto Sym = findSymbol(Name, ExportedSymbolsOnly)) {
anatofuz
parents:
diff changeset
395 // Successful lookup, non-null symbol:
anatofuz
parents:
diff changeset
396 if (auto AddrOrErr = Sym.getAddress())
anatofuz
parents:
diff changeset
397 return *AddrOrErr;
anatofuz
parents:
diff changeset
398 else
anatofuz
parents:
diff changeset
399 return AddrOrErr.takeError();
anatofuz
parents:
diff changeset
400 } else if (auto Err = Sym.takeError()) {
anatofuz
parents:
diff changeset
401 // Lookup failure - report error.
anatofuz
parents:
diff changeset
402 return std::move(Err);
anatofuz
parents:
diff changeset
403 }
anatofuz
parents:
diff changeset
404
anatofuz
parents:
diff changeset
405 // No symbol not found. Return 0.
anatofuz
parents:
diff changeset
406 return 0;
anatofuz
parents:
diff changeset
407 }
anatofuz
parents:
diff changeset
408
anatofuz
parents:
diff changeset
409 Expected<JITTargetAddress> findSymbolAddressIn(orc::VModuleKey K,
anatofuz
parents:
diff changeset
410 const std::string &Name,
anatofuz
parents:
diff changeset
411 bool ExportedSymbolsOnly) {
anatofuz
parents:
diff changeset
412 if (auto Sym = findSymbolIn(K, Name, ExportedSymbolsOnly)) {
anatofuz
parents:
diff changeset
413 // Successful lookup, non-null symbol:
anatofuz
parents:
diff changeset
414 if (auto AddrOrErr = Sym.getAddress())
anatofuz
parents:
diff changeset
415 return *AddrOrErr;
anatofuz
parents:
diff changeset
416 else
anatofuz
parents:
diff changeset
417 return AddrOrErr.takeError();
anatofuz
parents:
diff changeset
418 } else if (auto Err = Sym.takeError()) {
anatofuz
parents:
diff changeset
419 // Lookup failure - report error.
anatofuz
parents:
diff changeset
420 return std::move(Err);
anatofuz
parents:
diff changeset
421 }
anatofuz
parents:
diff changeset
422
anatofuz
parents:
diff changeset
423 // Symbol not found. Return 0.
anatofuz
parents:
diff changeset
424 return 0;
anatofuz
parents:
diff changeset
425 }
anatofuz
parents:
diff changeset
426
anatofuz
parents:
diff changeset
427 const std::string &getErrorMessage() const { return ErrMsg; }
anatofuz
parents:
diff changeset
428
anatofuz
parents:
diff changeset
429 void RegisterJITEventListener(JITEventListener *L) {
anatofuz
parents:
diff changeset
430 if (!L)
anatofuz
parents:
diff changeset
431 return;
anatofuz
parents:
diff changeset
432 EventListeners.push_back(L);
anatofuz
parents:
diff changeset
433 }
anatofuz
parents:
diff changeset
434
anatofuz
parents:
diff changeset
435 void UnregisterJITEventListener(JITEventListener *L) {
anatofuz
parents:
diff changeset
436 if (!L)
anatofuz
parents:
diff changeset
437 return;
anatofuz
parents:
diff changeset
438
anatofuz
parents:
diff changeset
439 auto I = find(reverse(EventListeners), L);
anatofuz
parents:
diff changeset
440 if (I != EventListeners.rend()) {
anatofuz
parents:
diff changeset
441 std::swap(*I, EventListeners.back());
anatofuz
parents:
diff changeset
442 EventListeners.pop_back();
anatofuz
parents:
diff changeset
443 }
anatofuz
parents:
diff changeset
444 }
anatofuz
parents:
diff changeset
445
anatofuz
parents:
diff changeset
446 private:
anatofuz
parents:
diff changeset
447 using ResolverMap =
anatofuz
parents:
diff changeset
448 std::map<orc::VModuleKey, std::shared_ptr<orc::SymbolResolver>>;
anatofuz
parents:
diff changeset
449
anatofuz
parents:
diff changeset
450 static std::unique_ptr<CompileCallbackMgr>
anatofuz
parents:
diff changeset
451 createCompileCallbackManager(TargetMachine &TM, orc::ExecutionSession &ES) {
anatofuz
parents:
diff changeset
452 auto CCMgr = createLocalCompileCallbackManager(TM.getTargetTriple(), ES, 0);
anatofuz
parents:
diff changeset
453 if (!CCMgr) {
anatofuz
parents:
diff changeset
454 // FIXME: It would be good if we could report this somewhere, but we do
anatofuz
parents:
diff changeset
455 // have an instance yet.
anatofuz
parents:
diff changeset
456 logAllUnhandledErrors(CCMgr.takeError(), errs(), "ORC error: ");
anatofuz
parents:
diff changeset
457 return nullptr;
anatofuz
parents:
diff changeset
458 }
anatofuz
parents:
diff changeset
459 return std::move(*CCMgr);
anatofuz
parents:
diff changeset
460 }
anatofuz
parents:
diff changeset
461
anatofuz
parents:
diff changeset
462 static std::unique_ptr<CODLayerT>
anatofuz
parents:
diff changeset
463 createCODLayer(orc::ExecutionSession &ES, CompileLayerT &CompileLayer,
anatofuz
parents:
diff changeset
464 CompileCallbackMgr *CCMgr,
anatofuz
parents:
diff changeset
465 IndirectStubsManagerBuilder IndirectStubsMgrBuilder,
anatofuz
parents:
diff changeset
466 ResolverMap &Resolvers) {
anatofuz
parents:
diff changeset
467 // If there is no compile callback manager available we can not create a
anatofuz
parents:
diff changeset
468 // compile on demand layer.
anatofuz
parents:
diff changeset
469 if (!CCMgr)
anatofuz
parents:
diff changeset
470 return nullptr;
anatofuz
parents:
diff changeset
471
anatofuz
parents:
diff changeset
472 return std::make_unique<CODLayerT>(
anatofuz
parents:
diff changeset
473 AcknowledgeORCv1Deprecation, ES, CompileLayer,
anatofuz
parents:
diff changeset
474 [&Resolvers](orc::VModuleKey K) {
anatofuz
parents:
diff changeset
475 auto ResolverI = Resolvers.find(K);
anatofuz
parents:
diff changeset
476 assert(ResolverI != Resolvers.end() && "No resolver for module K");
anatofuz
parents:
diff changeset
477 return ResolverI->second;
anatofuz
parents:
diff changeset
478 },
anatofuz
parents:
diff changeset
479 [&Resolvers](orc::VModuleKey K,
anatofuz
parents:
diff changeset
480 std::shared_ptr<orc::SymbolResolver> Resolver) {
anatofuz
parents:
diff changeset
481 assert(!Resolvers.count(K) && "Resolver already present");
anatofuz
parents:
diff changeset
482 Resolvers[K] = std::move(Resolver);
anatofuz
parents:
diff changeset
483 },
anatofuz
parents:
diff changeset
484 [](Function &F) { return std::set<Function *>({&F}); }, *CCMgr,
anatofuz
parents:
diff changeset
485 std::move(IndirectStubsMgrBuilder), false);
anatofuz
parents:
diff changeset
486 }
anatofuz
parents:
diff changeset
487
anatofuz
parents:
diff changeset
488 void reportError(Error Err) {
anatofuz
parents:
diff changeset
489 // FIXME: Report errors on the execution session.
anatofuz
parents:
diff changeset
490 logAllUnhandledErrors(std::move(Err), errs(), "ORC error: ");
anatofuz
parents:
diff changeset
491 };
anatofuz
parents:
diff changeset
492
anatofuz
parents:
diff changeset
493 void notifyFinalized(orc::VModuleKey K,
anatofuz
parents:
diff changeset
494 const object::ObjectFile &Obj,
anatofuz
parents:
diff changeset
495 const RuntimeDyld::LoadedObjectInfo &LoadedObjInfo) {
anatofuz
parents:
diff changeset
496 uint64_t Key = static_cast<uint64_t>(
anatofuz
parents:
diff changeset
497 reinterpret_cast<uintptr_t>(Obj.getData().data()));
anatofuz
parents:
diff changeset
498 for (auto &Listener : EventListeners)
anatofuz
parents:
diff changeset
499 Listener->notifyObjectLoaded(Key, Obj, LoadedObjInfo);
anatofuz
parents:
diff changeset
500 }
anatofuz
parents:
diff changeset
501
anatofuz
parents:
diff changeset
502 void notifyFreed(orc::VModuleKey K, const object::ObjectFile &Obj) {
anatofuz
parents:
diff changeset
503 uint64_t Key = static_cast<uint64_t>(
anatofuz
parents:
diff changeset
504 reinterpret_cast<uintptr_t>(Obj.getData().data()));
anatofuz
parents:
diff changeset
505 for (auto &Listener : EventListeners)
anatofuz
parents:
diff changeset
506 Listener->notifyFreeingObject(Key);
anatofuz
parents:
diff changeset
507 }
anatofuz
parents:
diff changeset
508
anatofuz
parents:
diff changeset
509 orc::ExecutionSession ES;
anatofuz
parents:
diff changeset
510 std::unique_ptr<CompileCallbackMgr> CCMgr;
anatofuz
parents:
diff changeset
511
anatofuz
parents:
diff changeset
512 std::vector<JITEventListener *> EventListeners;
anatofuz
parents:
diff changeset
513
anatofuz
parents:
diff changeset
514 DataLayout DL;
anatofuz
parents:
diff changeset
515 SectionMemoryManager CCMgrMemMgr;
anatofuz
parents:
diff changeset
516
anatofuz
parents:
diff changeset
517 std::unique_ptr<orc::IndirectStubsManager> IndirectStubsMgr;
anatofuz
parents:
diff changeset
518
anatofuz
parents:
diff changeset
519 ObjLayerT ObjectLayer;
anatofuz
parents:
diff changeset
520 CompileLayerT CompileLayer;
anatofuz
parents:
diff changeset
521 std::unique_ptr<CODLayerT> CODLayer;
anatofuz
parents:
diff changeset
522
anatofuz
parents:
diff changeset
523 std::map<orc::VModuleKey, std::unique_ptr<detail::GenericLayer>> KeyLayers;
anatofuz
parents:
diff changeset
524
anatofuz
parents:
diff changeset
525 orc::LegacyLocalCXXRuntimeOverrides CXXRuntimeOverrides;
anatofuz
parents:
diff changeset
526 std::vector<orc::LegacyCtorDtorRunner<OrcCBindingsStack>> IRStaticDestructorRunners;
anatofuz
parents:
diff changeset
527 std::string ErrMsg;
anatofuz
parents:
diff changeset
528
anatofuz
parents:
diff changeset
529 ResolverMap Resolvers;
anatofuz
parents:
diff changeset
530 };
anatofuz
parents:
diff changeset
531
anatofuz
parents:
diff changeset
532 } // end namespace llvm
anatofuz
parents:
diff changeset
533
anatofuz
parents:
diff changeset
534 #endif // LLVM_LIB_EXECUTIONENGINE_ORC_ORCCBINDINGSSTACK_H