diff options
author | Lang Hames <lhames@gmail.com> | 2015-10-28 00:28:26 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2015-10-28 00:28:26 +0000 |
commit | ec6151066f73d1e27a059fc0924e031481903279 (patch) | |
tree | ef672427f7bfda04f9c48cc13669e149a8895642 /llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp | |
parent | a3eda371ec364a4339325955ab4e3eed98cfa772 (diff) | |
download | bcm5719-llvm-ec6151066f73d1e27a059fc0924e031481903279.tar.gz bcm5719-llvm-ec6151066f73d1e27a059fc0924e031481903279.zip |
[Orc] Add experimental C bindings for Orc.
llvm-svn: 251472
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp b/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp new file mode 100644 index 00000000000..9643f466360 --- /dev/null +++ b/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp @@ -0,0 +1,80 @@ +//===----------- OrcCBindings.cpp - C bindings for the Orc APIs -----------===// +// +// 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-c/OrcBindings.h" + +using namespace llvm; + +DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcCBindingsStack, LLVMOrcJITStackRef); +DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef); + +LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM, + LLVMContextRef Context) { + TargetMachine *TM2(unwrap(TM)); + LLVMContext &Ctx = *unwrap(Context); + + Triple T(TM2->getTargetTriple()); + + auto CallbackMgrBuilder = OrcCBindingsStack::createCallbackManagerBuilder(T); + auto IndirectStubsMgrBuilder = + OrcCBindingsStack::createIndirectStubsMgrBuilder(T); + + OrcCBindingsStack *JITStack = + new OrcCBindingsStack(*TM2, Ctx, CallbackMgrBuilder, + IndirectStubsMgrBuilder); + + return wrap(JITStack); +} + +void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledName, + const char *SymbolName) { + OrcCBindingsStack &J = *unwrap(JITStack); + std::string Mangled = J.mangle(SymbolName); + *MangledName = new char[Mangled.size() + 1]; + strcpy(*MangledName, Mangled.c_str()); +} + +void LLVMOrcDisposeMangledSymbol(char *MangledName) { + delete[] MangledName; +} + +LLVMOrcModuleHandle +LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod, + LLVMOrcSymbolResolverFn SymbolResolver, + void *SymbolResolverCtx) { + OrcCBindingsStack &J = *unwrap(JITStack); + Module *M(unwrap(Mod)); + return J.addIRModuleEager(M, SymbolResolver, SymbolResolverCtx); +} + +LLVMOrcModuleHandle +LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod, + LLVMOrcSymbolResolverFn SymbolResolver, + void *SymbolResolverCtx) { + OrcCBindingsStack &J = *unwrap(JITStack); + Module *M(unwrap(Mod)); + return J.addIRModuleLazy(M, SymbolResolver, SymbolResolverCtx); +} + +void LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, LLVMOrcModuleHandle H) { + OrcCBindingsStack &J = *unwrap(JITStack); + J.removeModule(H); +} + +LLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack, + const char *SymbolName) { + OrcCBindingsStack &J = *unwrap(JITStack); + auto Sym = J.findSymbol(SymbolName, true); + return Sym.getAddress(); +} + +void LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) { + delete unwrap(JITStack); +} |