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