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 13 using namespace llvm; 14 15 LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM) { 16 TargetMachine *TM2(unwrap(TM)); 17 18 Triple T(TM2->getTargetTriple()); 19 20 auto CompileCallbackMgr = orc::createLocalCompileCallbackManager(T, 0); 21 auto IndirectStubsMgrBuilder = 22 orc::createLocalIndirectStubsManagerBuilder(T); 23 24 OrcCBindingsStack *JITStack = new OrcCBindingsStack( 25 *TM2, std::move(CompileCallbackMgr), IndirectStubsMgrBuilder); 26 27 return wrap(JITStack); 28 } 29 30 const char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack) { 31 OrcCBindingsStack &J = *unwrap(JITStack); 32 return J.getErrorMessage().c_str(); 33 } 34 35 void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledName, 36 const char *SymbolName) { 37 OrcCBindingsStack &J = *unwrap(JITStack); 38 std::string Mangled = J.mangle(SymbolName); 39 *MangledName = new char[Mangled.size() + 1]; 40 strcpy(*MangledName, Mangled.c_str()); 41 } 42 43 void LLVMOrcDisposeMangledSymbol(char *MangledName) { delete[] MangledName; } 44 45 LLVMOrcTargetAddress 46 LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack, 47 LLVMOrcLazyCompileCallbackFn Callback, 48 void *CallbackCtx) { 49 OrcCBindingsStack &J = *unwrap(JITStack); 50 return J.createLazyCompileCallback(Callback, CallbackCtx); 51 } 52 53 LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack, 54 const char *StubName, 55 LLVMOrcTargetAddress InitAddr) { 56 OrcCBindingsStack &J = *unwrap(JITStack); 57 return J.createIndirectStub(StubName, InitAddr); 58 } 59 60 LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack, 61 const char *StubName, 62 LLVMOrcTargetAddress NewAddr) { 63 OrcCBindingsStack &J = *unwrap(JITStack); 64 return J.setIndirectStubPointer(StubName, NewAddr); 65 } 66 67 LLVMOrcModuleHandle 68 LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod, 69 LLVMOrcSymbolResolverFn SymbolResolver, 70 void *SymbolResolverCtx) { 71 OrcCBindingsStack &J = *unwrap(JITStack); 72 Module *M(unwrap(Mod)); 73 return J.addIRModuleEager(M, SymbolResolver, SymbolResolverCtx); 74 } 75 76 LLVMOrcModuleHandle 77 LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod, 78 LLVMOrcSymbolResolverFn SymbolResolver, 79 void *SymbolResolverCtx) { 80 OrcCBindingsStack &J = *unwrap(JITStack); 81 Module *M(unwrap(Mod)); 82 return J.addIRModuleLazy(M, SymbolResolver, SymbolResolverCtx); 83 } 84 85 void LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, LLVMOrcModuleHandle H) { 86 OrcCBindingsStack &J = *unwrap(JITStack); 87 J.removeModule(H); 88 } 89 90 LLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack, 91 const char *SymbolName) { 92 OrcCBindingsStack &J = *unwrap(JITStack); 93 auto Sym = J.findSymbol(SymbolName, true); 94 return Sym.getAddress(); 95 } 96 97 void LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) { 98 delete unwrap(JITStack); 99 } 100