OrcCBindings.cpp revision 321369
1//===----------- OrcCBindings.cpp - C bindings for the Orc APIs -----------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include "OrcCBindingsStack.h" 11#include "llvm-c/OrcBindings.h" 12 13using namespace llvm; 14 15LLVMSharedModuleRef LLVMOrcMakeSharedModule(LLVMModuleRef Mod) { 16 return wrap(new std::shared_ptr<Module>(unwrap(Mod))); 17} 18 19void LLVMOrcDisposeSharedModuleRef(LLVMSharedModuleRef SharedMod) { 20 delete unwrap(SharedMod); 21} 22 23LLVMSharedObjectBufferRef 24LLVMOrcMakeSharedObjectBuffer(LLVMMemoryBufferRef ObjBuffer) { 25 return wrap(new std::shared_ptr<MemoryBuffer>(unwrap(ObjBuffer))); 26} 27 28void 29LLVMOrcDisposeSharedObjectBufferRef(LLVMSharedObjectBufferRef SharedObjBuffer) { 30 delete unwrap(SharedObjBuffer); 31} 32 33LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM) { 34 TargetMachine *TM2(unwrap(TM)); 35 36 Triple T(TM2->getTargetTriple()); 37 38 auto CompileCallbackMgr = orc::createLocalCompileCallbackManager(T, 0); 39 auto IndirectStubsMgrBuilder = 40 orc::createLocalIndirectStubsManagerBuilder(T); 41 42 OrcCBindingsStack *JITStack = new OrcCBindingsStack( 43 *TM2, std::move(CompileCallbackMgr), IndirectStubsMgrBuilder); 44 45 return wrap(JITStack); 46} 47 48const char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack) { 49 OrcCBindingsStack &J = *unwrap(JITStack); 50 return J.getErrorMessage().c_str(); 51} 52 53void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledName, 54 const char *SymbolName) { 55 OrcCBindingsStack &J = *unwrap(JITStack); 56 std::string Mangled = J.mangle(SymbolName); 57 *MangledName = new char[Mangled.size() + 1]; 58 strcpy(*MangledName, Mangled.c_str()); 59} 60 61void LLVMOrcDisposeMangledSymbol(char *MangledName) { delete[] MangledName; } 62 63LLVMOrcErrorCode 64LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack, 65 LLVMOrcTargetAddress *RetAddr, 66 LLVMOrcLazyCompileCallbackFn Callback, 67 void *CallbackCtx) { 68 OrcCBindingsStack &J = *unwrap(JITStack); 69 return J.createLazyCompileCallback(*RetAddr, Callback, CallbackCtx); 70} 71 72LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack, 73 const char *StubName, 74 LLVMOrcTargetAddress InitAddr) { 75 OrcCBindingsStack &J = *unwrap(JITStack); 76 return J.createIndirectStub(StubName, InitAddr); 77} 78 79LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack, 80 const char *StubName, 81 LLVMOrcTargetAddress NewAddr) { 82 OrcCBindingsStack &J = *unwrap(JITStack); 83 return J.setIndirectStubPointer(StubName, NewAddr); 84} 85 86LLVMOrcErrorCode 87LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, 88 LLVMOrcModuleHandle *RetHandle, 89 LLVMSharedModuleRef Mod, 90 LLVMOrcSymbolResolverFn SymbolResolver, 91 void *SymbolResolverCtx) { 92 OrcCBindingsStack &J = *unwrap(JITStack); 93 std::shared_ptr<Module> *M(unwrap(Mod)); 94 return J.addIRModuleEager(*RetHandle, *M, SymbolResolver, SymbolResolverCtx); 95} 96 97LLVMOrcErrorCode 98LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, 99 LLVMOrcModuleHandle *RetHandle, 100 LLVMSharedModuleRef Mod, 101 LLVMOrcSymbolResolverFn SymbolResolver, 102 void *SymbolResolverCtx) { 103 OrcCBindingsStack &J = *unwrap(JITStack); 104 std::shared_ptr<Module> *M(unwrap(Mod)); 105 return J.addIRModuleLazy(*RetHandle, *M, SymbolResolver, SymbolResolverCtx); 106} 107 108LLVMOrcErrorCode LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, 109 LLVMOrcModuleHandle H) { 110 OrcCBindingsStack &J = *unwrap(JITStack); 111 return J.removeModule(H); 112} 113 114LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack, 115 LLVMOrcTargetAddress *RetAddr, 116 const char *SymbolName) { 117 OrcCBindingsStack &J = *unwrap(JITStack); 118 return J.findSymbolAddress(*RetAddr, SymbolName, true); 119} 120 121LLVMOrcErrorCode LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) { 122 auto *J = unwrap(JITStack); 123 auto Err = J->shutdown(); 124 delete J; 125 return Err; 126} 127