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