1*9880d681SAndroid Build Coastguard Worker //===--- OrcCBindingsStack.h - Orc JIT stack for C bindings ---*- C++ -*---===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_EXECUTIONENGINE_ORC_ORCCBINDINGSSTACK_H
11*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_EXECUTIONENGINE_ORC_ORCCBINDINGSSTACK_H
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker #include "llvm-c/OrcBindings.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Triple.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/Orc/CompileUtils.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Error.h"
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker namespace llvm {
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker class OrcCBindingsStack;
26*9880d681SAndroid Build Coastguard Worker
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcCBindingsStack,LLVMOrcJITStackRef)27*9880d681SAndroid Build Coastguard Worker DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcCBindingsStack, LLVMOrcJITStackRef)
28*9880d681SAndroid Build Coastguard Worker DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef)
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker class OrcCBindingsStack {
31*9880d681SAndroid Build Coastguard Worker public:
32*9880d681SAndroid Build Coastguard Worker typedef orc::JITCompileCallbackManager CompileCallbackMgr;
33*9880d681SAndroid Build Coastguard Worker typedef orc::ObjectLinkingLayer<> ObjLayerT;
34*9880d681SAndroid Build Coastguard Worker typedef orc::IRCompileLayer<ObjLayerT> CompileLayerT;
35*9880d681SAndroid Build Coastguard Worker typedef orc::CompileOnDemandLayer<CompileLayerT, CompileCallbackMgr>
36*9880d681SAndroid Build Coastguard Worker CODLayerT;
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker typedef std::function<std::unique_ptr<CompileCallbackMgr>()>
39*9880d681SAndroid Build Coastguard Worker CallbackManagerBuilder;
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker typedef CODLayerT::IndirectStubsManagerBuilderT IndirectStubsManagerBuilder;
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker private:
44*9880d681SAndroid Build Coastguard Worker class GenericHandle {
45*9880d681SAndroid Build Coastguard Worker public:
46*9880d681SAndroid Build Coastguard Worker virtual ~GenericHandle() {}
47*9880d681SAndroid Build Coastguard Worker virtual orc::JITSymbol findSymbolIn(const std::string &Name,
48*9880d681SAndroid Build Coastguard Worker bool ExportedSymbolsOnly) = 0;
49*9880d681SAndroid Build Coastguard Worker virtual void removeModule() = 0;
50*9880d681SAndroid Build Coastguard Worker };
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker template <typename LayerT> class GenericHandleImpl : public GenericHandle {
53*9880d681SAndroid Build Coastguard Worker public:
54*9880d681SAndroid Build Coastguard Worker GenericHandleImpl(LayerT &Layer, typename LayerT::ModuleSetHandleT Handle)
55*9880d681SAndroid Build Coastguard Worker : Layer(Layer), Handle(std::move(Handle)) {}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker orc::JITSymbol findSymbolIn(const std::string &Name,
58*9880d681SAndroid Build Coastguard Worker bool ExportedSymbolsOnly) override {
59*9880d681SAndroid Build Coastguard Worker return Layer.findSymbolIn(Handle, Name, ExportedSymbolsOnly);
60*9880d681SAndroid Build Coastguard Worker }
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker void removeModule() override { return Layer.removeModuleSet(Handle); }
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker private:
65*9880d681SAndroid Build Coastguard Worker LayerT &Layer;
66*9880d681SAndroid Build Coastguard Worker typename LayerT::ModuleSetHandleT Handle;
67*9880d681SAndroid Build Coastguard Worker };
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker template <typename LayerT>
70*9880d681SAndroid Build Coastguard Worker std::unique_ptr<GenericHandleImpl<LayerT>>
71*9880d681SAndroid Build Coastguard Worker createGenericHandle(LayerT &Layer, typename LayerT::ModuleSetHandleT Handle) {
72*9880d681SAndroid Build Coastguard Worker return llvm::make_unique<GenericHandleImpl<LayerT>>(Layer,
73*9880d681SAndroid Build Coastguard Worker std::move(Handle));
74*9880d681SAndroid Build Coastguard Worker }
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker public:
77*9880d681SAndroid Build Coastguard Worker // We need a 'ModuleSetHandleT' to conform to the layer concept.
78*9880d681SAndroid Build Coastguard Worker typedef unsigned ModuleSetHandleT;
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker typedef unsigned ModuleHandleT;
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker OrcCBindingsStack(TargetMachine &TM,
83*9880d681SAndroid Build Coastguard Worker std::unique_ptr<CompileCallbackMgr> CCMgr,
84*9880d681SAndroid Build Coastguard Worker IndirectStubsManagerBuilder IndirectStubsMgrBuilder)
85*9880d681SAndroid Build Coastguard Worker : DL(TM.createDataLayout()), IndirectStubsMgr(IndirectStubsMgrBuilder()),
86*9880d681SAndroid Build Coastguard Worker CCMgr(std::move(CCMgr)), ObjectLayer(),
87*9880d681SAndroid Build Coastguard Worker CompileLayer(ObjectLayer, orc::SimpleCompiler(TM)),
88*9880d681SAndroid Build Coastguard Worker CODLayer(CompileLayer,
89*9880d681SAndroid Build Coastguard Worker [](Function &F) { return std::set<Function *>({&F}); },
90*9880d681SAndroid Build Coastguard Worker *this->CCMgr, std::move(IndirectStubsMgrBuilder), false),
91*9880d681SAndroid Build Coastguard Worker CXXRuntimeOverrides(
92*9880d681SAndroid Build Coastguard Worker [this](const std::string &S) { return mangle(S); }) {}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker ~OrcCBindingsStack() {
95*9880d681SAndroid Build Coastguard Worker // Run any destructors registered with __cxa_atexit.
96*9880d681SAndroid Build Coastguard Worker CXXRuntimeOverrides.runDestructors();
97*9880d681SAndroid Build Coastguard Worker // Run any IR destructors.
98*9880d681SAndroid Build Coastguard Worker for (auto &DtorRunner : IRStaticDestructorRunners)
99*9880d681SAndroid Build Coastguard Worker DtorRunner.runViaLayer(*this);
100*9880d681SAndroid Build Coastguard Worker }
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker std::string mangle(StringRef Name) {
103*9880d681SAndroid Build Coastguard Worker std::string MangledName;
104*9880d681SAndroid Build Coastguard Worker {
105*9880d681SAndroid Build Coastguard Worker raw_string_ostream MangledNameStream(MangledName);
106*9880d681SAndroid Build Coastguard Worker Mangler::getNameWithPrefix(MangledNameStream, Name, DL);
107*9880d681SAndroid Build Coastguard Worker }
108*9880d681SAndroid Build Coastguard Worker return MangledName;
109*9880d681SAndroid Build Coastguard Worker }
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker template <typename PtrTy>
112*9880d681SAndroid Build Coastguard Worker static PtrTy fromTargetAddress(orc::TargetAddress Addr) {
113*9880d681SAndroid Build Coastguard Worker return reinterpret_cast<PtrTy>(static_cast<uintptr_t>(Addr));
114*9880d681SAndroid Build Coastguard Worker }
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker orc::TargetAddress
117*9880d681SAndroid Build Coastguard Worker createLazyCompileCallback(LLVMOrcLazyCompileCallbackFn Callback,
118*9880d681SAndroid Build Coastguard Worker void *CallbackCtx) {
119*9880d681SAndroid Build Coastguard Worker auto CCInfo = CCMgr->getCompileCallback();
120*9880d681SAndroid Build Coastguard Worker CCInfo.setCompileAction([=]() -> orc::TargetAddress {
121*9880d681SAndroid Build Coastguard Worker return Callback(wrap(this), CallbackCtx);
122*9880d681SAndroid Build Coastguard Worker });
123*9880d681SAndroid Build Coastguard Worker return CCInfo.getAddress();
124*9880d681SAndroid Build Coastguard Worker }
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker LLVMOrcErrorCode createIndirectStub(StringRef StubName,
127*9880d681SAndroid Build Coastguard Worker orc::TargetAddress Addr) {
128*9880d681SAndroid Build Coastguard Worker return mapError(
129*9880d681SAndroid Build Coastguard Worker IndirectStubsMgr->createStub(StubName, Addr, JITSymbolFlags::Exported));
130*9880d681SAndroid Build Coastguard Worker }
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker LLVMOrcErrorCode setIndirectStubPointer(StringRef Name,
133*9880d681SAndroid Build Coastguard Worker orc::TargetAddress Addr) {
134*9880d681SAndroid Build Coastguard Worker return mapError(IndirectStubsMgr->updatePointer(Name, Addr));
135*9880d681SAndroid Build Coastguard Worker }
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker std::unique_ptr<RuntimeDyld::SymbolResolver>
138*9880d681SAndroid Build Coastguard Worker createResolver(LLVMOrcSymbolResolverFn ExternalResolver,
139*9880d681SAndroid Build Coastguard Worker void *ExternalResolverCtx) {
140*9880d681SAndroid Build Coastguard Worker return orc::createLambdaResolver(
141*9880d681SAndroid Build Coastguard Worker [this, ExternalResolver, ExternalResolverCtx](const std::string &Name) {
142*9880d681SAndroid Build Coastguard Worker // Search order:
143*9880d681SAndroid Build Coastguard Worker // 1. JIT'd symbols.
144*9880d681SAndroid Build Coastguard Worker // 2. Runtime overrides.
145*9880d681SAndroid Build Coastguard Worker // 3. External resolver (if present).
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker if (auto Sym = CODLayer.findSymbol(Name, true))
148*9880d681SAndroid Build Coastguard Worker return Sym.toRuntimeDyldSymbol();
149*9880d681SAndroid Build Coastguard Worker if (auto Sym = CXXRuntimeOverrides.searchOverrides(Name))
150*9880d681SAndroid Build Coastguard Worker return Sym;
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Worker if (ExternalResolver)
153*9880d681SAndroid Build Coastguard Worker return RuntimeDyld::SymbolInfo(
154*9880d681SAndroid Build Coastguard Worker ExternalResolver(Name.c_str(), ExternalResolverCtx),
155*9880d681SAndroid Build Coastguard Worker llvm::JITSymbolFlags::Exported);
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker return RuntimeDyld::SymbolInfo(nullptr);
158*9880d681SAndroid Build Coastguard Worker },
159*9880d681SAndroid Build Coastguard Worker [](const std::string &Name) {
160*9880d681SAndroid Build Coastguard Worker return RuntimeDyld::SymbolInfo(nullptr);
161*9880d681SAndroid Build Coastguard Worker });
162*9880d681SAndroid Build Coastguard Worker }
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker template <typename LayerT>
165*9880d681SAndroid Build Coastguard Worker ModuleHandleT addIRModule(LayerT &Layer, Module *M,
166*9880d681SAndroid Build Coastguard Worker std::unique_ptr<RuntimeDyld::MemoryManager> MemMgr,
167*9880d681SAndroid Build Coastguard Worker LLVMOrcSymbolResolverFn ExternalResolver,
168*9880d681SAndroid Build Coastguard Worker void *ExternalResolverCtx) {
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker // Attach a data-layout if one isn't already present.
171*9880d681SAndroid Build Coastguard Worker if (M->getDataLayout().isDefault())
172*9880d681SAndroid Build Coastguard Worker M->setDataLayout(DL);
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Worker // Record the static constructors and destructors. We have to do this before
175*9880d681SAndroid Build Coastguard Worker // we hand over ownership of the module to the JIT.
176*9880d681SAndroid Build Coastguard Worker std::vector<std::string> CtorNames, DtorNames;
177*9880d681SAndroid Build Coastguard Worker for (auto Ctor : orc::getConstructors(*M))
178*9880d681SAndroid Build Coastguard Worker CtorNames.push_back(mangle(Ctor.Func->getName()));
179*9880d681SAndroid Build Coastguard Worker for (auto Dtor : orc::getDestructors(*M))
180*9880d681SAndroid Build Coastguard Worker DtorNames.push_back(mangle(Dtor.Func->getName()));
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Worker // Create the resolver.
183*9880d681SAndroid Build Coastguard Worker auto Resolver = createResolver(ExternalResolver, ExternalResolverCtx);
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Worker // Add the module to the JIT.
186*9880d681SAndroid Build Coastguard Worker std::vector<Module *> S;
187*9880d681SAndroid Build Coastguard Worker S.push_back(std::move(M));
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Worker auto LH = Layer.addModuleSet(std::move(S), std::move(MemMgr),
190*9880d681SAndroid Build Coastguard Worker std::move(Resolver));
191*9880d681SAndroid Build Coastguard Worker ModuleHandleT H = createHandle(Layer, LH);
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Worker // Run the static constructors, and save the static destructor runner for
194*9880d681SAndroid Build Coastguard Worker // execution when the JIT is torn down.
195*9880d681SAndroid Build Coastguard Worker orc::CtorDtorRunner<OrcCBindingsStack> CtorRunner(std::move(CtorNames), H);
196*9880d681SAndroid Build Coastguard Worker CtorRunner.runViaLayer(*this);
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Worker IRStaticDestructorRunners.emplace_back(std::move(DtorNames), H);
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Worker return H;
201*9880d681SAndroid Build Coastguard Worker }
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Worker ModuleHandleT addIRModuleEager(Module *M,
204*9880d681SAndroid Build Coastguard Worker LLVMOrcSymbolResolverFn ExternalResolver,
205*9880d681SAndroid Build Coastguard Worker void *ExternalResolverCtx) {
206*9880d681SAndroid Build Coastguard Worker return addIRModule(CompileLayer, std::move(M),
207*9880d681SAndroid Build Coastguard Worker llvm::make_unique<SectionMemoryManager>(),
208*9880d681SAndroid Build Coastguard Worker std::move(ExternalResolver), ExternalResolverCtx);
209*9880d681SAndroid Build Coastguard Worker }
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Worker ModuleHandleT addIRModuleLazy(Module *M,
212*9880d681SAndroid Build Coastguard Worker LLVMOrcSymbolResolverFn ExternalResolver,
213*9880d681SAndroid Build Coastguard Worker void *ExternalResolverCtx) {
214*9880d681SAndroid Build Coastguard Worker return addIRModule(CODLayer, std::move(M),
215*9880d681SAndroid Build Coastguard Worker llvm::make_unique<SectionMemoryManager>(),
216*9880d681SAndroid Build Coastguard Worker std::move(ExternalResolver), ExternalResolverCtx);
217*9880d681SAndroid Build Coastguard Worker }
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Worker void removeModule(ModuleHandleT H) {
220*9880d681SAndroid Build Coastguard Worker GenericHandles[H]->removeModule();
221*9880d681SAndroid Build Coastguard Worker GenericHandles[H] = nullptr;
222*9880d681SAndroid Build Coastguard Worker FreeHandleIndexes.push_back(H);
223*9880d681SAndroid Build Coastguard Worker }
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Worker orc::JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly) {
226*9880d681SAndroid Build Coastguard Worker if (auto Sym = IndirectStubsMgr->findStub(Name, ExportedSymbolsOnly))
227*9880d681SAndroid Build Coastguard Worker return Sym;
228*9880d681SAndroid Build Coastguard Worker return CODLayer.findSymbol(mangle(Name), ExportedSymbolsOnly);
229*9880d681SAndroid Build Coastguard Worker }
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Worker orc::JITSymbol findSymbolIn(ModuleHandleT H, const std::string &Name,
232*9880d681SAndroid Build Coastguard Worker bool ExportedSymbolsOnly) {
233*9880d681SAndroid Build Coastguard Worker return GenericHandles[H]->findSymbolIn(Name, ExportedSymbolsOnly);
234*9880d681SAndroid Build Coastguard Worker }
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Worker const std::string &getErrorMessage() const { return ErrMsg; }
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Worker private:
239*9880d681SAndroid Build Coastguard Worker template <typename LayerT>
240*9880d681SAndroid Build Coastguard Worker unsigned createHandle(LayerT &Layer,
241*9880d681SAndroid Build Coastguard Worker typename LayerT::ModuleSetHandleT Handle) {
242*9880d681SAndroid Build Coastguard Worker unsigned NewHandle;
243*9880d681SAndroid Build Coastguard Worker if (!FreeHandleIndexes.empty()) {
244*9880d681SAndroid Build Coastguard Worker NewHandle = FreeHandleIndexes.back();
245*9880d681SAndroid Build Coastguard Worker FreeHandleIndexes.pop_back();
246*9880d681SAndroid Build Coastguard Worker GenericHandles[NewHandle] = createGenericHandle(Layer, std::move(Handle));
247*9880d681SAndroid Build Coastguard Worker return NewHandle;
248*9880d681SAndroid Build Coastguard Worker } else {
249*9880d681SAndroid Build Coastguard Worker NewHandle = GenericHandles.size();
250*9880d681SAndroid Build Coastguard Worker GenericHandles.push_back(createGenericHandle(Layer, std::move(Handle)));
251*9880d681SAndroid Build Coastguard Worker }
252*9880d681SAndroid Build Coastguard Worker return NewHandle;
253*9880d681SAndroid Build Coastguard Worker }
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Worker LLVMOrcErrorCode mapError(Error Err) {
256*9880d681SAndroid Build Coastguard Worker LLVMOrcErrorCode Result = LLVMOrcErrSuccess;
257*9880d681SAndroid Build Coastguard Worker handleAllErrors(std::move(Err), [&](ErrorInfoBase &EIB) {
258*9880d681SAndroid Build Coastguard Worker // Handler of last resort.
259*9880d681SAndroid Build Coastguard Worker Result = LLVMOrcErrGeneric;
260*9880d681SAndroid Build Coastguard Worker ErrMsg = "";
261*9880d681SAndroid Build Coastguard Worker raw_string_ostream ErrStream(ErrMsg);
262*9880d681SAndroid Build Coastguard Worker EIB.log(ErrStream);
263*9880d681SAndroid Build Coastguard Worker });
264*9880d681SAndroid Build Coastguard Worker return Result;
265*9880d681SAndroid Build Coastguard Worker }
266*9880d681SAndroid Build Coastguard Worker
267*9880d681SAndroid Build Coastguard Worker DataLayout DL;
268*9880d681SAndroid Build Coastguard Worker SectionMemoryManager CCMgrMemMgr;
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Worker std::unique_ptr<orc::IndirectStubsManager> IndirectStubsMgr;
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard Worker std::unique_ptr<CompileCallbackMgr> CCMgr;
273*9880d681SAndroid Build Coastguard Worker ObjLayerT ObjectLayer;
274*9880d681SAndroid Build Coastguard Worker CompileLayerT CompileLayer;
275*9880d681SAndroid Build Coastguard Worker CODLayerT CODLayer;
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker std::vector<std::unique_ptr<GenericHandle>> GenericHandles;
278*9880d681SAndroid Build Coastguard Worker std::vector<unsigned> FreeHandleIndexes;
279*9880d681SAndroid Build Coastguard Worker
280*9880d681SAndroid Build Coastguard Worker orc::LocalCXXRuntimeOverrides CXXRuntimeOverrides;
281*9880d681SAndroid Build Coastguard Worker std::vector<orc::CtorDtorRunner<OrcCBindingsStack>> IRStaticDestructorRunners;
282*9880d681SAndroid Build Coastguard Worker std::string ErrMsg;
283*9880d681SAndroid Build Coastguard Worker };
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Worker } // end namespace llvm
286*9880d681SAndroid Build Coastguard Worker
287*9880d681SAndroid Build Coastguard Worker #endif // LLVM_LIB_EXECUTIONENGINE_ORC_ORCCBINDINGSSTACK_H
288