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