blob: de80cb1d0dd4c4a55f3af717b15c9a6a9f94303b [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 Hamescd9d49b2017-06-23 23:25:28 +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 Hames4ce98662017-07-07 02:59:13 +000063LLVMOrcErrorCode
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000064LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack,
Lang Hames4ce98662017-07-07 02:59:13 +000065 LLVMOrcTargetAddress *RetAddr,
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000066 LLVMOrcLazyCompileCallbackFn Callback,
67 void *CallbackCtx) {
68 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hames4ce98662017-07-07 02:59:13 +000069 return J.createLazyCompileCallback(*RetAddr, Callback, CallbackCtx);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000070}
71
Lang Hamesef5a0ee2016-04-25 19:56:45 +000072LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack,
73 const char *StubName,
74 LLVMOrcTargetAddress InitAddr) {
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000075 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hamesef5a0ee2016-04-25 19:56:45 +000076 return J.createIndirectStub(StubName, InitAddr);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000077}
78
Lang Hamesef5a0ee2016-04-25 19:56:45 +000079LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack,
80 const char *StubName,
81 LLVMOrcTargetAddress NewAddr) {
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000082 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hamesef5a0ee2016-04-25 19:56:45 +000083 return J.setIndirectStubPointer(StubName, NewAddr);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000084}
85
Lang Hames4ce98662017-07-07 02:59:13 +000086LLVMOrcErrorCode
Lang Hamescd9d49b2017-06-23 23:25:28 +000087LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack,
Lang Hames4ce98662017-07-07 02:59:13 +000088 LLVMOrcModuleHandle *RetHandle,
Lang Hamescd9d49b2017-06-23 23:25:28 +000089 LLVMSharedModuleRef Mod,
Lang Hames130a7c42015-10-28 02:40:04 +000090 LLVMOrcSymbolResolverFn SymbolResolver,
91 void *SymbolResolverCtx) {
92 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hamescd9d49b2017-06-23 23:25:28 +000093 std::shared_ptr<Module> *M(unwrap(Mod));
Lang Hames4ce98662017-07-07 02:59:13 +000094 return J.addIRModuleEager(*RetHandle, *M, SymbolResolver, SymbolResolverCtx);
Lang Hames130a7c42015-10-28 02:40:04 +000095}
96
Lang Hames4ce98662017-07-07 02:59:13 +000097LLVMOrcErrorCode
Lang Hamescd9d49b2017-06-23 23:25:28 +000098LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack,
Lang Hames4ce98662017-07-07 02:59:13 +000099 LLVMOrcModuleHandle *RetHandle,
Lang Hamescd9d49b2017-06-23 23:25:28 +0000100 LLVMSharedModuleRef Mod,
Lang Hames130a7c42015-10-28 02:40:04 +0000101 LLVMOrcSymbolResolverFn SymbolResolver,
102 void *SymbolResolverCtx) {
103 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hamescd9d49b2017-06-23 23:25:28 +0000104 std::shared_ptr<Module> *M(unwrap(Mod));
Lang Hames4ce98662017-07-07 02:59:13 +0000105 return J.addIRModuleLazy(*RetHandle, *M, SymbolResolver, SymbolResolverCtx);
Lang Hames130a7c42015-10-28 02:40:04 +0000106}
107
Lang Hames4ce98662017-07-07 02:59:13 +0000108LLVMOrcErrorCode LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack,
109 LLVMOrcModuleHandle H) {
Lang Hames130a7c42015-10-28 02:40:04 +0000110 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hames4ce98662017-07-07 02:59:13 +0000111 return J.removeModule(H);
Lang Hames130a7c42015-10-28 02:40:04 +0000112}
113
Lang Hames4ce98662017-07-07 02:59:13 +0000114LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
115 LLVMOrcTargetAddress *RetAddr,
116 const char *SymbolName) {
Lang Hames130a7c42015-10-28 02:40:04 +0000117 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hames4ce98662017-07-07 02:59:13 +0000118 return J.findSymbolAddress(*RetAddr, SymbolName, true);
Lang Hames130a7c42015-10-28 02:40:04 +0000119}
120
Lang Hames4ce98662017-07-07 02:59:13 +0000121LLVMOrcErrorCode LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) {
122 auto *J = unwrap(JITStack);
123 auto Err = J->shutdown();
124 delete J;
125 return Err;
Lang Hames130a7c42015-10-28 02:40:04 +0000126}