blob: 565a9d03ec9e769101dd1214f2be3eea98e69e81 [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
Lang Hamesef5a0ee2016-04-25 19:56:45 +000031const char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack) {
32 OrcCBindingsStack &J = *unwrap(JITStack);
33 return J.getErrorMessage().c_str();
34}
35
Lang Hames130a7c42015-10-28 02:40:04 +000036void 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
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000048LLVMOrcTargetAddress
49LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack,
50 LLVMOrcLazyCompileCallbackFn Callback,
51 void *CallbackCtx) {
52 OrcCBindingsStack &J = *unwrap(JITStack);
53 return J.createLazyCompileCallback(Callback, CallbackCtx);
54}
55
Lang Hamesef5a0ee2016-04-25 19:56:45 +000056LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack,
57 const char *StubName,
58 LLVMOrcTargetAddress InitAddr) {
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000059 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hamesef5a0ee2016-04-25 19:56:45 +000060 return J.createIndirectStub(StubName, InitAddr);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000061}
62
Lang Hamesef5a0ee2016-04-25 19:56:45 +000063LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack,
64 const char *StubName,
65 LLVMOrcTargetAddress NewAddr) {
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000066 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hamesef5a0ee2016-04-25 19:56:45 +000067 return J.setIndirectStubPointer(StubName, NewAddr);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000068}
69
Lang Hames130a7c42015-10-28 02:40:04 +000070LLVMOrcModuleHandle
71LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
72 LLVMOrcSymbolResolverFn SymbolResolver,
73 void *SymbolResolverCtx) {
74 OrcCBindingsStack &J = *unwrap(JITStack);
75 Module *M(unwrap(Mod));
76 return J.addIRModuleEager(M, SymbolResolver, SymbolResolverCtx);
77}
78
79LLVMOrcModuleHandle
80LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
81 LLVMOrcSymbolResolverFn SymbolResolver,
82 void *SymbolResolverCtx) {
83 OrcCBindingsStack &J = *unwrap(JITStack);
84 Module *M(unwrap(Mod));
85 return J.addIRModuleLazy(M, SymbolResolver, SymbolResolverCtx);
86}
87
88void LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, LLVMOrcModuleHandle H) {
89 OrcCBindingsStack &J = *unwrap(JITStack);
90 J.removeModule(H);
91}
92
93LLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
94 const char *SymbolName) {
95 OrcCBindingsStack &J = *unwrap(JITStack);
96 auto Sym = J.findSymbol(SymbolName, true);
97 return Sym.getAddress();
98}
99
100void LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) {
101 delete unwrap(JITStack);
102}