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