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 LLVMSharedModuleRef LLVMOrcMakeSharedModule(LLVMModuleRef Mod) { 16 return wrap(new std::shared_ptr<Module>(unwrap(Mod))); 17 } 18 19 void LLVMOrcDisposeSharedModuleRef(LLVMSharedModuleRef SharedMod) { 20 delete unwrap(SharedMod); 21 } 22 23 LLVMSharedObjectBufferRef 24 LLVMOrcMakeSharedObjectBuffer(LLVMMemoryBufferRef ObjBuffer) { 25 return wrap(new std::shared_ptr<MemoryBuffer>(unwrap(ObjBuffer))); 26 } 27 28 void 29 LLVMOrcDisposeSharedObjectBufferRef(LLVMSharedObjectBufferRef SharedObjBuffer) { 30 delete unwrap(SharedObjBuffer); 31 } 32 33 LLVMOrcJITStackRef 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 48 const char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack) { 49 OrcCBindingsStack &J = *unwrap(JITStack); 50 return J.getErrorMessage().c_str(); 51 } 52 53 void 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 61 void LLVMOrcDisposeMangledSymbol(char *MangledName) { delete[] MangledName; } 62 63 LLVMOrcErrorCode 64 LLVMOrcCreateLazyCompileCallback(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 72 LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack, 73 const char *StubName, 74 LLVMOrcTargetAddress InitAddr) { 75 OrcCBindingsStack &J = *unwrap(JITStack); 76 return J.createIndirectStub(StubName, InitAddr); 77 } 78 79 LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack, 80 const char *StubName, 81 LLVMOrcTargetAddress NewAddr) { 82 OrcCBindingsStack &J = *unwrap(JITStack); 83 return J.setIndirectStubPointer(StubName, NewAddr); 84 } 85 86 LLVMOrcErrorCode 87 LLVMOrcAddEagerlyCompiledIR(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 97 LLVMOrcErrorCode 98 LLVMOrcAddLazilyCompiledIR(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 108 LLVMOrcErrorCode LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, 109 LLVMOrcModuleHandle H) { 110 OrcCBindingsStack &J = *unwrap(JITStack); 111 return J.removeModule(H); 112 } 113 114 LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack, 115 LLVMOrcTargetAddress *RetAddr, 116 const char *SymbolName) { 117 OrcCBindingsStack &J = *unwrap(JITStack); 118 return J.findSymbolAddress(*RetAddr, SymbolName, true); 119 } 120 121 LLVMOrcErrorCode LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) { 122 auto *J = unwrap(JITStack); 123 auto Err = J->shutdown(); 124 delete J; 125 return Err; 126 } 127