xref: /aosp_15_r20/external/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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