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 15LLVMOrcJITStackRef 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 30const char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack) { 31 OrcCBindingsStack &J = *unwrap(JITStack); 32 return J.getErrorMessage().c_str(); 33} 34 35void 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 43void LLVMOrcDisposeMangledSymbol(char *MangledName) { delete[] MangledName; } 44 45LLVMOrcTargetAddress 46LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack, 47 LLVMOrcLazyCompileCallbackFn Callback, 48 void *CallbackCtx) { 49 OrcCBindingsStack &J = *unwrap(JITStack); 50 return J.createLazyCompileCallback(Callback, CallbackCtx); 51} 52 53LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack, 54 const char *StubName, 55 LLVMOrcTargetAddress InitAddr) { 56 OrcCBindingsStack &J = *unwrap(JITStack); 57 return J.createIndirectStub(StubName, InitAddr); 58} 59 60LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack, 61 const char *StubName, 62 LLVMOrcTargetAddress NewAddr) { 63 OrcCBindingsStack &J = *unwrap(JITStack); 64 return J.setIndirectStubPointer(StubName, NewAddr); 65} 66 67LLVMOrcModuleHandle 68LLVMOrcAddEagerlyCompiledIR(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 76LLVMOrcModuleHandle 77LLVMOrcAddLazilyCompiledIR(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 85void LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, LLVMOrcModuleHandle H) { 86 OrcCBindingsStack &J = *unwrap(JITStack); 87 J.removeModule(H); 88} 89 90LLVMOrcTargetAddress 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 97void LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) { 98 delete unwrap(JITStack); 99} 100