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
15LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM) {
16  TargetMachine *TM2(unwrap(TM));
17
18  Triple T(TM2->getTargetTriple());
19
20  auto CompileCallbackMgr = orc::createLocalCompileCallbackManager(T, 0);
21  auto IndirectStubsMgrBuilder =
22      orc::createLocalIndirectStubsManagerBuilder(T);
23
24  OrcCBindingsStack *JITStack = new OrcCBindingsStack(
25      *TM2, std::move(CompileCallbackMgr), IndirectStubsMgrBuilder);
26
27  return wrap(JITStack);
28}
29
30const char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack) {
31  OrcCBindingsStack &J = *unwrap(JITStack);
32  return J.getErrorMessage().c_str();
33}
34
35void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledName,
36                             const char *SymbolName) {
37  OrcCBindingsStack &J = *unwrap(JITStack);
38  std::string Mangled = J.mangle(SymbolName);
39  *MangledName = new char[Mangled.size() + 1];
40  strcpy(*MangledName, Mangled.c_str());
41}
42
43void LLVMOrcDisposeMangledSymbol(char *MangledName) { delete[] MangledName; }
44
45LLVMOrcTargetAddress
46LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack,
47                                 LLVMOrcLazyCompileCallbackFn Callback,
48                                 void *CallbackCtx) {
49  OrcCBindingsStack &J = *unwrap(JITStack);
50  return J.createLazyCompileCallback(Callback, CallbackCtx);
51}
52
53LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack,
54                                           const char *StubName,
55                                           LLVMOrcTargetAddress InitAddr) {
56  OrcCBindingsStack &J = *unwrap(JITStack);
57  return J.createIndirectStub(StubName, InitAddr);
58}
59
60LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack,
61                                               const char *StubName,
62                                               LLVMOrcTargetAddress NewAddr) {
63  OrcCBindingsStack &J = *unwrap(JITStack);
64  return J.setIndirectStubPointer(StubName, NewAddr);
65}
66
67LLVMOrcModuleHandle
68LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
69                            LLVMOrcSymbolResolverFn SymbolResolver,
70                            void *SymbolResolverCtx) {
71  OrcCBindingsStack &J = *unwrap(JITStack);
72  Module *M(unwrap(Mod));
73  return J.addIRModuleEager(M, SymbolResolver, SymbolResolverCtx);
74}
75
76LLVMOrcModuleHandle
77LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
78                           LLVMOrcSymbolResolverFn SymbolResolver,
79                           void *SymbolResolverCtx) {
80  OrcCBindingsStack &J = *unwrap(JITStack);
81  Module *M(unwrap(Mod));
82  return J.addIRModuleLazy(M, SymbolResolver, SymbolResolverCtx);
83}
84
85void LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, LLVMOrcModuleHandle H) {
86  OrcCBindingsStack &J = *unwrap(JITStack);
87  J.removeModule(H);
88}
89
90LLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
91                                             const char *SymbolName) {
92  OrcCBindingsStack &J = *unwrap(JITStack);
93  auto Sym = J.findSymbol(SymbolName, true);
94  return Sym.getAddress();
95}
96
97void LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) {
98  delete unwrap(JITStack);
99}
100