1f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===----------- OrcCBindings.cpp - C bindings for the Orc APIs -----------===// 2f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// 3f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// The LLVM Compiler Infrastructure 4f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// 5f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source 6f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// License. See LICENSE.TXT for details. 7f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// 8f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===----------------------------------------------------------------------===// 9f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 10f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "OrcCBindingsStack.h" 11f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm-c/OrcBindings.h" 12f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 13f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarusing namespace llvm; 14f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 15f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM) { 16f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar TargetMachine *TM2(unwrap(TM)); 17f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 18f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Triple T(TM2->getTargetTriple()); 19f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto CompileCallbackMgr = orc::createLocalCompileCallbackManager(T, 0); 21f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar auto IndirectStubsMgrBuilder = 22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar orc::createLocalIndirectStubsManagerBuilder(T); 23f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OrcCBindingsStack *JITStack = new OrcCBindingsStack( 25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar *TM2, std::move(CompileCallbackMgr), IndirectStubsMgrBuilder); 26f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 27f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return wrap(JITStack); 28f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 29f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarconst char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack) { 31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OrcCBindingsStack &J = *unwrap(JITStack); 32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return J.getErrorMessage().c_str(); 33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 35f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledName, 36f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar const char *SymbolName) { 37f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar OrcCBindingsStack &J = *unwrap(JITStack); 38f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar std::string Mangled = J.mangle(SymbolName); 39f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar *MangledName = new char[Mangled.size() + 1]; 40f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar strcpy(*MangledName, Mangled.c_str()); 41f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 42f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid LLVMOrcDisposeMangledSymbol(char *MangledName) { delete[] MangledName; } 44f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 45f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMOrcTargetAddress 46f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack, 47f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar LLVMOrcLazyCompileCallbackFn Callback, 48f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar void *CallbackCtx) { 49f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar OrcCBindingsStack &J = *unwrap(JITStack); 50f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return J.createLazyCompileCallback(Callback, CallbackCtx); 51f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 52f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack, 54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const char *StubName, 55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar LLVMOrcTargetAddress InitAddr) { 56f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar OrcCBindingsStack &J = *unwrap(JITStack); 57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return J.createIndirectStub(StubName, InitAddr); 58f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 59f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack, 61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const char *StubName, 62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar LLVMOrcTargetAddress NewAddr) { 63f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar OrcCBindingsStack &J = *unwrap(JITStack); 64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return J.setIndirectStubPointer(StubName, NewAddr); 65f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 66f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 67f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMOrcModuleHandle 68f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod, 69f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar LLVMOrcSymbolResolverFn SymbolResolver, 70f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar void *SymbolResolverCtx) { 71f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar OrcCBindingsStack &J = *unwrap(JITStack); 72f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Module *M(unwrap(Mod)); 73f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return J.addIRModuleEager(M, SymbolResolver, SymbolResolverCtx); 74f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 75f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 76f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMOrcModuleHandle 77f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod, 78f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar LLVMOrcSymbolResolverFn SymbolResolver, 79f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar void *SymbolResolverCtx) { 80f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar OrcCBindingsStack &J = *unwrap(JITStack); 81f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Module *M(unwrap(Mod)); 82f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return J.addIRModuleLazy(M, SymbolResolver, SymbolResolverCtx); 83f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 84f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 85f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, LLVMOrcModuleHandle H) { 86f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar OrcCBindingsStack &J = *unwrap(JITStack); 87f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar J.removeModule(H); 88f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 89f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 90f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack, 91f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar const char *SymbolName) { 92f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar OrcCBindingsStack &J = *unwrap(JITStack); 93f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar auto Sym = J.findSymbol(SymbolName, true); 94f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return Sym.getAddress(); 95f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 96f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 97f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) { 98f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar delete unwrap(JITStack); 99f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 100