blob: 8dcd49aaab5bb4c9088c208c083b2dc4ee93d176 [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 Hamesfd6e8dc2015-10-30 03:20:21 +000045LLVMOrcTargetAddress
46LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack,
47 LLVMOrcLazyCompileCallbackFn Callback,
48 void *CallbackCtx) {
49 OrcCBindingsStack &J = *unwrap(JITStack);
50 return J.createLazyCompileCallback(Callback, CallbackCtx);
51}
52
Lang Hamesef5a0ee2016-04-25 19:56:45 +000053LLVMOrcErrorCode LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack,
54 const char *StubName,
55 LLVMOrcTargetAddress InitAddr) {
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000056 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hamesef5a0ee2016-04-25 19:56:45 +000057 return J.createIndirectStub(StubName, InitAddr);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000058}
59
Lang Hamesef5a0ee2016-04-25 19:56:45 +000060LLVMOrcErrorCode LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack,
61 const char *StubName,
62 LLVMOrcTargetAddress NewAddr) {
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000063 OrcCBindingsStack &J = *unwrap(JITStack);
Lang Hamesef5a0ee2016-04-25 19:56:45 +000064 return J.setIndirectStubPointer(StubName, NewAddr);
Lang Hamesfd6e8dc2015-10-30 03:20:21 +000065}
66
Lang Hames130a7c42015-10-28 02:40:04 +000067LLVMOrcModuleHandle
68LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
69 LLVMOrcSymbolResolverFn SymbolResolver,
70 void *SymbolResolverCtx) {
71 OrcCBindingsStack &J = *unwrap(JITStack);
72 Module *M(unwrap(Mod));
73 return J.addIRModuleEager(M, SymbolResolver, SymbolResolverCtx);
74}
75
76LLVMOrcModuleHandle
77LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod,
78 LLVMOrcSymbolResolverFn SymbolResolver,
79 void *SymbolResolverCtx) {
80 OrcCBindingsStack &J = *unwrap(JITStack);
81 Module *M(unwrap(Mod));
82 return J.addIRModuleLazy(M, SymbolResolver, SymbolResolverCtx);
83}
84
85void LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, LLVMOrcModuleHandle H) {
86 OrcCBindingsStack &J = *unwrap(JITStack);
87 J.removeModule(H);
88}
89
90LLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
91 const char *SymbolName) {
92 OrcCBindingsStack &J = *unwrap(JITStack);
93 auto Sym = J.findSymbol(SymbolName, true);
94 return Sym.getAddress();
95}
96
97void LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) {
98 delete unwrap(JITStack);
99}