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 /llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp | |
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
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
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); |