blob: 62ae306236c53bf89aaabb278476b686c3507739 [file] [log] [blame]
Lang Hames633ea072020-03-14 14:16:42 -07001//===--------------- OrcV2CBindings.cpp - C bindings OrcV2 APIs -----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm-c/Orc.h"
10#include "llvm-c/TargetMachine.h"
11
12#include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"
13#include "llvm/ExecutionEngine/Orc/LLJIT.h"
14
15using namespace llvm;
16using namespace llvm::orc;
17
Lang Hames1cd84932020-04-09 12:15:13 -070018namespace llvm {
19namespace orc {
20
21class OrcV2CAPIHelper {
22public:
23 using PoolEntry = SymbolStringPtr::PoolEntry;
24 using PoolEntryPtr = SymbolStringPtr::PoolEntryPtr;
25
26 static PoolEntryPtr releaseSymbolStringPtr(SymbolStringPtr S) {
27 PoolEntryPtr Result = nullptr;
28 std::swap(Result, S.S);
29 return Result;
30 }
31
32 static PoolEntryPtr getRawPoolEntryPtr(const SymbolStringPtr &S) {
33 return S.S;
34 }
35
36 static void releasePoolEntry(PoolEntryPtr P) {
37 SymbolStringPtr S;
38 S.S = P;
39 }
40};
41
42} // end namespace orc
43} // end namespace llvm
44
45DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ExecutionSession, LLVMOrcExecutionSessionRef)
46DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcV2CAPIHelper::PoolEntry,
47 LLVMOrcSymbolStringPoolEntryRef)
48DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITDylib, LLVMOrcJITDylibRef)
49DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITDylib::DefinitionGenerator,
50 LLVMOrcJITDylibDefinitionGeneratorRef)
Lang Hames633ea072020-03-14 14:16:42 -070051DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeContext,
52 LLVMOrcThreadSafeContextRef)
53DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeModule, LLVMOrcThreadSafeModuleRef)
Lang Hames1cd84932020-04-09 12:15:13 -070054DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITTargetMachineBuilder,
55 LLVMOrcJITTargetMachineBuilderRef)
56DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJITBuilder, LLVMOrcLLJITBuilderRef)
Lang Hames633ea072020-03-14 14:16:42 -070057DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJIT, LLVMOrcLLJITRef)
58
Lang Hames1cd84932020-04-09 12:15:13 -070059LLVMOrcSymbolStringPoolEntryRef
60LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES, const char *Name) {
61 return wrap(
62 OrcV2CAPIHelper::releaseSymbolStringPtr(unwrap(ES)->intern(Name)));
63}
64
65void LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) {
66 OrcV2CAPIHelper::releasePoolEntry(unwrap(S));
67}
68
69void LLVMOrcDisposeJITDylibDefinitionGenerator(
70 LLVMOrcJITDylibDefinitionGeneratorRef DG) {
71 delete unwrap(DG);
72}
73
74void LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD,
75 LLVMOrcJITDylibDefinitionGeneratorRef DG) {
76 unwrap(JD)->addGenerator(
77 std::unique_ptr<JITDylib::DefinitionGenerator>(unwrap(DG)));
78}
79
80LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess(
81 LLVMOrcJITDylibDefinitionGeneratorRef *Result, char GlobalPrefix,
82 LLVMOrcSymbolPredicate Filter, void *FilterCtx) {
83 assert(Result && "Result can not be null");
84 assert((Filter || !FilterCtx) &&
85 "if Filter is null then FilterCtx must also be null");
86
87 DynamicLibrarySearchGenerator::SymbolPredicate Pred;
88 if (Filter)
89 Pred = [=](const SymbolStringPtr &Name) -> bool {
90 return Filter(wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name)), FilterCtx);
91 };
92
93 auto ProcessSymsGenerator =
94 DynamicLibrarySearchGenerator::GetForCurrentProcess(GlobalPrefix, Pred);
95
96 if (!ProcessSymsGenerator) {
97 *Result = 0;
98 return wrap(ProcessSymsGenerator.takeError());
99 }
100
101 *Result = wrap(ProcessSymsGenerator->release());
102 return LLVMErrorSuccess;
103}
104
105LLVMOrcThreadSafeContextRef LLVMOrcCreateNewThreadSafeContext(void) {
Lang Hames633ea072020-03-14 14:16:42 -0700106 return wrap(new ThreadSafeContext(std::make_unique<LLVMContext>()));
107}
108
109LLVMContextRef
110LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx) {
111 return wrap(unwrap(TSCtx)->getContext());
112}
113
114void LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx) {
115 delete unwrap(TSCtx);
116}
117
118LLVMOrcThreadSafeModuleRef
119LLVMOrcCreateNewThreadSafeModule(LLVMModuleRef M,
120 LLVMOrcThreadSafeContextRef TSCtx) {
121 return wrap(
122 new ThreadSafeModule(std::unique_ptr<Module>(unwrap(M)), *unwrap(TSCtx)));
123}
124
125void LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM) {
126 delete unwrap(TSM);
127}
128
Lang Hames1cd84932020-04-09 12:15:13 -0700129LLVMErrorRef LLVMOrcJITTargetMachineBuilderDetectHost(
130 LLVMOrcJITTargetMachineBuilderRef *Result) {
131 assert(Result && "Result can not be null");
132
133 auto JTMB = JITTargetMachineBuilder::detectHost();
134 if (!JTMB) {
135 Result = 0;
136 return wrap(JTMB.takeError());
137 }
138
139 *Result = wrap(new JITTargetMachineBuilder(std::move(*JTMB)));
140 return LLVMErrorSuccess;
141}
142
143void LLVMOrcDisposeJITTargetMachineBuilder(
144 LLVMOrcJITTargetMachineBuilderRef JTMB) {
145 delete unwrap(JTMB);
146}
147
148LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void) {
149 return wrap(new LLJITBuilder());
150}
151
152void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder) {
153 delete unwrap(Builder);
154}
155
156void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(
157 LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB) {
158 unwrap(Builder)->setJITTargetMachineBuilder(*unwrap(JTMB));
159}
160
161LLVMErrorRef LLVMOrcCreateLLJIT(LLVMOrcLLJITRef *Result,
162 LLVMOrcLLJITBuilderRef Builder) {
163 assert(Result && "Result can not be null");
164
165 if (!Builder)
166 Builder = LLVMOrcCreateLLJITBuilder();
167
168 auto J = unwrap(Builder)->create();
169 LLVMOrcDisposeLLJITBuilder(Builder);
Lang Hames633ea072020-03-14 14:16:42 -0700170
171 if (!J) {
172 Result = 0;
173 return wrap(J.takeError());
174 }
175
176 *Result = wrap(J->release());
177 return LLVMErrorSuccess;
178}
179
180LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J) {
181 delete unwrap(J);
182 return LLVMErrorSuccess;
183}
184
Lang Hames1cd84932020-04-09 12:15:13 -0700185LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J) {
186 return wrap(&unwrap(J)->getExecutionSession());
187}
188
189LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J) {
190 return wrap(&unwrap(J)->getMainJITDylib());
191}
192
193char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J) {
194 return unwrap(J)->getDataLayout().getGlobalPrefix();
195}
196
197LLVMOrcSymbolStringPoolEntryRef
198LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J, const char *UnmangledName) {
199 return wrap(OrcV2CAPIHelper::releaseSymbolStringPtr(
200 unwrap(J)->mangleAndIntern(UnmangledName)));
201}
202
Lang Hames633ea072020-03-14 14:16:42 -0700203LLVMErrorRef LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J,
204 LLVMOrcThreadSafeModuleRef TSM) {
205 return wrap(unwrap(J)->addIRModule(std::move(*unwrap(TSM))));
206}
207
208LLVMErrorRef LLVMOrcLLJITLookup(LLVMOrcLLJITRef J,
209 LLVMOrcJITTargetAddress *Result,
210 const char *Name) {
Lang Hames1cd84932020-04-09 12:15:13 -0700211 assert(Result && "Result can not be null");
212
Lang Hames633ea072020-03-14 14:16:42 -0700213 auto Sym = unwrap(J)->lookup(Name);
214 if (!Sym) {
215 *Result = 0;
216 return wrap(Sym.takeError());
217 }
218
219 *Result = Sym->getAddress();
220 return LLVMErrorSuccess;
221}