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