blob: f945acaf95ee68e4a532114f0289b507803dcf3a [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
Reid Klecknerc7fd1542018-03-14 21:32:34 +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
Rafael Espindolae63e0182015-11-03 16:40:37 +000023LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM) {
Lang Hames130a7c42015-10-28 02:40:04 +000024 TargetMachine *TM2(unwrap(TM));
Lang Hames130a7c42015-10-28 02:40:04 +000025
26 Triple T(TM2->getTargetTriple());
27
Lang Hames105518f2016-05-26 17:20:35 +000028 auto CompileCallbackMgr = orc::createLocalCompileCallbackManager(T, 0);
Lang Hames130a7c42015-10-28 02:40:04 +000029 auto IndirectStubsMgrBuilder =
Lang Hames105518f2016-05-26 17:20:35 +000030 orc::createLocalIndirectStubsManagerBuilder(T);
Lang Hames130a7c42015-10-28 02:40:04 +000031
Lang Hames1fa0e0e2016-04-25 21:21:20 +000032 OrcCBindingsStack *JITStack = new OrcCBindingsStack(
33 *TM2, std::move(CompileCallbackMgr), IndirectStubsMgrBuilder);
Lang Hames130a7c42015-10-28 02:40:04 +000034
35 return wrap(JITStack);
36}
37
Lang Hamesef5a0ee2016-04-25 19:56:45 +000038const char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack) {
39 OrcCBindingsStack &J = *unwrap(JITStack);
40 return J.getErrorMessage().c_str();
41}
42
Lang Hames130a7c42015-10-28 02:40:04 +000043void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledName,
44 const char *SymbolName) {
45 OrcCBindingsStack &J = *unwrap(JITStack);
46 std::string Mangled = J.mangle(SymbolName);
47 *MangledName = new char[Mangled.size() + 1];
48 strcpy(*MangledName, Mangled.c_str());
49}
50
Lang Hames1fa0e0e2016-04-25 21:21:20 +000051void LLVMOrcDisposeMangledSymbol(char *MangledName) { delete[] MangledName; }
Lang Hames130a7c42015-10-28 02:40:04 +000052
Lang Hames4ce98662017-07-07 02:59:13 +000053LLVMOrcErrorCode
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000054LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack,
Lang Hames4ce98662017-07-07 02:59:13 +000055 LLVMOrcTargetAddress *RetAddr,
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000056 LLVMOrcLazyCompileCallbackFn Callback,
57 void *CallbackCtx) {
58 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hames4ce98662017-07-07 02:59:13 +000059 return J.createLazyCompileCallback(*RetAddr, Callback, CallbackCtx);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000060}
61
Lang Hamesef5a0ee2016-04-25 19:56:45 +000062LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack,
63 const char *StubName,
64 LLVMOrcTargetAddress InitAddr) {
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000065 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hamesef5a0ee2016-04-25 19:56:45 +000066 return J.createIndirectStub(StubName, InitAddr);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000067}
68
Lang Hamesef5a0ee2016-04-25 19:56:45 +000069LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack,
70 const char *StubName,
71 LLVMOrcTargetAddress NewAddr) {
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000072 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hamesef5a0ee2016-04-25 19:56:45 +000073 return J.setIndirectStubPointer(StubName, NewAddr);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000074}
75
Lang Hames4ce98662017-07-07 02:59:13 +000076LLVMOrcErrorCode
Lang Hamescd9d49b2017-06-23 23:25:28 +000077LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack,
Lang Hames4ce98662017-07-07 02:59:13 +000078 LLVMOrcModuleHandle *RetHandle,
Reid Klecknerc7fd1542018-03-14 21:32:34 +000079 LLVMSharedModuleRef Mod,
Lang Hames130a7c42015-10-28 02:40:04 +000080 LLVMOrcSymbolResolverFn SymbolResolver,
81 void *SymbolResolverCtx) {
82 OrcCBindingsStack &J = *unwrap(JITStack);
Reid Klecknerc7fd1542018-03-14 21:32:34 +000083 std::shared_ptr<Module> *M(unwrap(Mod));
84 return J.addIRModuleEager(*RetHandle, *M, SymbolResolver, SymbolResolverCtx);
Lang Hames130a7c42015-10-28 02:40:04 +000085}
86
Lang Hames4ce98662017-07-07 02:59:13 +000087LLVMOrcErrorCode
Lang Hamescd9d49b2017-06-23 23:25:28 +000088LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack,
Lang Hames4ce98662017-07-07 02:59:13 +000089 LLVMOrcModuleHandle *RetHandle,
Reid Klecknerc7fd1542018-03-14 21:32:34 +000090 LLVMSharedModuleRef Mod,
Lang Hames130a7c42015-10-28 02:40:04 +000091 LLVMOrcSymbolResolverFn SymbolResolver,
92 void *SymbolResolverCtx) {
93 OrcCBindingsStack &J = *unwrap(JITStack);
Reid Klecknerc7fd1542018-03-14 21:32:34 +000094 std::shared_ptr<Module> *M(unwrap(Mod));
95 return J.addIRModuleLazy(*RetHandle, *M, SymbolResolver, SymbolResolverCtx);
Lang Hames130a7c42015-10-28 02:40:04 +000096}
97
Lang Hamesec300632017-09-17 03:25:03 +000098LLVMOrcErrorCode
99LLVMOrcAddObjectFile(LLVMOrcJITStackRef JITStack,
100 LLVMOrcModuleHandle *RetHandle,
101 LLVMMemoryBufferRef Obj,
102 LLVMOrcSymbolResolverFn SymbolResolver,
103 void *SymbolResolverCtx) {
104 OrcCBindingsStack &J = *unwrap(JITStack);
105 std::unique_ptr<MemoryBuffer> O(unwrap(Obj));
106 return J.addObject(*RetHandle, std::move(O), SymbolResolver,
107 SymbolResolverCtx);
108}
109
Lang Hames4ce98662017-07-07 02:59:13 +0000110LLVMOrcErrorCode LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack,
111 LLVMOrcModuleHandle H) {
Lang Hames130a7c42015-10-28 02:40:04 +0000112 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hames4ce98662017-07-07 02:59:13 +0000113 return J.removeModule(H);
Lang Hames130a7c42015-10-28 02:40:04 +0000114}
115
Lang Hames4ce98662017-07-07 02:59:13 +0000116LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
117 LLVMOrcTargetAddress *RetAddr,
118 const char *SymbolName) {
Lang Hames130a7c42015-10-28 02:40:04 +0000119 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hames4ce98662017-07-07 02:59:13 +0000120 return J.findSymbolAddress(*RetAddr, SymbolName, true);
Lang Hames130a7c42015-10-28 02:40:04 +0000121}
122
Lang Hames4ce98662017-07-07 02:59:13 +0000123LLVMOrcErrorCode LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) {
124 auto *J = unwrap(JITStack);
125 auto Err = J->shutdown();
126 delete J;
127 return Err;
Lang Hames130a7c42015-10-28 02:40:04 +0000128}