OrcCBindings.cpp revision 321369
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
13using namespace llvm;
14
15LLVMSharedModuleRef LLVMOrcMakeSharedModule(LLVMModuleRef Mod) {
16  return wrap(new std::shared_ptr<Module>(unwrap(Mod)));
17}
18
19void LLVMOrcDisposeSharedModuleRef(LLVMSharedModuleRef SharedMod) {
20  delete unwrap(SharedMod);
21}
22
23LLVMSharedObjectBufferRef
24LLVMOrcMakeSharedObjectBuffer(LLVMMemoryBufferRef ObjBuffer) {
25  return wrap(new std::shared_ptr<MemoryBuffer>(unwrap(ObjBuffer)));
26}
27
28void
29LLVMOrcDisposeSharedObjectBufferRef(LLVMSharedObjectBufferRef SharedObjBuffer) {
30  delete unwrap(SharedObjBuffer);
31}
32
33LLVMOrcJITStackRef 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
48const char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack) {
49  OrcCBindingsStack &J = *unwrap(JITStack);
50  return J.getErrorMessage().c_str();
51}
52
53void 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
61void LLVMOrcDisposeMangledSymbol(char *MangledName) { delete[] MangledName; }
62
63LLVMOrcErrorCode
64LLVMOrcCreateLazyCompileCallback(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
72LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack,
73                                           const char *StubName,
74                                           LLVMOrcTargetAddress InitAddr) {
75  OrcCBindingsStack &J = *unwrap(JITStack);
76  return J.createIndirectStub(StubName, InitAddr);
77}
78
79LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack,
80                                               const char *StubName,
81                                               LLVMOrcTargetAddress NewAddr) {
82  OrcCBindingsStack &J = *unwrap(JITStack);
83  return J.setIndirectStubPointer(StubName, NewAddr);
84}
85
86LLVMOrcErrorCode
87LLVMOrcAddEagerlyCompiledIR(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
97LLVMOrcErrorCode
98LLVMOrcAddLazilyCompiledIR(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
108LLVMOrcErrorCode LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack,
109                                     LLVMOrcModuleHandle H) {
110  OrcCBindingsStack &J = *unwrap(JITStack);
111  return J.removeModule(H);
112}
113
114LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
115                                         LLVMOrcTargetAddress *RetAddr,
116                                         const char *SymbolName) {
117  OrcCBindingsStack &J = *unwrap(JITStack);
118  return J.findSymbolAddress(*RetAddr, SymbolName, true);
119}
120
121LLVMOrcErrorCode LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) {
122  auto *J = unwrap(JITStack);
123  auto Err = J->shutdown();
124  delete J;
125  return Err;
126}
127