blob: 5fe259f80b6fbd6ca4822fcca7c31f0434edcb14 [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
Lang Hames2c19c1b2017-06-23 21:45:29 +000015LLVMSharedModuleRef 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
Rafael Espindolae63e0182015-11-03 16:40:37 +000033LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM) {
Lang Hames130a7c42015-10-28 02:40:04 +000034 TargetMachine *TM2(unwrap(TM));
Lang Hames130a7c42015-10-28 02:40:04 +000035
36 Triple T(TM2->getTargetTriple());
37
Lang Hames105518f2016-05-26 17:20:35 +000038 auto CompileCallbackMgr = orc::createLocalCompileCallbackManager(T, 0);
Lang Hames130a7c42015-10-28 02:40:04 +000039 auto IndirectStubsMgrBuilder =
Lang Hames105518f2016-05-26 17:20:35 +000040 orc::createLocalIndirectStubsManagerBuilder(T);
Lang Hames130a7c42015-10-28 02:40:04 +000041
Lang Hames1fa0e0e2016-04-25 21:21:20 +000042 OrcCBindingsStack *JITStack = new OrcCBindingsStack(
43 *TM2, std::move(CompileCallbackMgr), IndirectStubsMgrBuilder);
Lang Hames130a7c42015-10-28 02:40:04 +000044
45 return wrap(JITStack);
46}
47
Lang Hamesef5a0ee2016-04-25 19:56:45 +000048const char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack) {
49 OrcCBindingsStack &J = *unwrap(JITStack);
50 return J.getErrorMessage().c_str();
51}
52
Lang Hames130a7c42015-10-28 02:40:04 +000053void 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
Lang Hames1fa0e0e2016-04-25 21:21:20 +000061void LLVMOrcDisposeMangledSymbol(char *MangledName) { delete[] MangledName; }
Lang Hames130a7c42015-10-28 02:40:04 +000062
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000063LLVMOrcTargetAddress
64LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack,
65 LLVMOrcLazyCompileCallbackFn Callback,
66 void *CallbackCtx) {
67 OrcCBindingsStack &J = *unwrap(JITStack);
68 return J.createLazyCompileCallback(Callback, CallbackCtx);
69}
70
Lang Hamesef5a0ee2016-04-25 19:56:45 +000071LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack,
72 const char *StubName,
73 LLVMOrcTargetAddress InitAddr) {
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000074 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hamesef5a0ee2016-04-25 19:56:45 +000075 return J.createIndirectStub(StubName, InitAddr);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000076}
77
Lang Hamesef5a0ee2016-04-25 19:56:45 +000078LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack,
79 const char *StubName,
80 LLVMOrcTargetAddress NewAddr) {
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000081 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hamesef5a0ee2016-04-25 19:56:45 +000082 return J.setIndirectStubPointer(StubName, NewAddr);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000083}
84
Lang Hames130a7c42015-10-28 02:40:04 +000085LLVMOrcModuleHandle
Lang Hames2c19c1b2017-06-23 21:45:29 +000086LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack,
87 LLVMSharedModuleRef Mod,
Lang Hames130a7c42015-10-28 02:40:04 +000088 LLVMOrcSymbolResolverFn SymbolResolver,
89 void *SymbolResolverCtx) {
90 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hames2c19c1b2017-06-23 21:45:29 +000091 std::shared_ptr<Module> *M(unwrap(Mod));
92 return J.addIRModuleEager(*M, SymbolResolver, SymbolResolverCtx);
Lang Hames130a7c42015-10-28 02:40:04 +000093}
94
95LLVMOrcModuleHandle
Lang Hames2c19c1b2017-06-23 21:45:29 +000096LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack,
97 LLVMSharedModuleRef Mod,
Lang Hames130a7c42015-10-28 02:40:04 +000098 LLVMOrcSymbolResolverFn SymbolResolver,
99 void *SymbolResolverCtx) {
100 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hames2c19c1b2017-06-23 21:45:29 +0000101 std::shared_ptr<Module> *M(unwrap(Mod));
102 return J.addIRModuleLazy(*M, SymbolResolver, SymbolResolverCtx);
Lang Hames130a7c42015-10-28 02:40:04 +0000103}
104
105void LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, LLVMOrcModuleHandle H) {
106 OrcCBindingsStack &J = *unwrap(JITStack);
107 J.removeModule(H);
108}
109
110LLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
111 const char *SymbolName) {
112 OrcCBindingsStack &J = *unwrap(JITStack);
113 auto Sym = J.findSymbol(SymbolName, true);
114 return Sym.getAddress();
115}
116
117void LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) {
118 delete unwrap(JITStack);
119}