blob: 4054a46edd1221e785c7cf262f19ff0526435fc9 [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)
Lang Hames35e48d72020-10-01 21:12:19 -070046DEFINE_SIMPLE_CONVERSION_FUNCTIONS(SymbolStringPool, LLVMOrcSymbolStringPoolRef)
Lang Hames1cd84932020-04-09 12:15:13 -070047DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcV2CAPIHelper::PoolEntry,
48 LLVMOrcSymbolStringPoolEntryRef)
49DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITDylib, LLVMOrcJITDylibRef)
Lang Hames5d2e3592020-10-01 14:40:08 -070050DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DefinitionGenerator,
Lang Hames49c065a2020-10-14 12:13:00 -070051 LLVMOrcDefinitionGeneratorRef)
Lang Hames633ea072020-03-14 14:16:42 -070052DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeContext,
53 LLVMOrcThreadSafeContextRef)
54DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeModule, LLVMOrcThreadSafeModuleRef)
Lang Hames1cd84932020-04-09 12:15:13 -070055DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITTargetMachineBuilder,
56 LLVMOrcJITTargetMachineBuilderRef)
57DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJITBuilder, LLVMOrcLLJITBuilderRef)
Lang Hames633ea072020-03-14 14:16:42 -070058DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJIT, LLVMOrcLLJITRef)
59
Lang Hames59ed45b2020-04-10 14:07:51 -070060DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef)
61
Lang Hames14cb9b42020-10-01 11:24:34 -070062void LLVMOrcExecutionSessionSetErrorReporter(
63 LLVMOrcExecutionSessionRef ES, LLVMOrcErrorReporterFunction ReportError,
64 void *Ctx) {
65 unwrap(ES)->setErrorReporter(
66 [=](Error Err) { ReportError(Ctx, wrap(std::move(Err))); });
67}
68
Lang Hames35e48d72020-10-01 21:12:19 -070069LLVMOrcSymbolStringPoolRef
70LLVMOrcExecutionSessionGetSymbolStringPool(LLVMOrcExecutionSessionRef ES) {
71 return wrap(unwrap(ES)->getSymbolStringPool().get());
72}
73
74void LLVMOrcSymbolStringPoolClearDeadEntries(LLVMOrcSymbolStringPoolRef SSP) {
75 unwrap(SSP)->clearDeadEntries();
76}
77
Lang Hames1cd84932020-04-09 12:15:13 -070078LLVMOrcSymbolStringPoolEntryRef
79LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES, const char *Name) {
80 return wrap(
81 OrcV2CAPIHelper::releaseSymbolStringPtr(unwrap(ES)->intern(Name)));
82}
83
84void LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) {
85 OrcV2CAPIHelper::releasePoolEntry(unwrap(S));
86}
87
Lang Hames9a0d1b62020-09-16 13:46:55 -070088LLVMOrcJITDylibRef
89LLVMOrcExecutionSessionCreateBareJITDylib(LLVMOrcExecutionSessionRef ES,
90 const char *Name) {
91 return wrap(&unwrap(ES)->createBareJITDylib(Name));
92}
93
94LLVMErrorRef
95LLVMOrcExecutionSessionCreateJITDylib(LLVMOrcExecutionSessionRef ES,
96 LLVMOrcJITDylibRef *Result,
97 const char *Name) {
98 auto JD = unwrap(ES)->createJITDylib(Name);
99 if (!JD)
100 return wrap(JD.takeError());
101 *Result = wrap(&*JD);
102 return LLVMErrorSuccess;
103}
104
105LLVMOrcJITDylibRef
106LLVMOrcExecutionSessionGetJITDylibByName(LLVMOrcExecutionSessionRef ES,
107 const char *Name) {
108 return wrap(unwrap(ES)->getJITDylibByName(Name));
109}
110
Lang Hames49c065a2020-10-14 12:13:00 -0700111void LLVMOrcDisposeDefinitionGenerator(
112 LLVMOrcDefinitionGeneratorRef DG) {
Lang Hames1cd84932020-04-09 12:15:13 -0700113 delete unwrap(DG);
114}
115
116void LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD,
Lang Hames49c065a2020-10-14 12:13:00 -0700117 LLVMOrcDefinitionGeneratorRef DG) {
Lang Hames5d2e3592020-10-01 14:40:08 -0700118 unwrap(JD)->addGenerator(std::unique_ptr<DefinitionGenerator>(unwrap(DG)));
Lang Hames1cd84932020-04-09 12:15:13 -0700119}
120
121LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess(
Lang Hames49c065a2020-10-14 12:13:00 -0700122 LLVMOrcDefinitionGeneratorRef *Result, char GlobalPrefix,
Lang Hames1cd84932020-04-09 12:15:13 -0700123 LLVMOrcSymbolPredicate Filter, void *FilterCtx) {
124 assert(Result && "Result can not be null");
125 assert((Filter || !FilterCtx) &&
126 "if Filter is null then FilterCtx must also be null");
127
128 DynamicLibrarySearchGenerator::SymbolPredicate Pred;
129 if (Filter)
130 Pred = [=](const SymbolStringPtr &Name) -> bool {
131 return Filter(wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name)), FilterCtx);
132 };
133
134 auto ProcessSymsGenerator =
135 DynamicLibrarySearchGenerator::GetForCurrentProcess(GlobalPrefix, Pred);
136
137 if (!ProcessSymsGenerator) {
138 *Result = 0;
139 return wrap(ProcessSymsGenerator.takeError());
140 }
141
142 *Result = wrap(ProcessSymsGenerator->release());
143 return LLVMErrorSuccess;
144}
145
146LLVMOrcThreadSafeContextRef LLVMOrcCreateNewThreadSafeContext(void) {
Lang Hames633ea072020-03-14 14:16:42 -0700147 return wrap(new ThreadSafeContext(std::make_unique<LLVMContext>()));
148}
149
150LLVMContextRef
151LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx) {
152 return wrap(unwrap(TSCtx)->getContext());
153}
154
155void LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx) {
156 delete unwrap(TSCtx);
157}
158
159LLVMOrcThreadSafeModuleRef
160LLVMOrcCreateNewThreadSafeModule(LLVMModuleRef M,
161 LLVMOrcThreadSafeContextRef TSCtx) {
162 return wrap(
163 new ThreadSafeModule(std::unique_ptr<Module>(unwrap(M)), *unwrap(TSCtx)));
164}
165
166void LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM) {
167 delete unwrap(TSM);
168}
169
Lang Hames1cd84932020-04-09 12:15:13 -0700170LLVMErrorRef LLVMOrcJITTargetMachineBuilderDetectHost(
171 LLVMOrcJITTargetMachineBuilderRef *Result) {
172 assert(Result && "Result can not be null");
173
174 auto JTMB = JITTargetMachineBuilder::detectHost();
175 if (!JTMB) {
176 Result = 0;
177 return wrap(JTMB.takeError());
178 }
179
180 *Result = wrap(new JITTargetMachineBuilder(std::move(*JTMB)));
181 return LLVMErrorSuccess;
182}
183
Lang Hames59ed45b2020-04-10 14:07:51 -0700184LLVMOrcJITTargetMachineBuilderRef
Lang Hames40f3fb52020-10-14 11:35:37 -0700185LLVMOrcJITTargetMachineBuilderCreateFromTargetMachine(LLVMTargetMachineRef TM) {
Lang Hames59ed45b2020-04-10 14:07:51 -0700186 auto *TemplateTM = unwrap(TM);
187
188 auto JTMB =
189 std::make_unique<JITTargetMachineBuilder>(TemplateTM->getTargetTriple());
190
191 (*JTMB)
192 .setCPU(TemplateTM->getTargetCPU().str())
193 .setRelocationModel(TemplateTM->getRelocationModel())
194 .setCodeModel(TemplateTM->getCodeModel())
195 .setCodeGenOptLevel(TemplateTM->getOptLevel())
196 .setFeatures(TemplateTM->getTargetFeatureString())
197 .setOptions(TemplateTM->Options);
198
199 LLVMDisposeTargetMachine(TM);
200
201 return wrap(JTMB.release());
202}
203
Lang Hames1cd84932020-04-09 12:15:13 -0700204void LLVMOrcDisposeJITTargetMachineBuilder(
205 LLVMOrcJITTargetMachineBuilderRef JTMB) {
206 delete unwrap(JTMB);
207}
208
209LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void) {
210 return wrap(new LLJITBuilder());
211}
212
213void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder) {
214 delete unwrap(Builder);
215}
216
217void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(
218 LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB) {
219 unwrap(Builder)->setJITTargetMachineBuilder(*unwrap(JTMB));
220}
221
222LLVMErrorRef LLVMOrcCreateLLJIT(LLVMOrcLLJITRef *Result,
223 LLVMOrcLLJITBuilderRef Builder) {
224 assert(Result && "Result can not be null");
225
226 if (!Builder)
227 Builder = LLVMOrcCreateLLJITBuilder();
228
229 auto J = unwrap(Builder)->create();
230 LLVMOrcDisposeLLJITBuilder(Builder);
Lang Hames633ea072020-03-14 14:16:42 -0700231
232 if (!J) {
233 Result = 0;
234 return wrap(J.takeError());
235 }
236
237 *Result = wrap(J->release());
238 return LLVMErrorSuccess;
239}
240
241LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J) {
242 delete unwrap(J);
243 return LLVMErrorSuccess;
244}
245
Lang Hames1cd84932020-04-09 12:15:13 -0700246LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J) {
247 return wrap(&unwrap(J)->getExecutionSession());
248}
249
250LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J) {
251 return wrap(&unwrap(J)->getMainJITDylib());
252}
253
Lang Hames0d5f15f2020-04-09 16:17:04 -0700254const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J) {
255 return unwrap(J)->getTargetTriple().str().c_str();
256}
257
Lang Hames1cd84932020-04-09 12:15:13 -0700258char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J) {
259 return unwrap(J)->getDataLayout().getGlobalPrefix();
260}
261
262LLVMOrcSymbolStringPoolEntryRef
263LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J, const char *UnmangledName) {
264 return wrap(OrcV2CAPIHelper::releaseSymbolStringPtr(
265 unwrap(J)->mangleAndIntern(UnmangledName)));
266}
267
Lang Hames37bcf2d2020-04-09 17:54:59 -0700268LLVMErrorRef LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J, LLVMOrcJITDylibRef JD,
Lang Hames0d5f15f2020-04-09 16:17:04 -0700269 LLVMMemoryBufferRef ObjBuffer) {
270 return wrap(unwrap(J)->addObjectFile(
Lang Hames37bcf2d2020-04-09 17:54:59 -0700271 *unwrap(JD), std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))));
Lang Hames0d5f15f2020-04-09 16:17:04 -0700272}
273
Lang Hames633ea072020-03-14 14:16:42 -0700274LLVMErrorRef LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J,
Lang Hames37bcf2d2020-04-09 17:54:59 -0700275 LLVMOrcJITDylibRef JD,
Lang Hames633ea072020-03-14 14:16:42 -0700276 LLVMOrcThreadSafeModuleRef TSM) {
Lang Hamesc88d9ea2020-10-01 15:25:06 -0700277 std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM));
278 return wrap(unwrap(J)->addIRModule(*unwrap(JD), std::move(*TmpTSM)));
Lang Hames633ea072020-03-14 14:16:42 -0700279}
280
281LLVMErrorRef LLVMOrcLLJITLookup(LLVMOrcLLJITRef J,
282 LLVMOrcJITTargetAddress *Result,
283 const char *Name) {
Lang Hames1cd84932020-04-09 12:15:13 -0700284 assert(Result && "Result can not be null");
285
Lang Hames633ea072020-03-14 14:16:42 -0700286 auto Sym = unwrap(J)->lookup(Name);
287 if (!Sym) {
288 *Result = 0;
289 return wrap(Sym.takeError());
290 }
291
292 *Result = Sym->getAddress();
293 return LLVMErrorSuccess;
294}