diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2016-08-16 21:02:59 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2016-08-16 21:02:59 +0000 |
commit | 3ca95b020283db6244cab92ede73c969253b6a31 (patch) | |
tree | d16e791e58694facd8f68d3e2797a1eaa8018afc /contrib/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h | |
parent | 27067774dce3388702a4cf744d7096c6fb71b688 (diff) | |
parent | c3aee98e721333f265a88d6bf348e6e468f027d4 (diff) | |
download | src-3ca95b020283db6244cab92ede73c969253b6a31.tar.gz src-3ca95b020283db6244cab92ede73c969253b6a31.zip |
Update llvm to release_39 branch r276489, and resolve conflicts.
Notes
Notes:
svn path=/projects/clang390-import/; revision=304240
Diffstat (limited to 'contrib/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h')
-rw-r--r-- | contrib/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h | 140 |
1 files changed, 72 insertions, 68 deletions
diff --git a/contrib/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h b/contrib/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h index aae6a99432bc..9ae9b20feb0a 100644 --- a/contrib/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h +++ b/contrib/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h @@ -10,6 +10,7 @@ #ifndef LLVM_LIB_EXECUTIONENGINE_ORC_ORCCBINDINGSSTACK_H #define LLVM_LIB_EXECUTIONENGINE_ORC_ORCCBINDINGSSTACK_H +#include "llvm-c/OrcBindings.h" #include "llvm/ADT/Triple.h" #include "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h" #include "llvm/ExecutionEngine/Orc/CompileUtils.h" @@ -17,7 +18,7 @@ #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" #include "llvm/IR/LLVMContext.h" -#include "llvm-c/OrcBindings.h" +#include "llvm/Support/Error.h" namespace llvm { @@ -28,19 +29,18 @@ DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef) class OrcCBindingsStack { public: - typedef orc::JITCompileCallbackManager CompileCallbackMgr; typedef orc::ObjectLinkingLayer<> ObjLayerT; typedef orc::IRCompileLayer<ObjLayerT> CompileLayerT; - typedef orc::CompileOnDemandLayer<CompileLayerT, CompileCallbackMgr> CODLayerT; + typedef orc::CompileOnDemandLayer<CompileLayerT, CompileCallbackMgr> + CODLayerT; typedef std::function<std::unique_ptr<CompileCallbackMgr>()> - CallbackManagerBuilder; + CallbackManagerBuilder; typedef CODLayerT::IndirectStubsManagerBuilderT IndirectStubsManagerBuilder; private: - class GenericHandle { public: virtual ~GenericHandle() {} @@ -49,20 +49,17 @@ private: virtual void removeModule() = 0; }; - template <typename LayerT> - class GenericHandleImpl : public GenericHandle { + template <typename LayerT> class GenericHandleImpl : public GenericHandle { public: GenericHandleImpl(LayerT &Layer, typename LayerT::ModuleSetHandleT Handle) - : Layer(Layer), Handle(std::move(Handle)) {} + : Layer(Layer), Handle(std::move(Handle)) {} orc::JITSymbol findSymbolIn(const std::string &Name, bool ExportedSymbolsOnly) override { return Layer.findSymbolIn(Handle, Name, ExportedSymbolsOnly); } - void removeModule() override { - return Layer.removeModuleSet(Handle); - } + void removeModule() override { return Layer.removeModuleSet(Handle); } private: LayerT &Layer; @@ -77,26 +74,22 @@ private: } public: - // We need a 'ModuleSetHandleT' to conform to the layer concept. typedef unsigned ModuleSetHandleT; typedef unsigned ModuleHandleT; - static std::unique_ptr<CompileCallbackMgr> createCompileCallbackMgr(Triple T); - static IndirectStubsManagerBuilder createIndirectStubsMgrBuilder(Triple T); - OrcCBindingsStack(TargetMachine &TM, - std::unique_ptr<CompileCallbackMgr> CCMgr, + std::unique_ptr<CompileCallbackMgr> CCMgr, IndirectStubsManagerBuilder IndirectStubsMgrBuilder) - : DL(TM.createDataLayout()), CCMgr(std::move(CCMgr)), - ObjectLayer(), - CompileLayer(ObjectLayer, orc::SimpleCompiler(TM)), - CODLayer(CompileLayer, - [](Function &F) { std::set<Function*> S; S.insert(&F); return S; }, - *this->CCMgr, std::move(IndirectStubsMgrBuilder), false), - IndirectStubsMgr(IndirectStubsMgrBuilder()), - CXXRuntimeOverrides([this](const std::string &S) { return mangle(S); }) {} + : DL(TM.createDataLayout()), IndirectStubsMgr(IndirectStubsMgrBuilder()), + CCMgr(std::move(CCMgr)), ObjectLayer(), + CompileLayer(ObjectLayer, orc::SimpleCompiler(TM)), + CODLayer(CompileLayer, + [](Function &F) { return std::set<Function *>({&F}); }, + *this->CCMgr, std::move(IndirectStubsMgrBuilder), false), + CXXRuntimeOverrides( + [this](const std::string &S) { return mangle(S); }) {} ~OrcCBindingsStack() { // Run any destructors registered with __cxa_atexit. @@ -124,55 +117,52 @@ public: createLazyCompileCallback(LLVMOrcLazyCompileCallbackFn Callback, void *CallbackCtx) { auto CCInfo = CCMgr->getCompileCallback(); - CCInfo.setCompileAction( - [=]() -> orc::TargetAddress { - return Callback(wrap(this), CallbackCtx); - }); + CCInfo.setCompileAction([=]() -> orc::TargetAddress { + return Callback(wrap(this), CallbackCtx); + }); return CCInfo.getAddress(); } - void createIndirectStub(StringRef StubName, orc::TargetAddress Addr) { - IndirectStubsMgr->createStub(StubName, Addr, JITSymbolFlags::Exported); + LLVMOrcErrorCode createIndirectStub(StringRef StubName, + orc::TargetAddress Addr) { + return mapError( + IndirectStubsMgr->createStub(StubName, Addr, JITSymbolFlags::Exported)); } - void setIndirectStubPointer(StringRef Name, orc::TargetAddress Addr) { - IndirectStubsMgr->updatePointer(Name, Addr); + LLVMOrcErrorCode setIndirectStubPointer(StringRef Name, + orc::TargetAddress Addr) { + return mapError(IndirectStubsMgr->updatePointer(Name, Addr)); } - std::shared_ptr<RuntimeDyld::SymbolResolver> + std::unique_ptr<RuntimeDyld::SymbolResolver> createResolver(LLVMOrcSymbolResolverFn ExternalResolver, void *ExternalResolverCtx) { - auto Resolver = orc::createLambdaResolver( - [this, ExternalResolver, ExternalResolverCtx](const std::string &Name) { - // Search order: - // 1. JIT'd symbols. - // 2. Runtime overrides. - // 3. External resolver (if present). - - if (auto Sym = CODLayer.findSymbol(Name, true)) - return RuntimeDyld::SymbolInfo(Sym.getAddress(), - Sym.getFlags()); - if (auto Sym = CXXRuntimeOverrides.searchOverrides(Name)) - return Sym; - - if (ExternalResolver) - return RuntimeDyld::SymbolInfo(ExternalResolver(Name.c_str(), - ExternalResolverCtx), - llvm::JITSymbolFlags::Exported); - - return RuntimeDyld::SymbolInfo(nullptr); - }, - [](const std::string &Name) { - return RuntimeDyld::SymbolInfo(nullptr); - } - ); - - return std::shared_ptr<RuntimeDyld::SymbolResolver>(std::move(Resolver)); + return orc::createLambdaResolver( + [this, ExternalResolver, ExternalResolverCtx](const std::string &Name) { + // Search order: + // 1. JIT'd symbols. + // 2. Runtime overrides. + // 3. External resolver (if present). + + if (auto Sym = CODLayer.findSymbol(Name, true)) + return Sym.toRuntimeDyldSymbol(); + if (auto Sym = CXXRuntimeOverrides.searchOverrides(Name)) + return Sym; + + if (ExternalResolver) + return RuntimeDyld::SymbolInfo( + ExternalResolver(Name.c_str(), ExternalResolverCtx), + llvm::JITSymbolFlags::Exported); + + return RuntimeDyld::SymbolInfo(nullptr); + }, + [](const std::string &Name) { + return RuntimeDyld::SymbolInfo(nullptr); + }); } template <typename LayerT> - ModuleHandleT addIRModule(LayerT &Layer, - Module *M, + ModuleHandleT addIRModule(LayerT &Layer, Module *M, std::unique_ptr<RuntimeDyld::MemoryManager> MemMgr, LLVMOrcSymbolResolverFn ExternalResolver, void *ExternalResolverCtx) { @@ -193,7 +183,7 @@ public: auto Resolver = createResolver(ExternalResolver, ExternalResolverCtx); // Add the module to the JIT. - std::vector<Module*> S; + std::vector<Module *> S; S.push_back(std::move(M)); auto LH = Layer.addModuleSet(std::move(S), std::move(MemMgr), @@ -210,7 +200,7 @@ public: return H; } - ModuleHandleT addIRModuleEager(Module* M, + ModuleHandleT addIRModuleEager(Module *M, LLVMOrcSymbolResolverFn ExternalResolver, void *ExternalResolverCtx) { return addIRModule(CompileLayer, std::move(M), @@ -218,11 +208,11 @@ public: std::move(ExternalResolver), ExternalResolverCtx); } - ModuleHandleT addIRModuleLazy(Module* M, + ModuleHandleT addIRModuleLazy(Module *M, LLVMOrcSymbolResolverFn ExternalResolver, void *ExternalResolverCtx) { return addIRModule(CODLayer, std::move(M), - llvm::make_unique<SectionMemoryManager>(), + llvm::make_unique<SectionMemoryManager>(), std::move(ExternalResolver), ExternalResolverCtx); } @@ -243,8 +233,9 @@ public: return GenericHandles[H]->findSymbolIn(Name, ExportedSymbolsOnly); } -private: + const std::string &getErrorMessage() const { return ErrMsg; } +private: template <typename LayerT> unsigned createHandle(LayerT &Layer, typename LayerT::ModuleSetHandleT Handle) { @@ -261,21 +252,34 @@ private: return NewHandle; } + LLVMOrcErrorCode mapError(Error Err) { + LLVMOrcErrorCode Result = LLVMOrcErrSuccess; + handleAllErrors(std::move(Err), [&](ErrorInfoBase &EIB) { + // Handler of last resort. + Result = LLVMOrcErrGeneric; + ErrMsg = ""; + raw_string_ostream ErrStream(ErrMsg); + EIB.log(ErrStream); + }); + return Result; + } + DataLayout DL; SectionMemoryManager CCMgrMemMgr; + std::unique_ptr<orc::IndirectStubsManager> IndirectStubsMgr; + std::unique_ptr<CompileCallbackMgr> CCMgr; ObjLayerT ObjectLayer; CompileLayerT CompileLayer; CODLayerT CODLayer; - std::unique_ptr<orc::IndirectStubsManager> IndirectStubsMgr; - std::vector<std::unique_ptr<GenericHandle>> GenericHandles; std::vector<unsigned> FreeHandleIndexes; orc::LocalCXXRuntimeOverrides CXXRuntimeOverrides; std::vector<orc::CtorDtorRunner<OrcCBindingsStack>> IRStaticDestructorRunners; + std::string ErrMsg; }; } // end namespace llvm |