blob: a147727b726488ab08fd93882ec121169d027564 [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
Lang Hamesb6ca0c72020-10-15 17:33:16 -070021class InProgressLookupState;
22
Lang Hames1cd84932020-04-09 12:15:13 -070023class OrcV2CAPIHelper {
24public:
25 using PoolEntry = SymbolStringPtr::PoolEntry;
26 using PoolEntryPtr = SymbolStringPtr::PoolEntryPtr;
27
28 static PoolEntryPtr releaseSymbolStringPtr(SymbolStringPtr S) {
29 PoolEntryPtr Result = nullptr;
30 std::swap(Result, S.S);
31 return Result;
32 }
33
34 static PoolEntryPtr getRawPoolEntryPtr(const SymbolStringPtr &S) {
35 return S.S;
36 }
37
Lang Hamesb6ca0c72020-10-15 17:33:16 -070038 static void retainPoolEntry(PoolEntryPtr P) {
39 SymbolStringPtr S(P);
40 S.S = nullptr;
41 }
42
Lang Hames1cd84932020-04-09 12:15:13 -070043 static void releasePoolEntry(PoolEntryPtr P) {
44 SymbolStringPtr S;
45 S.S = P;
46 }
Lang Hamesb6ca0c72020-10-15 17:33:16 -070047
48 static InProgressLookupState *extractLookupState(LookupState &LS) {
49 return LS.IPLS.release();
50 }
51
52 static void resetLookupState(LookupState &LS, InProgressLookupState *IPLS) {
53 return LS.reset(IPLS);
54 }
Lang Hames1cd84932020-04-09 12:15:13 -070055};
56
Lang Hamesb6ca0c72020-10-15 17:33:16 -070057} // namespace orc
58} // namespace llvm
Lang Hames1cd84932020-04-09 12:15:13 -070059
60DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ExecutionSession, LLVMOrcExecutionSessionRef)
Lang Hames35e48d72020-10-01 21:12:19 -070061DEFINE_SIMPLE_CONVERSION_FUNCTIONS(SymbolStringPool, LLVMOrcSymbolStringPoolRef)
Lang Hames1cd84932020-04-09 12:15:13 -070062DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcV2CAPIHelper::PoolEntry,
63 LLVMOrcSymbolStringPoolEntryRef)
64DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITDylib, LLVMOrcJITDylibRef)
Lang Hames91d1f412020-10-14 17:17:44 -070065DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ResourceTracker, LLVMOrcResourceTrackerRef)
Lang Hames5d2e3592020-10-01 14:40:08 -070066DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DefinitionGenerator,
Lang Hames49c065a2020-10-14 12:13:00 -070067 LLVMOrcDefinitionGeneratorRef)
Lang Hamesb6ca0c72020-10-15 17:33:16 -070068DEFINE_SIMPLE_CONVERSION_FUNCTIONS(InProgressLookupState, LLVMOrcLookupStateRef)
Lang Hames633ea072020-03-14 14:16:42 -070069DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeContext,
70 LLVMOrcThreadSafeContextRef)
71DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeModule, LLVMOrcThreadSafeModuleRef)
Lang Hames1cd84932020-04-09 12:15:13 -070072DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITTargetMachineBuilder,
73 LLVMOrcJITTargetMachineBuilderRef)
74DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJITBuilder, LLVMOrcLLJITBuilderRef)
Lang Hames633ea072020-03-14 14:16:42 -070075DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJIT, LLVMOrcLLJITRef)
76
Lang Hames59ed45b2020-04-10 14:07:51 -070077DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef)
78
Lang Hamesb6ca0c72020-10-15 17:33:16 -070079namespace llvm {
80namespace orc {
81
82class CAPIDefinitionGenerator final : public DefinitionGenerator {
83public:
84 CAPIDefinitionGenerator(
85 void *Ctx,
86 LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate)
87 : Ctx(Ctx), TryToGenerate(TryToGenerate) {}
88
89 Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD,
90 JITDylibLookupFlags JDLookupFlags,
91 const SymbolLookupSet &LookupSet) override {
92
93 // Take the lookup state.
94 LLVMOrcLookupStateRef LSR = ::wrap(OrcV2CAPIHelper::extractLookupState(LS));
95
96 // Translate the lookup kind.
97 LLVMOrcLookupKind CLookupKind;
98 switch (K) {
99 case LookupKind::Static:
100 CLookupKind = LLVMOrcLookupKindStatic;
101 break;
102 case LookupKind::DLSym:
103 CLookupKind = LLVMOrcLookupKindDLSym;
104 break;
105 }
106
107 // Translate the JITDylibSearchFlags.
108 LLVMOrcJITDylibLookupFlags CJDLookupFlags;
109 switch (JDLookupFlags) {
110 case JITDylibLookupFlags::MatchExportedSymbolsOnly:
111 CJDLookupFlags = LLVMOrcJITDylibLookupFlagsMatchExportedSymbolsOnly;
112 break;
113 case JITDylibLookupFlags::MatchAllSymbols:
114 CJDLookupFlags = LLVMOrcJITDylibLookupFlagsMatchAllSymbols;
115 break;
116 }
117
118 // Translate the lookup set.
119 std::vector<LLVMOrcCLookupSetElement> CLookupSet;
120 CLookupSet.reserve(LookupSet.size());
121 for (auto &KV : LookupSet) {
122 LLVMOrcSymbolLookupFlags SLF;
123 switch (KV.second) {
124 case SymbolLookupFlags::RequiredSymbol:
125 SLF = LLVMOrcSymbolLookupFlagsRequiredSymbol;
126 break;
127 case SymbolLookupFlags::WeaklyReferencedSymbol:
128 SLF = LLVMOrcSymbolLookupFlagsWeaklyReferencedSymbol;
129 break;
130 }
131
132 CLookupSet.push_back(
133 {::wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(KV.first)), SLF});
134 }
135 CLookupSet.push_back({nullptr, LLVMOrcSymbolLookupFlagsRequiredSymbol});
136
137 // Run the C TryToGenerate function.
138 auto Err =
139 unwrap(TryToGenerate(::wrap(this), Ctx, &LSR, CLookupKind, ::wrap(&JD),
140 CJDLookupFlags, CLookupSet.data()));
141
142 // Restore the lookup state.
143 OrcV2CAPIHelper::resetLookupState(LS, ::unwrap(LSR));
144
145 return Err;
146 }
147
148private:
149 void *Ctx;
150 LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate;
151};
152
153} // end namespace orc
154} // end namespace llvm
155
Lang Hames14cb9b42020-10-01 11:24:34 -0700156void LLVMOrcExecutionSessionSetErrorReporter(
157 LLVMOrcExecutionSessionRef ES, LLVMOrcErrorReporterFunction ReportError,
158 void *Ctx) {
159 unwrap(ES)->setErrorReporter(
160 [=](Error Err) { ReportError(Ctx, wrap(std::move(Err))); });
161}
162
Lang Hames35e48d72020-10-01 21:12:19 -0700163LLVMOrcSymbolStringPoolRef
164LLVMOrcExecutionSessionGetSymbolStringPool(LLVMOrcExecutionSessionRef ES) {
165 return wrap(unwrap(ES)->getSymbolStringPool().get());
166}
167
168void LLVMOrcSymbolStringPoolClearDeadEntries(LLVMOrcSymbolStringPoolRef SSP) {
169 unwrap(SSP)->clearDeadEntries();
170}
171
Lang Hames1cd84932020-04-09 12:15:13 -0700172LLVMOrcSymbolStringPoolEntryRef
173LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES, const char *Name) {
174 return wrap(
175 OrcV2CAPIHelper::releaseSymbolStringPtr(unwrap(ES)->intern(Name)));
176}
177
Lang Hamesb6ca0c72020-10-15 17:33:16 -0700178void LLVMOrcRetainSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) {
179 OrcV2CAPIHelper::retainPoolEntry(unwrap(S));
180}
181
Lang Hames1cd84932020-04-09 12:15:13 -0700182void LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) {
183 OrcV2CAPIHelper::releasePoolEntry(unwrap(S));
184}
185
Lang Hames91d1f412020-10-14 17:17:44 -0700186LLVMOrcResourceTrackerRef
187LLVMOrcJITDylibCreateResourceTracker(LLVMOrcJITDylibRef JD) {
188 auto RT = unwrap(JD)->createResourceTracker();
189 // Retain the pointer for the C API client.
190 RT->Retain();
191 return wrap(RT.get());
192}
193
194LLVMOrcResourceTrackerRef
195LLVMOrcJITDylibGetDefaultResourceTracker(LLVMOrcJITDylibRef JD) {
196 auto RT = unwrap(JD)->getDefaultResourceTracker();
197 // Retain the pointer for the C API client.
198 return wrap(RT.get());
199}
200
201void LLVMOrcReleaseResourceTracker(LLVMOrcResourceTrackerRef RT) {
202 ResourceTrackerSP TmpRT(unwrap(RT));
203 TmpRT->Release();
204}
205
206void LLVMOrcResourceTrackerTransferTo(LLVMOrcResourceTrackerRef SrcRT,
207 LLVMOrcResourceTrackerRef DstRT) {
208 ResourceTrackerSP TmpRT(unwrap(SrcRT));
209 TmpRT->transferTo(*unwrap(DstRT));
210}
211
212LLVMErrorRef LLVMOrcResourceTrackerRemove(LLVMOrcResourceTrackerRef RT) {
213 ResourceTrackerSP TmpRT(unwrap(RT));
214 return wrap(TmpRT->remove());
215}
216
Lang Hamesb6ca0c72020-10-15 17:33:16 -0700217void LLVMOrcDisposeDefinitionGenerator(
218 LLVMOrcDefinitionGeneratorRef DG) {
219 delete unwrap(DG);
220}
221
Lang Hames9a0d1b62020-09-16 13:46:55 -0700222LLVMOrcJITDylibRef
223LLVMOrcExecutionSessionCreateBareJITDylib(LLVMOrcExecutionSessionRef ES,
224 const char *Name) {
225 return wrap(&unwrap(ES)->createBareJITDylib(Name));
226}
227
228LLVMErrorRef
229LLVMOrcExecutionSessionCreateJITDylib(LLVMOrcExecutionSessionRef ES,
230 LLVMOrcJITDylibRef *Result,
231 const char *Name) {
232 auto JD = unwrap(ES)->createJITDylib(Name);
233 if (!JD)
234 return wrap(JD.takeError());
235 *Result = wrap(&*JD);
236 return LLVMErrorSuccess;
237}
238
239LLVMOrcJITDylibRef
240LLVMOrcExecutionSessionGetJITDylibByName(LLVMOrcExecutionSessionRef ES,
241 const char *Name) {
242 return wrap(unwrap(ES)->getJITDylibByName(Name));
243}
244
Lang Hames91d1f412020-10-14 17:17:44 -0700245LLVMErrorRef LLVMOrcJITDylibClear(LLVMOrcJITDylibRef JD) {
246 return wrap(unwrap(JD)->clear());
247}
248
Lang Hames1cd84932020-04-09 12:15:13 -0700249void LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD,
Lang Hames49c065a2020-10-14 12:13:00 -0700250 LLVMOrcDefinitionGeneratorRef DG) {
Lang Hames5d2e3592020-10-01 14:40:08 -0700251 unwrap(JD)->addGenerator(std::unique_ptr<DefinitionGenerator>(unwrap(DG)));
Lang Hames1cd84932020-04-09 12:15:13 -0700252}
253
Lang Hamesb6ca0c72020-10-15 17:33:16 -0700254void LLVMOrcDisposeDefinitionGenerator(LLVMOrcDefinitionGeneratorRef DG) {
255 std::unique_ptr<DefinitionGenerator> TmpDG(unwrap(DG));
256}
257
258LLVMOrcDefinitionGeneratorRef LLVMOrcCreateCustomCAPIDefinitionGenerator(
259 void *Ctx, LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction F) {
260 auto DG = std::make_unique<CAPIDefinitionGenerator>(Ctx, F);
261 return wrap(DG.release());
262}
263
Lang Hames1cd84932020-04-09 12:15:13 -0700264LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess(
Lang Hames49c065a2020-10-14 12:13:00 -0700265 LLVMOrcDefinitionGeneratorRef *Result, char GlobalPrefix,
Lang Hames1cd84932020-04-09 12:15:13 -0700266 LLVMOrcSymbolPredicate Filter, void *FilterCtx) {
267 assert(Result && "Result can not be null");
268 assert((Filter || !FilterCtx) &&
269 "if Filter is null then FilterCtx must also be null");
270
271 DynamicLibrarySearchGenerator::SymbolPredicate Pred;
272 if (Filter)
273 Pred = [=](const SymbolStringPtr &Name) -> bool {
274 return Filter(wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name)), FilterCtx);
275 };
276
277 auto ProcessSymsGenerator =
278 DynamicLibrarySearchGenerator::GetForCurrentProcess(GlobalPrefix, Pred);
279
280 if (!ProcessSymsGenerator) {
281 *Result = 0;
282 return wrap(ProcessSymsGenerator.takeError());
283 }
284
285 *Result = wrap(ProcessSymsGenerator->release());
286 return LLVMErrorSuccess;
287}
288
289LLVMOrcThreadSafeContextRef LLVMOrcCreateNewThreadSafeContext(void) {
Lang Hames633ea072020-03-14 14:16:42 -0700290 return wrap(new ThreadSafeContext(std::make_unique<LLVMContext>()));
291}
292
293LLVMContextRef
294LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx) {
295 return wrap(unwrap(TSCtx)->getContext());
296}
297
298void LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx) {
299 delete unwrap(TSCtx);
300}
301
302LLVMOrcThreadSafeModuleRef
303LLVMOrcCreateNewThreadSafeModule(LLVMModuleRef M,
304 LLVMOrcThreadSafeContextRef TSCtx) {
305 return wrap(
306 new ThreadSafeModule(std::unique_ptr<Module>(unwrap(M)), *unwrap(TSCtx)));
307}
308
309void LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM) {
310 delete unwrap(TSM);
311}
312
Lang Hames1cd84932020-04-09 12:15:13 -0700313LLVMErrorRef LLVMOrcJITTargetMachineBuilderDetectHost(
314 LLVMOrcJITTargetMachineBuilderRef *Result) {
315 assert(Result && "Result can not be null");
316
317 auto JTMB = JITTargetMachineBuilder::detectHost();
318 if (!JTMB) {
319 Result = 0;
320 return wrap(JTMB.takeError());
321 }
322
323 *Result = wrap(new JITTargetMachineBuilder(std::move(*JTMB)));
324 return LLVMErrorSuccess;
325}
326
Lang Hames59ed45b2020-04-10 14:07:51 -0700327LLVMOrcJITTargetMachineBuilderRef
Lang Hames40f3fb52020-10-14 11:35:37 -0700328LLVMOrcJITTargetMachineBuilderCreateFromTargetMachine(LLVMTargetMachineRef TM) {
Lang Hames59ed45b2020-04-10 14:07:51 -0700329 auto *TemplateTM = unwrap(TM);
330
331 auto JTMB =
332 std::make_unique<JITTargetMachineBuilder>(TemplateTM->getTargetTriple());
333
334 (*JTMB)
335 .setCPU(TemplateTM->getTargetCPU().str())
336 .setRelocationModel(TemplateTM->getRelocationModel())
337 .setCodeModel(TemplateTM->getCodeModel())
338 .setCodeGenOptLevel(TemplateTM->getOptLevel())
339 .setFeatures(TemplateTM->getTargetFeatureString())
340 .setOptions(TemplateTM->Options);
341
342 LLVMDisposeTargetMachine(TM);
343
344 return wrap(JTMB.release());
345}
346
Lang Hames1cd84932020-04-09 12:15:13 -0700347void LLVMOrcDisposeJITTargetMachineBuilder(
348 LLVMOrcJITTargetMachineBuilderRef JTMB) {
349 delete unwrap(JTMB);
350}
351
352LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void) {
353 return wrap(new LLJITBuilder());
354}
355
356void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder) {
357 delete unwrap(Builder);
358}
359
360void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(
361 LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB) {
362 unwrap(Builder)->setJITTargetMachineBuilder(*unwrap(JTMB));
363}
364
365LLVMErrorRef LLVMOrcCreateLLJIT(LLVMOrcLLJITRef *Result,
366 LLVMOrcLLJITBuilderRef Builder) {
367 assert(Result && "Result can not be null");
368
369 if (!Builder)
370 Builder = LLVMOrcCreateLLJITBuilder();
371
372 auto J = unwrap(Builder)->create();
373 LLVMOrcDisposeLLJITBuilder(Builder);
Lang Hames633ea072020-03-14 14:16:42 -0700374
375 if (!J) {
376 Result = 0;
377 return wrap(J.takeError());
378 }
379
380 *Result = wrap(J->release());
381 return LLVMErrorSuccess;
382}
383
384LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J) {
385 delete unwrap(J);
386 return LLVMErrorSuccess;
387}
388
Lang Hames1cd84932020-04-09 12:15:13 -0700389LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J) {
390 return wrap(&unwrap(J)->getExecutionSession());
391}
392
393LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J) {
394 return wrap(&unwrap(J)->getMainJITDylib());
395}
396
Lang Hames0d5f15f2020-04-09 16:17:04 -0700397const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J) {
398 return unwrap(J)->getTargetTriple().str().c_str();
399}
400
Lang Hames1cd84932020-04-09 12:15:13 -0700401char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J) {
402 return unwrap(J)->getDataLayout().getGlobalPrefix();
403}
404
405LLVMOrcSymbolStringPoolEntryRef
406LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J, const char *UnmangledName) {
407 return wrap(OrcV2CAPIHelper::releaseSymbolStringPtr(
408 unwrap(J)->mangleAndIntern(UnmangledName)));
409}
410
Lang Hames37bcf2d2020-04-09 17:54:59 -0700411LLVMErrorRef LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J, LLVMOrcJITDylibRef JD,
Lang Hames0d5f15f2020-04-09 16:17:04 -0700412 LLVMMemoryBufferRef ObjBuffer) {
413 return wrap(unwrap(J)->addObjectFile(
Lang Hames37bcf2d2020-04-09 17:54:59 -0700414 *unwrap(JD), std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))));
Lang Hames0d5f15f2020-04-09 16:17:04 -0700415}
416
Lang Hames91d1f412020-10-14 17:17:44 -0700417LLVMErrorRef LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcLLJITRef J,
418 LLVMOrcResourceTrackerRef RT,
419 LLVMMemoryBufferRef ObjBuffer) {
420 return wrap(unwrap(J)->addObjectFile(
421 ResourceTrackerSP(unwrap(RT)),
422 std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))));
423}
424
Lang Hames633ea072020-03-14 14:16:42 -0700425LLVMErrorRef LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J,
Lang Hames37bcf2d2020-04-09 17:54:59 -0700426 LLVMOrcJITDylibRef JD,
Lang Hames633ea072020-03-14 14:16:42 -0700427 LLVMOrcThreadSafeModuleRef TSM) {
Lang Hamesc88d9ea2020-10-01 15:25:06 -0700428 std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM));
429 return wrap(unwrap(J)->addIRModule(*unwrap(JD), std::move(*TmpTSM)));
Lang Hames633ea072020-03-14 14:16:42 -0700430}
431
Lang Hames91d1f412020-10-14 17:17:44 -0700432LLVMErrorRef LLVMOrcLLJITAddLLVMIRModuleWithRT(LLVMOrcLLJITRef J,
433 LLVMOrcResourceTrackerRef RT,
434 LLVMOrcThreadSafeModuleRef TSM) {
435 std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM));
436 return wrap(unwrap(J)->addIRModule(ResourceTrackerSP(unwrap(RT)),
437 std::move(*TmpTSM)));
438}
439
Lang Hames633ea072020-03-14 14:16:42 -0700440LLVMErrorRef LLVMOrcLLJITLookup(LLVMOrcLLJITRef J,
441 LLVMOrcJITTargetAddress *Result,
442 const char *Name) {
Lang Hames1cd84932020-04-09 12:15:13 -0700443 assert(Result && "Result can not be null");
444
Lang Hames633ea072020-03-14 14:16:42 -0700445 auto Sym = unwrap(J)->lookup(Name);
446 if (!Sym) {
447 *Result = 0;
448 return wrap(Sym.takeError());
449 }
450
451 *Result = Sym->getAddress();
452 return LLVMErrorSuccess;
453}