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