diff options
| author | Lang Hames <lhames@gmail.com> | 2016-05-26 17:20:35 +0000 |
|---|---|---|
| committer | Lang Hames <lhames@gmail.com> | 2016-05-26 17:20:35 +0000 |
| commit | 105518fe3cf2adedee729d6d8263e903a04c2fbf (patch) | |
| tree | 0ac92ab5d2c4c76d3c791e1896829c87a0b5fb19 | |
| parent | 132639120a20dd8be79c274b674361a5a6bbf53d (diff) | |
| download | bcm5719-llvm-105518fe3cf2adedee729d6d8263e903a04c2fbf.tar.gz bcm5719-llvm-105518fe3cf2adedee729d6d8263e903a04c2fbf.zip | |
[Orc] Merge some common code for creating CompileCallbackManagers and
IndirectStubsManagers.
llvm-svn: 270874
| -rw-r--r-- | llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h | 14 | ||||
| -rw-r--r-- | llvm/lib/ExecutionEngine/Orc/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp | 49 | ||||
| -rw-r--r-- | llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.cpp | 67 | ||||
| -rw-r--r-- | llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h | 3 | ||||
| -rw-r--r-- | llvm/tools/lli/OrcLazyJIT.cpp | 55 | ||||
| -rw-r--r-- | llvm/tools/lli/OrcLazyJIT.h | 3 |
8 files changed, 68 insertions, 128 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h b/llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h index 03306985a3e..fe7a85ba020 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h @@ -328,6 +328,20 @@ private: StringMap<std::pair<StubKey, JITSymbolFlags>> StubIndexes; }; +/// @brief Create a local compile callback manager. +/// +/// The given target triple will determine the ABI, and the given +/// ErrorHandlerAddress will be used by the resulting compile callback +/// manager if a compile callback fails. +std::unique_ptr<JITCompileCallbackManager> +createLocalCompileCallbackManager(Triple T, TargetAddress ErrorHandlerAddress); + +/// @brief Create a local indriect stubs manager builder. +/// +/// The given target triple will determine the ABI. +std::function<std::unique_ptr<IndirectStubsManager>()> +createLocalIndirectStubsManagerBuilder(Triple T); + /// @brief Build a function pointer of FunctionType with the given constant /// address. /// diff --git a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt index a312f8f9380..76720a7c52e 100644 --- a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt +++ b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt @@ -4,7 +4,6 @@ add_llvm_library(LLVMOrcJIT NullResolver.cpp OrcABISupport.cpp OrcCBindings.cpp - OrcCBindingsStack.cpp OrcError.cpp OrcMCJITReplacement.cpp OrcRemoteTargetRPCAPI.cpp diff --git a/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp b/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp index a386aeefde3..34a0ddf00c8 100644 --- a/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp +++ b/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp @@ -10,6 +10,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/Triple.h" #include "llvm/ExecutionEngine/Orc/IndirectionUtils.h" +#include "llvm/ExecutionEngine/Orc/OrcABISupport.h" #include "llvm/IR/CallSite.h" #include "llvm/IR/IRBuilder.h" #include "llvm/Transforms/Utils/Cloning.h" @@ -21,6 +22,54 @@ namespace orc { void JITCompileCallbackManager::anchor() {} void IndirectStubsManager::anchor() {} +std::unique_ptr<JITCompileCallbackManager> +createLocalCompileCallbackManager(Triple T, TargetAddress ErrorHandlerAddress) { + switch (T.getArch()) { + default: return nullptr; + + case Triple::x86: { + typedef orc::LocalJITCompileCallbackManager<orc::OrcI386> CCMgrT; + return llvm::make_unique<CCMgrT>(ErrorHandlerAddress); + } + + case Triple::x86_64: { + if ( T.getOS() == Triple::OSType::Win32 ) { + typedef orc::LocalJITCompileCallbackManager<orc::OrcX86_64_Win32> CCMgrT; + return llvm::make_unique<CCMgrT>(ErrorHandlerAddress); + } else { + typedef orc::LocalJITCompileCallbackManager<orc::OrcX86_64_SysV> CCMgrT; + return llvm::make_unique<CCMgrT>(ErrorHandlerAddress); + } + } + } +} + +std::function<std::unique_ptr<IndirectStubsManager>()> +createLocalIndirectStubsManagerBuilder(Triple T) { + switch (T.getArch()) { + default: return nullptr; + + case Triple::x86: + return [](){ + return llvm::make_unique< + orc::LocalIndirectStubsManager<orc::OrcI386>>(); + }; + + case Triple::x86_64: + if (T.getOS() == Triple::OSType::Win32) { + return [](){ + return llvm::make_unique< + orc::LocalIndirectStubsManager<orc::OrcX86_64_Win32>>(); + }; + } else { + return [](){ + return llvm::make_unique< + orc::LocalIndirectStubsManager<orc::OrcX86_64_SysV>>(); + }; + } + } +} + Constant* createIRTypedAddress(FunctionType &FT, TargetAddress Addr) { Constant *AddrIntVal = ConstantInt::get(Type::getInt64Ty(FT.getContext()), Addr); diff --git a/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp b/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp index 4153f7f0cc9..8dcd49aaab5 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp +++ b/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp @@ -17,9 +17,9 @@ LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM) { Triple T(TM2->getTargetTriple()); - auto CompileCallbackMgr = OrcCBindingsStack::createCompileCallbackMgr(T); + auto CompileCallbackMgr = orc::createLocalCompileCallbackManager(T, 0); auto IndirectStubsMgrBuilder = - OrcCBindingsStack::createIndirectStubsMgrBuilder(T); + orc::createLocalIndirectStubsManagerBuilder(T); OrcCBindingsStack *JITStack = new OrcCBindingsStack( *TM2, std::move(CompileCallbackMgr), IndirectStubsMgrBuilder); diff --git a/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.cpp b/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.cpp deleted file mode 100644 index ddc7d7126fe..00000000000 --- a/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.cpp +++ /dev/null @@ -1,67 +0,0 @@ -//===-------- OrcCBindingsStack.cpp - Orc JIT stack for C bindings --------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "OrcCBindingsStack.h" - -#include "llvm/ExecutionEngine/Orc/OrcABISupport.h" -#include "llvm/Support/Debug.h" -#include "llvm/Support/DynamicLibrary.h" -#include <cstdio> -#include <system_error> - -using namespace llvm; - -std::unique_ptr<OrcCBindingsStack::CompileCallbackMgr> -OrcCBindingsStack::createCompileCallbackMgr(Triple T) { - switch (T.getArch()) { - default: - return nullptr; - - case Triple::x86: { - typedef orc::LocalJITCompileCallbackManager<orc::OrcI386> CCMgrT; - return llvm::make_unique<CCMgrT>(0); - }; - - case Triple::x86_64: { - if ( T.getOS() == Triple::OSType::Win32 ) { - typedef orc::LocalJITCompileCallbackManager<orc::OrcX86_64_Win32> CCMgrT; - return llvm::make_unique<CCMgrT>(0); - } else { - typedef orc::LocalJITCompileCallbackManager<orc::OrcX86_64_SysV> CCMgrT; - return llvm::make_unique<CCMgrT>(0); - } - } - } -} - -OrcCBindingsStack::IndirectStubsManagerBuilder -OrcCBindingsStack::createIndirectStubsMgrBuilder(Triple T) { - switch (T.getArch()) { - default: - return nullptr; - - case Triple::x86: - return []() { - return llvm::make_unique<orc::LocalIndirectStubsManager<orc::OrcI386>>(); - }; - - case Triple::x86_64: - if (T.getOS() == Triple::OSType::Win32) { - return [](){ - return llvm::make_unique< - orc::LocalIndirectStubsManager<orc::OrcX86_64_Win32>>(); - }; - } else { - return [](){ - return llvm::make_unique< - orc::LocalIndirectStubsManager<orc::OrcX86_64_SysV>>(); - }; - } - } -} diff --git a/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h b/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h index dd14a14a431..f49d49115e5 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h +++ b/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h @@ -79,9 +79,6 @@ public: typedef unsigned ModuleHandleT; - static std::unique_ptr<CompileCallbackMgr> createCompileCallbackMgr(Triple T); - static IndirectStubsManagerBuilder createIndirectStubsMgrBuilder(Triple T); - OrcCBindingsStack(TargetMachine &TM, std::unique_ptr<CompileCallbackMgr> CCMgr, IndirectStubsManagerBuilder IndirectStubsMgrBuilder) diff --git a/llvm/tools/lli/OrcLazyJIT.cpp b/llvm/tools/lli/OrcLazyJIT.cpp index dc9d6486b6e..b13e7696627 100644 --- a/llvm/tools/lli/OrcLazyJIT.cpp +++ b/llvm/tools/lli/OrcLazyJIT.cpp @@ -46,54 +46,6 @@ namespace { cl::init(true), cl::Hidden); } -std::unique_ptr<OrcLazyJIT::CompileCallbackMgr> -OrcLazyJIT::createCompileCallbackMgr(Triple T) { - switch (T.getArch()) { - default: return nullptr; - - case Triple::x86: { - typedef orc::LocalJITCompileCallbackManager<orc::OrcI386> CCMgrT; - return llvm::make_unique<CCMgrT>(0); - } - - case Triple::x86_64: { - if ( T.getOS() == Triple::OSType::Win32 ) { - typedef orc::LocalJITCompileCallbackManager<orc::OrcX86_64_Win32> CCMgrT; - return llvm::make_unique<CCMgrT>(0); - } else { - typedef orc::LocalJITCompileCallbackManager<orc::OrcX86_64_SysV> CCMgrT; - return llvm::make_unique<CCMgrT>(0); - } - } - } -} - -OrcLazyJIT::IndirectStubsManagerBuilder -OrcLazyJIT::createIndirectStubsMgrBuilder(Triple T) { - switch (T.getArch()) { - default: return nullptr; - - case Triple::x86: - return [](){ - return llvm::make_unique< - orc::LocalIndirectStubsManager<orc::OrcI386>>(); - }; - - case Triple::x86_64: - if (T.getOS() == Triple::OSType::Win32) { - return [](){ - return llvm::make_unique< - orc::LocalIndirectStubsManager<orc::OrcX86_64_Win32>>(); - }; - } else { - return [](){ - return llvm::make_unique< - orc::LocalIndirectStubsManager<orc::OrcX86_64_SysV>>(); - }; - } - } -} - OrcLazyJIT::TransformFtor OrcLazyJIT::createDebugDumper() { switch (OrcDumpKind) { @@ -165,8 +117,8 @@ int llvm::runOrcLazyJIT(std::unique_ptr<Module> M, int ArgC, char* ArgV[]) { EngineBuilder EB; EB.setOptLevel(getOptLevel()); auto TM = std::unique_ptr<TargetMachine>(EB.selectTarget()); - auto CompileCallbackMgr = - OrcLazyJIT::createCompileCallbackMgr(Triple(TM->getTargetTriple())); + Triple T(TM->getTargetTriple()); + auto CompileCallbackMgr = orc::createLocalCompileCallbackManager(T, 0); // If we couldn't build the factory function then there must not be a callback // manager for this target. Bail out. @@ -176,8 +128,7 @@ int llvm::runOrcLazyJIT(std::unique_ptr<Module> M, int ArgC, char* ArgV[]) { return 1; } - auto IndirectStubsMgrBuilder = - OrcLazyJIT::createIndirectStubsMgrBuilder(Triple(TM->getTargetTriple())); + auto IndirectStubsMgrBuilder = orc::createLocalIndirectStubsManagerBuilder(T); // If we couldn't build a stubs-manager-builder for this target then bail out. if (!IndirectStubsMgrBuilder) { diff --git a/llvm/tools/lli/OrcLazyJIT.h b/llvm/tools/lli/OrcLazyJIT.h index 6409ebfec61..69aaa4be80b 100644 --- a/llvm/tools/lli/OrcLazyJIT.h +++ b/llvm/tools/lli/OrcLazyJIT.h @@ -62,9 +62,6 @@ public: DtorRunner.runViaLayer(CODLayer); } - static std::unique_ptr<CompileCallbackMgr> createCompileCallbackMgr(Triple T); - static IndirectStubsManagerBuilder createIndirectStubsMgrBuilder(Triple T); - ModuleHandleT addModule(std::unique_ptr<Module> M) { // Attach a data-layout if one isn't already present. if (M->getDataLayout().isDefault()) |

