OrcCBindings.cpp revision 341825
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#include "llvm/ExecutionEngine/JITEventListener.h" 13 14using namespace llvm; 15 16LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM) { 17 TargetMachine *TM2(unwrap(TM)); 18 19 Triple T(TM2->getTargetTriple()); 20 21 auto IndirectStubsMgrBuilder = 22 orc::createLocalIndirectStubsManagerBuilder(T); 23 24 OrcCBindingsStack *JITStack = 25 new OrcCBindingsStack(*TM2, std::move(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 45LLVMOrcErrorCode 46LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack, 47 LLVMOrcTargetAddress *RetAddr, 48 LLVMOrcLazyCompileCallbackFn Callback, 49 void *CallbackCtx) { 50 OrcCBindingsStack &J = *unwrap(JITStack); 51 return J.createLazyCompileCallback(*RetAddr, Callback, CallbackCtx); 52} 53 54LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack, 55 const char *StubName, 56 LLVMOrcTargetAddress InitAddr) { 57 OrcCBindingsStack &J = *unwrap(JITStack); 58 return J.createIndirectStub(StubName, InitAddr); 59} 60 61LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack, 62 const char *StubName, 63 LLVMOrcTargetAddress NewAddr) { 64 OrcCBindingsStack &J = *unwrap(JITStack); 65 return J.setIndirectStubPointer(StubName, NewAddr); 66} 67 68LLVMOrcErrorCode 69LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, 70 LLVMOrcModuleHandle *RetHandle, LLVMModuleRef Mod, 71 LLVMOrcSymbolResolverFn SymbolResolver, 72 void *SymbolResolverCtx) { 73 OrcCBindingsStack &J = *unwrap(JITStack); 74 std::unique_ptr<Module> M(unwrap(Mod)); 75 return J.addIRModuleEager(*RetHandle, std::move(M), SymbolResolver, 76 SymbolResolverCtx); 77} 78 79LLVMOrcErrorCode 80LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, 81 LLVMOrcModuleHandle *RetHandle, LLVMModuleRef Mod, 82 LLVMOrcSymbolResolverFn SymbolResolver, 83 void *SymbolResolverCtx) { 84 OrcCBindingsStack &J = *unwrap(JITStack); 85 std::unique_ptr<Module> M(unwrap(Mod)); 86 return J.addIRModuleLazy(*RetHandle, std::move(M), SymbolResolver, 87 SymbolResolverCtx); 88} 89 90LLVMOrcErrorCode 91LLVMOrcAddObjectFile(LLVMOrcJITStackRef JITStack, 92 LLVMOrcModuleHandle *RetHandle, 93 LLVMMemoryBufferRef Obj, 94 LLVMOrcSymbolResolverFn SymbolResolver, 95 void *SymbolResolverCtx) { 96 OrcCBindingsStack &J = *unwrap(JITStack); 97 std::unique_ptr<MemoryBuffer> O(unwrap(Obj)); 98 return J.addObject(*RetHandle, std::move(O), SymbolResolver, 99 SymbolResolverCtx); 100} 101 102LLVMOrcErrorCode LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, 103 LLVMOrcModuleHandle H) { 104 OrcCBindingsStack &J = *unwrap(JITStack); 105 return J.removeModule(H); 106} 107 108LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack, 109 LLVMOrcTargetAddress *RetAddr, 110 const char *SymbolName) { 111 OrcCBindingsStack &J = *unwrap(JITStack); 112 return J.findSymbolAddress(*RetAddr, SymbolName, true); 113} 114 115LLVMOrcErrorCode LLVMOrcGetSymbolAddressIn(LLVMOrcJITStackRef JITStack, 116 LLVMOrcTargetAddress *RetAddr, 117 LLVMOrcModuleHandle H, 118 const char *SymbolName) { 119 OrcCBindingsStack &J = *unwrap(JITStack); 120 return J.findSymbolAddressIn(*RetAddr, H, SymbolName, true); 121} 122 123LLVMOrcErrorCode LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) { 124 auto *J = unwrap(JITStack); 125 auto Err = J->shutdown(); 126 delete J; 127 return Err; 128} 129 130void LLVMOrcRegisterJITEventListener(LLVMOrcJITStackRef JITStack, LLVMJITEventListenerRef L) 131{ 132 unwrap(JITStack)->RegisterJITEventListener(unwrap(L)); 133} 134 135void LLVMOrcUnregisterJITEventListener(LLVMOrcJITStackRef JITStack, LLVMJITEventListenerRef L) 136{ 137 unwrap(JITStack)->UnregisterJITEventListener(unwrap(L)); 138} 139