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 LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM) { 24 TargetMachine *TM2(unwrap(TM)); 25 26 Triple T(TM2->getTargetTriple()); 27 28 auto CompileCallbackMgr = orc::createLocalCompileCallbackManager(T, 0); 29 auto IndirectStubsMgrBuilder = 30 orc::createLocalIndirectStubsManagerBuilder(T); 31 32 OrcCBindingsStack *JITStack = new OrcCBindingsStack( 33 *TM2, std::move(CompileCallbackMgr), IndirectStubsMgrBuilder); 34 35 return wrap(JITStack); 36 } 37 38 const char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack) { 39 OrcCBindingsStack &J = *unwrap(JITStack); 40 return J.getErrorMessage().c_str(); 41 } 42 43 void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledName, 44 const char *SymbolName) { 45 OrcCBindingsStack &J = *unwrap(JITStack); 46 std::string Mangled = J.mangle(SymbolName); 47 *MangledName = new char[Mangled.size() + 1]; 48 strcpy(*MangledName, Mangled.c_str()); 49 } 50 51 void LLVMOrcDisposeMangledSymbol(char *MangledName) { delete[] MangledName; } 52 53 LLVMOrcErrorCode 54 LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack, 55 LLVMOrcTargetAddress *RetAddr, 56 LLVMOrcLazyCompileCallbackFn Callback, 57 void *CallbackCtx) { 58 OrcCBindingsStack &J = *unwrap(JITStack); 59 return J.createLazyCompileCallback(*RetAddr, Callback, CallbackCtx); 60 } 61 62 LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack, 63 const char *StubName, 64 LLVMOrcTargetAddress InitAddr) { 65 OrcCBindingsStack &J = *unwrap(JITStack); 66 return J.createIndirectStub(StubName, InitAddr); 67 } 68 69 LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack, 70 const char *StubName, 71 LLVMOrcTargetAddress NewAddr) { 72 OrcCBindingsStack &J = *unwrap(JITStack); 73 return J.setIndirectStubPointer(StubName, NewAddr); 74 } 75 76 LLVMOrcErrorCode 77 LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, 78 LLVMOrcModuleHandle *RetHandle, 79 LLVMSharedModuleRef Mod, 80 LLVMOrcSymbolResolverFn SymbolResolver, 81 void *SymbolResolverCtx) { 82 OrcCBindingsStack &J = *unwrap(JITStack); 83 std::shared_ptr<Module> *M(unwrap(Mod)); 84 return J.addIRModuleEager(*RetHandle, *M, SymbolResolver, SymbolResolverCtx); 85 } 86 87 LLVMOrcErrorCode 88 LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, 89 LLVMOrcModuleHandle *RetHandle, 90 LLVMSharedModuleRef Mod, 91 LLVMOrcSymbolResolverFn SymbolResolver, 92 void *SymbolResolverCtx) { 93 OrcCBindingsStack &J = *unwrap(JITStack); 94 std::shared_ptr<Module> *M(unwrap(Mod)); 95 return J.addIRModuleLazy(*RetHandle, *M, SymbolResolver, SymbolResolverCtx); 96 } 97 98 LLVMOrcErrorCode 99 LLVMOrcAddObjectFile(LLVMOrcJITStackRef JITStack, 100 LLVMOrcModuleHandle *RetHandle, 101 LLVMMemoryBufferRef Obj, 102 LLVMOrcSymbolResolverFn SymbolResolver, 103 void *SymbolResolverCtx) { 104 OrcCBindingsStack &J = *unwrap(JITStack); 105 std::unique_ptr<MemoryBuffer> O(unwrap(Obj)); 106 return J.addObject(*RetHandle, std::move(O), SymbolResolver, 107 SymbolResolverCtx); 108 } 109 110 LLVMOrcErrorCode LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, 111 LLVMOrcModuleHandle H) { 112 OrcCBindingsStack &J = *unwrap(JITStack); 113 return J.removeModule(H); 114 } 115 116 LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack, 117 LLVMOrcTargetAddress *RetAddr, 118 const char *SymbolName) { 119 OrcCBindingsStack &J = *unwrap(JITStack); 120 return J.findSymbolAddress(*RetAddr, SymbolName, true); 121 } 122 123 LLVMOrcErrorCode LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) { 124 auto *J = unwrap(JITStack); 125 auto Err = J->shutdown(); 126 delete J; 127 return Err; 128 } 129