blob: 9643f466360fdb028aed1d3877594773060f0d26 [file] [log] [blame]
Lang Hames130a7c42015-10-28 02:40:04 +00001//===----------- 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
15DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcCBindingsStack, LLVMOrcJITStackRef);
16DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef);
17
18LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM,
19 LLVMContextRef Context) {
20 TargetMachine *TM2(unwrap(TM));
21 LLVMContext &Ctx = *unwrap(Context);
22
23 Triple T(TM2->getTargetTriple());
24
25 auto CallbackMgrBuilder = OrcCBindingsStack::createCallbackManagerBuilder(T);
26 auto IndirectStubsMgrBuilder =
27 OrcCBindingsStack::createIndirectStubsMgrBuilder(T);
28
29 OrcCBindingsStack *JITStack =
30 new OrcCBindingsStack(*TM2, Ctx, CallbackMgrBuilder,
31 IndirectStubsMgrBuilder);
32
33 return wrap(JITStack);
34}
35
36void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledName,
37 const char *SymbolName) {
38 OrcCBindingsStack &J = *unwrap(JITStack);
39 std::string Mangled = J.mangle(SymbolName);
40 *MangledName = new char[Mangled.size() + 1];
41 strcpy(*MangledName, Mangled.c_str());
42}
43
44void LLVMOrcDisposeMangledSymbol(char *MangledName) {
45 delete[] MangledName;
46}
47
48LLVMOrcModuleHandle
49LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
50 LLVMOrcSymbolResolverFn SymbolResolver,
51 void *SymbolResolverCtx) {
52 OrcCBindingsStack &J = *unwrap(JITStack);
53 Module *M(unwrap(Mod));
54 return J.addIRModuleEager(M, SymbolResolver, SymbolResolverCtx);
55}
56
57LLVMOrcModuleHandle
58LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
59 LLVMOrcSymbolResolverFn SymbolResolver,
60 void *SymbolResolverCtx) {
61 OrcCBindingsStack &J = *unwrap(JITStack);
62 Module *M(unwrap(Mod));
63 return J.addIRModuleLazy(M, SymbolResolver, SymbolResolverCtx);
64}
65
66void LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, LLVMOrcModuleHandle H) {
67 OrcCBindingsStack &J = *unwrap(JITStack);
68 J.removeModule(H);
69}
70
71LLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
72 const char *SymbolName) {
73 OrcCBindingsStack &J = *unwrap(JITStack);
74 auto Sym = J.findSymbol(SymbolName, true);
75 return Sym.getAddress();
76}
77
78void LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) {
79 delete unwrap(JITStack);
80}