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