xref: /aosp_15_r20/external/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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