blob: 0ea7a66398981192c3cf55898a26a6a7b63d3cd0 [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
Lang Hames105518f2016-05-26 17:20:35 +000020 auto CompileCallbackMgr = orc::createLocalCompileCallbackManager(T, 0);
Lang Hames130a7c42015-10-28 02:40:04 +000021 auto IndirectStubsMgrBuilder =
Lang Hames105518f2016-05-26 17:20:35 +000022 orc::createLocalIndirectStubsManagerBuilder(T);
Lang Hames130a7c42015-10-28 02:40:04 +000023
Lang Hames1fa0e0e2016-04-25 21:21:20 +000024 OrcCBindingsStack *JITStack = new OrcCBindingsStack(
25 *TM2, std::move(CompileCallbackMgr), IndirectStubsMgrBuilder);
Lang Hames130a7c42015-10-28 02:40:04 +000026
27 return wrap(JITStack);
28}
29
Lang Hamesef5a0ee2016-04-25 19:56:45 +000030const char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack) {
31 OrcCBindingsStack &J = *unwrap(JITStack);
32 return J.getErrorMessage().c_str();
33}
34
Lang Hames130a7c42015-10-28 02:40:04 +000035void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledName,
36 const char *SymbolName) {
37 OrcCBindingsStack &J = *unwrap(JITStack);
38 std::string Mangled = J.mangle(SymbolName);
39 *MangledName = new char[Mangled.size() + 1];
40 strcpy(*MangledName, Mangled.c_str());
41}
42
Lang Hames1fa0e0e2016-04-25 21:21:20 +000043void LLVMOrcDisposeMangledSymbol(char *MangledName) { delete[] MangledName; }
Lang Hames130a7c42015-10-28 02:40:04 +000044
Lang Hames4ce98662017-07-07 02:59:13 +000045LLVMOrcErrorCode
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000046LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack,
Lang Hames4ce98662017-07-07 02:59:13 +000047 LLVMOrcTargetAddress *RetAddr,
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000048 LLVMOrcLazyCompileCallbackFn Callback,
49 void *CallbackCtx) {
50 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hames4ce98662017-07-07 02:59:13 +000051 return J.createLazyCompileCallback(*RetAddr, Callback, CallbackCtx);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000052}
53
Lang Hamesef5a0ee2016-04-25 19:56:45 +000054LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack,
55 const char *StubName,
56 LLVMOrcTargetAddress InitAddr) {
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000057 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hamesef5a0ee2016-04-25 19:56:45 +000058 return J.createIndirectStub(StubName, InitAddr);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000059}
60
Lang Hamesef5a0ee2016-04-25 19:56:45 +000061LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack,
62 const char *StubName,
63 LLVMOrcTargetAddress NewAddr) {
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000064 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hamesef5a0ee2016-04-25 19:56:45 +000065 return J.setIndirectStubPointer(StubName, NewAddr);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000066}
67
Lang Hames4ce98662017-07-07 02:59:13 +000068LLVMOrcErrorCode
Lang Hamescd9d49b2017-06-23 23:25:28 +000069LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack,
Lang Hames5721ee42018-03-15 00:30:14 +000070 LLVMOrcModuleHandle *RetHandle, LLVMModuleRef Mod,
Lang Hames130a7c42015-10-28 02:40:04 +000071 LLVMOrcSymbolResolverFn SymbolResolver,
72 void *SymbolResolverCtx) {
73 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hames5721ee42018-03-15 00:30:14 +000074 std::unique_ptr<Module> M(unwrap(Mod));
75 return J.addIRModuleEager(*RetHandle, std::move(M), SymbolResolver,
76 SymbolResolverCtx);
Lang Hames130a7c42015-10-28 02:40:04 +000077}
78
Lang Hames4ce98662017-07-07 02:59:13 +000079LLVMOrcErrorCode
Lang Hamescd9d49b2017-06-23 23:25:28 +000080LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack,
Lang Hames5721ee42018-03-15 00:30:14 +000081 LLVMOrcModuleHandle *RetHandle, LLVMModuleRef Mod,
Lang Hames130a7c42015-10-28 02:40:04 +000082 LLVMOrcSymbolResolverFn SymbolResolver,
83 void *SymbolResolverCtx) {
84 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hames5721ee42018-03-15 00:30:14 +000085 std::unique_ptr<Module> M(unwrap(Mod));
86 return J.addIRModuleLazy(*RetHandle, std::move(M), SymbolResolver,
87 SymbolResolverCtx);
Lang Hames130a7c42015-10-28 02:40:04 +000088}
89
Lang Hamesec300632017-09-17 03:25:03 +000090LLVMOrcErrorCode
91LLVMOrcAddObjectFile(LLVMOrcJITStackRef JITStack,
92 LLVMOrcModuleHandle *RetHandle,
93 LLVMMemoryBufferRef Obj,
94 LLVMOrcSymbolResolverFn SymbolResolver,
95 void *SymbolResolverCtx) {
96 OrcCBindingsStack &J = *unwrap(JITStack);
97 std::unique_ptr<MemoryBuffer> O(unwrap(Obj));
98 return J.addObject(*RetHandle, std::move(O), SymbolResolver,
99 SymbolResolverCtx);
100}
101
Lang Hames4ce98662017-07-07 02:59:13 +0000102LLVMOrcErrorCode LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack,
103 LLVMOrcModuleHandle H) {
Lang Hames130a7c42015-10-28 02:40:04 +0000104 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hames4ce98662017-07-07 02:59:13 +0000105 return J.removeModule(H);
Lang Hames130a7c42015-10-28 02:40:04 +0000106}
107
Lang Hames4ce98662017-07-07 02:59:13 +0000108LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
109 LLVMOrcTargetAddress *RetAddr,
110 const char *SymbolName) {
Lang Hames130a7c42015-10-28 02:40:04 +0000111 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hames4ce98662017-07-07 02:59:13 +0000112 return J.findSymbolAddress(*RetAddr, SymbolName, true);
Lang Hames130a7c42015-10-28 02:40:04 +0000113}
114
Lang Hames4ce98662017-07-07 02:59:13 +0000115LLVMOrcErrorCode LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) {
116 auto *J = unwrap(JITStack);
117 auto Err = J->shutdown();
118 delete J;
119 return Err;
Lang Hames130a7c42015-10-28 02:40:04 +0000120}