blob: dfdd2c6c669f980af9172a89f86efd6ebdc4679d [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
Lang Hamesf3570702020-10-16 16:50:24 -07009#include "llvm-c/LLJIT.h"
Lang Hames633ea072020-03-14 14:16:42 -070010#include "llvm-c/Orc.h"
Lang Hames9898d9d2020-10-19 11:55:08 -070011#include "llvm-c/OrcEE.h"
Lang Hames633ea072020-03-14 14:16:42 -070012#include "llvm-c/TargetMachine.h"
13
14#include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"
15#include "llvm/ExecutionEngine/Orc/LLJIT.h"
Lang Hamesf3570702020-10-16 16:50:24 -070016#include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"
17#include "llvm/ExecutionEngine/SectionMemoryManager.h"
Lang Hames633ea072020-03-14 14:16:42 -070018
19using namespace llvm;
20using namespace llvm::orc;
21
Lang Hames1cd84932020-04-09 12:15:13 -070022namespace llvm {
23namespace orc {
24
Lang Hamesb6ca0c72020-10-15 17:33:16 -070025class InProgressLookupState;
26
Lang Hames1cd84932020-04-09 12:15:13 -070027class OrcV2CAPIHelper {
28public:
29 using PoolEntry = SymbolStringPtr::PoolEntry;
30 using PoolEntryPtr = SymbolStringPtr::PoolEntryPtr;
31
32 static PoolEntryPtr releaseSymbolStringPtr(SymbolStringPtr S) {
33 PoolEntryPtr Result = nullptr;
34 std::swap(Result, S.S);
35 return Result;
36 }
37
Lang Hames24afffe2020-10-15 20:33:22 -070038 static SymbolStringPtr retainSymbolStringPtr(PoolEntryPtr P) {
39 return SymbolStringPtr(P);
40 }
41
Lang Hames1cd84932020-04-09 12:15:13 -070042 static PoolEntryPtr getRawPoolEntryPtr(const SymbolStringPtr &S) {
43 return S.S;
44 }
45
Lang Hamesb6ca0c72020-10-15 17:33:16 -070046 static void retainPoolEntry(PoolEntryPtr P) {
47 SymbolStringPtr S(P);
48 S.S = nullptr;
49 }
50
Lang Hames1cd84932020-04-09 12:15:13 -070051 static void releasePoolEntry(PoolEntryPtr P) {
52 SymbolStringPtr S;
53 S.S = P;
54 }
Lang Hamesb6ca0c72020-10-15 17:33:16 -070055
56 static InProgressLookupState *extractLookupState(LookupState &LS) {
57 return LS.IPLS.release();
58 }
59
60 static void resetLookupState(LookupState &LS, InProgressLookupState *IPLS) {
61 return LS.reset(IPLS);
62 }
Lang Hames1cd84932020-04-09 12:15:13 -070063};
64
Lang Hamesb6ca0c72020-10-15 17:33:16 -070065} // namespace orc
66} // namespace llvm
Lang Hames1cd84932020-04-09 12:15:13 -070067
68DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ExecutionSession, LLVMOrcExecutionSessionRef)
Lang Hames35e48d72020-10-01 21:12:19 -070069DEFINE_SIMPLE_CONVERSION_FUNCTIONS(SymbolStringPool, LLVMOrcSymbolStringPoolRef)
Lang Hames1cd84932020-04-09 12:15:13 -070070DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcV2CAPIHelper::PoolEntry,
71 LLVMOrcSymbolStringPoolEntryRef)
Lang Hames24afffe2020-10-15 20:33:22 -070072DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MaterializationUnit,
73 LLVMOrcMaterializationUnitRef)
Lang Hames1cd84932020-04-09 12:15:13 -070074DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITDylib, LLVMOrcJITDylibRef)
Lang Hames91d1f412020-10-14 17:17:44 -070075DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ResourceTracker, LLVMOrcResourceTrackerRef)
Lang Hames5d2e3592020-10-01 14:40:08 -070076DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DefinitionGenerator,
Lang Hames49c065a2020-10-14 12:13:00 -070077 LLVMOrcDefinitionGeneratorRef)
Lang Hamesb6ca0c72020-10-15 17:33:16 -070078DEFINE_SIMPLE_CONVERSION_FUNCTIONS(InProgressLookupState, LLVMOrcLookupStateRef)
Lang Hames633ea072020-03-14 14:16:42 -070079DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeContext,
80 LLVMOrcThreadSafeContextRef)
81DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeModule, LLVMOrcThreadSafeModuleRef)
Lang Hames1cd84932020-04-09 12:15:13 -070082DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITTargetMachineBuilder,
83 LLVMOrcJITTargetMachineBuilderRef)
Lang Hamesf3570702020-10-16 16:50:24 -070084DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ObjectLayer, LLVMOrcObjectLayerRef)
Lang Hames1cd84932020-04-09 12:15:13 -070085DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJITBuilder, LLVMOrcLLJITBuilderRef)
Lang Hames633ea072020-03-14 14:16:42 -070086DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJIT, LLVMOrcLLJITRef)
87
Lang Hames59ed45b2020-04-10 14:07:51 -070088DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef)
89
Lang Hamesb6ca0c72020-10-15 17:33:16 -070090namespace llvm {
91namespace orc {
92
93class CAPIDefinitionGenerator final : public DefinitionGenerator {
94public:
95 CAPIDefinitionGenerator(
96 void *Ctx,
97 LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate)
98 : Ctx(Ctx), TryToGenerate(TryToGenerate) {}
99
100 Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD,
101 JITDylibLookupFlags JDLookupFlags,
102 const SymbolLookupSet &LookupSet) override {
103
104 // Take the lookup state.
105 LLVMOrcLookupStateRef LSR = ::wrap(OrcV2CAPIHelper::extractLookupState(LS));
106
107 // Translate the lookup kind.
108 LLVMOrcLookupKind CLookupKind;
109 switch (K) {
110 case LookupKind::Static:
111 CLookupKind = LLVMOrcLookupKindStatic;
112 break;
113 case LookupKind::DLSym:
114 CLookupKind = LLVMOrcLookupKindDLSym;
115 break;
116 }
117
118 // Translate the JITDylibSearchFlags.
119 LLVMOrcJITDylibLookupFlags CJDLookupFlags;
120 switch (JDLookupFlags) {
121 case JITDylibLookupFlags::MatchExportedSymbolsOnly:
122 CJDLookupFlags = LLVMOrcJITDylibLookupFlagsMatchExportedSymbolsOnly;
123 break;
124 case JITDylibLookupFlags::MatchAllSymbols:
125 CJDLookupFlags = LLVMOrcJITDylibLookupFlagsMatchAllSymbols;
126 break;
127 }
128
129 // Translate the lookup set.
130 std::vector<LLVMOrcCLookupSetElement> CLookupSet;
131 CLookupSet.reserve(LookupSet.size());
132 for (auto &KV : LookupSet) {
133 LLVMOrcSymbolLookupFlags SLF;
Lang Hames24afffe2020-10-15 20:33:22 -0700134 LLVMOrcSymbolStringPoolEntryRef Name =
135 ::wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(KV.first));
Lang Hamesb6ca0c72020-10-15 17:33:16 -0700136 switch (KV.second) {
137 case SymbolLookupFlags::RequiredSymbol:
138 SLF = LLVMOrcSymbolLookupFlagsRequiredSymbol;
139 break;
140 case SymbolLookupFlags::WeaklyReferencedSymbol:
141 SLF = LLVMOrcSymbolLookupFlagsWeaklyReferencedSymbol;
142 break;
143 }
Lang Hames24afffe2020-10-15 20:33:22 -0700144 CLookupSet.push_back({Name, SLF});
Lang Hamesb6ca0c72020-10-15 17:33:16 -0700145 }
Lang Hamesb6ca0c72020-10-15 17:33:16 -0700146
147 // Run the C TryToGenerate function.
Lang Hames24afffe2020-10-15 20:33:22 -0700148 auto Err = unwrap(TryToGenerate(::wrap(this), Ctx, &LSR, CLookupKind,
149 ::wrap(&JD), CJDLookupFlags,
150 CLookupSet.data(), CLookupSet.size()));
Lang Hamesb6ca0c72020-10-15 17:33:16 -0700151
152 // Restore the lookup state.
153 OrcV2CAPIHelper::resetLookupState(LS, ::unwrap(LSR));
154
155 return Err;
156 }
157
158private:
159 void *Ctx;
160 LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate;
161};
162
163} // end namespace orc
164} // end namespace llvm
165
Lang Hames14cb9b42020-10-01 11:24:34 -0700166void LLVMOrcExecutionSessionSetErrorReporter(
167 LLVMOrcExecutionSessionRef ES, LLVMOrcErrorReporterFunction ReportError,
168 void *Ctx) {
169 unwrap(ES)->setErrorReporter(
170 [=](Error Err) { ReportError(Ctx, wrap(std::move(Err))); });
171}
172
Lang Hames35e48d72020-10-01 21:12:19 -0700173LLVMOrcSymbolStringPoolRef
174LLVMOrcExecutionSessionGetSymbolStringPool(LLVMOrcExecutionSessionRef ES) {
175 return wrap(unwrap(ES)->getSymbolStringPool().get());
176}
177
178void LLVMOrcSymbolStringPoolClearDeadEntries(LLVMOrcSymbolStringPoolRef SSP) {
179 unwrap(SSP)->clearDeadEntries();
180}
181
Lang Hames1cd84932020-04-09 12:15:13 -0700182LLVMOrcSymbolStringPoolEntryRef
183LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES, const char *Name) {
184 return wrap(
185 OrcV2CAPIHelper::releaseSymbolStringPtr(unwrap(ES)->intern(Name)));
186}
187
Lang Hamesb6ca0c72020-10-15 17:33:16 -0700188void LLVMOrcRetainSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) {
189 OrcV2CAPIHelper::retainPoolEntry(unwrap(S));
190}
191
Lang Hames1cd84932020-04-09 12:15:13 -0700192void LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) {
193 OrcV2CAPIHelper::releasePoolEntry(unwrap(S));
194}
195
Lang Hames00369842020-10-19 01:36:14 -0700196const char *LLVMOrcSymbolStringPoolEntryStr(LLVMOrcSymbolStringPoolEntryRef S) {
197 return unwrap(S)->getKey().data();
198}
199
Lang Hames91d1f412020-10-14 17:17:44 -0700200LLVMOrcResourceTrackerRef
201LLVMOrcJITDylibCreateResourceTracker(LLVMOrcJITDylibRef JD) {
202 auto RT = unwrap(JD)->createResourceTracker();
203 // Retain the pointer for the C API client.
204 RT->Retain();
205 return wrap(RT.get());
206}
207
208LLVMOrcResourceTrackerRef
209LLVMOrcJITDylibGetDefaultResourceTracker(LLVMOrcJITDylibRef JD) {
210 auto RT = unwrap(JD)->getDefaultResourceTracker();
211 // Retain the pointer for the C API client.
212 return wrap(RT.get());
213}
214
215void LLVMOrcReleaseResourceTracker(LLVMOrcResourceTrackerRef RT) {
216 ResourceTrackerSP TmpRT(unwrap(RT));
217 TmpRT->Release();
218}
219
220void LLVMOrcResourceTrackerTransferTo(LLVMOrcResourceTrackerRef SrcRT,
221 LLVMOrcResourceTrackerRef DstRT) {
222 ResourceTrackerSP TmpRT(unwrap(SrcRT));
223 TmpRT->transferTo(*unwrap(DstRT));
224}
225
226LLVMErrorRef LLVMOrcResourceTrackerRemove(LLVMOrcResourceTrackerRef RT) {
227 ResourceTrackerSP TmpRT(unwrap(RT));
228 return wrap(TmpRT->remove());
229}
230
Lang Hames24afffe2020-10-15 20:33:22 -0700231void LLVMOrcDisposeDefinitionGenerator(LLVMOrcDefinitionGeneratorRef DG) {
232 std::unique_ptr<DefinitionGenerator> TmpDG(unwrap(DG));
233}
234
235void LLVMOrcDisposeMaterializationUnit(LLVMOrcMaterializationUnitRef MU) {
236 std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU));
237}
238
239LLVMOrcMaterializationUnitRef
240LLVMOrcAbsoluteSymbols(LLVMOrcCSymbolMapPairs Syms, size_t NumPairs) {
241 SymbolMap SM;
242 for (size_t I = 0; I != NumPairs; ++I) {
243 JITSymbolFlags Flags;
244
245 if (Syms[I].Sym.Flags.GenericFlags & LLVMJITSymbolGenericFlagsExported)
246 Flags |= JITSymbolFlags::Exported;
247 if (Syms[I].Sym.Flags.GenericFlags & LLVMJITSymbolGenericFlagsWeak)
248 Flags |= JITSymbolFlags::Weak;
249
250 Flags.getTargetFlags() = Syms[I].Sym.Flags.TargetFlags;
251
252 SM[OrcV2CAPIHelper::retainSymbolStringPtr(unwrap(Syms[I].Name))] =
253 JITEvaluatedSymbol(Syms[I].Sym.Address, Flags);
254 }
255
256 return wrap(absoluteSymbols(std::move(SM)).release());
Lang Hamesb6ca0c72020-10-15 17:33:16 -0700257}
258
Lang Hames9a0d1b62020-09-16 13:46:55 -0700259LLVMOrcJITDylibRef
260LLVMOrcExecutionSessionCreateBareJITDylib(LLVMOrcExecutionSessionRef ES,
261 const char *Name) {
262 return wrap(&unwrap(ES)->createBareJITDylib(Name));
263}
264
265LLVMErrorRef
266LLVMOrcExecutionSessionCreateJITDylib(LLVMOrcExecutionSessionRef ES,
267 LLVMOrcJITDylibRef *Result,
268 const char *Name) {
269 auto JD = unwrap(ES)->createJITDylib(Name);
270 if (!JD)
271 return wrap(JD.takeError());
272 *Result = wrap(&*JD);
273 return LLVMErrorSuccess;
274}
275
276LLVMOrcJITDylibRef
277LLVMOrcExecutionSessionGetJITDylibByName(LLVMOrcExecutionSessionRef ES,
278 const char *Name) {
279 return wrap(unwrap(ES)->getJITDylibByName(Name));
280}
281
Lang Hames24afffe2020-10-15 20:33:22 -0700282LLVMErrorRef LLVMOrcJITDylibDefine(LLVMOrcJITDylibRef JD,
283 LLVMOrcMaterializationUnitRef MU) {
284 std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU));
285
286 if (auto Err = unwrap(JD)->define(TmpMU)) {
287 TmpMU.release();
288 return wrap(std::move(Err));
289 }
290 return LLVMErrorSuccess;
291}
292
Lang Hames91d1f412020-10-14 17:17:44 -0700293LLVMErrorRef LLVMOrcJITDylibClear(LLVMOrcJITDylibRef JD) {
294 return wrap(unwrap(JD)->clear());
295}
296
Lang Hames1cd84932020-04-09 12:15:13 -0700297void LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD,
Lang Hames49c065a2020-10-14 12:13:00 -0700298 LLVMOrcDefinitionGeneratorRef DG) {
Lang Hames5d2e3592020-10-01 14:40:08 -0700299 unwrap(JD)->addGenerator(std::unique_ptr<DefinitionGenerator>(unwrap(DG)));
Lang Hames1cd84932020-04-09 12:15:13 -0700300}
301
Lang Hamesb6ca0c72020-10-15 17:33:16 -0700302LLVMOrcDefinitionGeneratorRef LLVMOrcCreateCustomCAPIDefinitionGenerator(
Lang Hamesf3570702020-10-16 16:50:24 -0700303 LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction F, void *Ctx) {
Lang Hamesb6ca0c72020-10-15 17:33:16 -0700304 auto DG = std::make_unique<CAPIDefinitionGenerator>(Ctx, F);
305 return wrap(DG.release());
306}
307
Lang Hames1cd84932020-04-09 12:15:13 -0700308LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess(
Lang Hames49c065a2020-10-14 12:13:00 -0700309 LLVMOrcDefinitionGeneratorRef *Result, char GlobalPrefix,
Lang Hames1cd84932020-04-09 12:15:13 -0700310 LLVMOrcSymbolPredicate Filter, void *FilterCtx) {
311 assert(Result && "Result can not be null");
312 assert((Filter || !FilterCtx) &&
313 "if Filter is null then FilterCtx must also be null");
314
315 DynamicLibrarySearchGenerator::SymbolPredicate Pred;
316 if (Filter)
317 Pred = [=](const SymbolStringPtr &Name) -> bool {
Lang Hamesf3570702020-10-16 16:50:24 -0700318 return Filter(FilterCtx, wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name)));
Lang Hames1cd84932020-04-09 12:15:13 -0700319 };
320
321 auto ProcessSymsGenerator =
322 DynamicLibrarySearchGenerator::GetForCurrentProcess(GlobalPrefix, Pred);
323
324 if (!ProcessSymsGenerator) {
325 *Result = 0;
326 return wrap(ProcessSymsGenerator.takeError());
327 }
328
329 *Result = wrap(ProcessSymsGenerator->release());
330 return LLVMErrorSuccess;
331}
332
333LLVMOrcThreadSafeContextRef LLVMOrcCreateNewThreadSafeContext(void) {
Lang Hames633ea072020-03-14 14:16:42 -0700334 return wrap(new ThreadSafeContext(std::make_unique<LLVMContext>()));
335}
336
337LLVMContextRef
338LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx) {
339 return wrap(unwrap(TSCtx)->getContext());
340}
341
342void LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx) {
343 delete unwrap(TSCtx);
344}
345
346LLVMOrcThreadSafeModuleRef
347LLVMOrcCreateNewThreadSafeModule(LLVMModuleRef M,
348 LLVMOrcThreadSafeContextRef TSCtx) {
349 return wrap(
350 new ThreadSafeModule(std::unique_ptr<Module>(unwrap(M)), *unwrap(TSCtx)));
351}
352
353void LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM) {
354 delete unwrap(TSM);
355}
356
Lang Hames1cd84932020-04-09 12:15:13 -0700357LLVMErrorRef LLVMOrcJITTargetMachineBuilderDetectHost(
358 LLVMOrcJITTargetMachineBuilderRef *Result) {
359 assert(Result && "Result can not be null");
360
361 auto JTMB = JITTargetMachineBuilder::detectHost();
362 if (!JTMB) {
363 Result = 0;
364 return wrap(JTMB.takeError());
365 }
366
367 *Result = wrap(new JITTargetMachineBuilder(std::move(*JTMB)));
368 return LLVMErrorSuccess;
369}
370
Lang Hames59ed45b2020-04-10 14:07:51 -0700371LLVMOrcJITTargetMachineBuilderRef
Lang Hames40f3fb52020-10-14 11:35:37 -0700372LLVMOrcJITTargetMachineBuilderCreateFromTargetMachine(LLVMTargetMachineRef TM) {
Lang Hames59ed45b2020-04-10 14:07:51 -0700373 auto *TemplateTM = unwrap(TM);
374
375 auto JTMB =
376 std::make_unique<JITTargetMachineBuilder>(TemplateTM->getTargetTriple());
377
378 (*JTMB)
379 .setCPU(TemplateTM->getTargetCPU().str())
380 .setRelocationModel(TemplateTM->getRelocationModel())
381 .setCodeModel(TemplateTM->getCodeModel())
382 .setCodeGenOptLevel(TemplateTM->getOptLevel())
383 .setFeatures(TemplateTM->getTargetFeatureString())
384 .setOptions(TemplateTM->Options);
385
386 LLVMDisposeTargetMachine(TM);
387
388 return wrap(JTMB.release());
389}
390
Lang Hames1cd84932020-04-09 12:15:13 -0700391void LLVMOrcDisposeJITTargetMachineBuilder(
392 LLVMOrcJITTargetMachineBuilderRef JTMB) {
393 delete unwrap(JTMB);
394}
395
Lang Hamesf3570702020-10-16 16:50:24 -0700396void lLVMOrcDisposeObjectLayer(LLVMOrcObjectLayerRef ObjLayer) {
397 delete unwrap(ObjLayer);
398}
399
Lang Hames1cd84932020-04-09 12:15:13 -0700400LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void) {
401 return wrap(new LLJITBuilder());
402}
403
404void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder) {
405 delete unwrap(Builder);
406}
407
408void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(
409 LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB) {
410 unwrap(Builder)->setJITTargetMachineBuilder(*unwrap(JTMB));
411}
412
Lang Hamesf3570702020-10-16 16:50:24 -0700413void LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator(
414 LLVMOrcLLJITBuilderRef Builder,
415 LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction F, void *Ctx) {
416 unwrap(Builder)->setObjectLinkingLayerCreator(
417 [=](ExecutionSession &ES, const Triple &TT) {
418 auto TTStr = TT.str();
419 return std::unique_ptr<ObjectLayer>(
420 unwrap(F(Ctx, wrap(&ES), TTStr.c_str())));
421 });
422}
423
Lang Hames1cd84932020-04-09 12:15:13 -0700424LLVMErrorRef LLVMOrcCreateLLJIT(LLVMOrcLLJITRef *Result,
425 LLVMOrcLLJITBuilderRef Builder) {
426 assert(Result && "Result can not be null");
427
428 if (!Builder)
429 Builder = LLVMOrcCreateLLJITBuilder();
430
431 auto J = unwrap(Builder)->create();
432 LLVMOrcDisposeLLJITBuilder(Builder);
Lang Hames633ea072020-03-14 14:16:42 -0700433
434 if (!J) {
435 Result = 0;
436 return wrap(J.takeError());
437 }
438
439 *Result = wrap(J->release());
440 return LLVMErrorSuccess;
441}
442
443LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J) {
444 delete unwrap(J);
445 return LLVMErrorSuccess;
446}
447
Lang Hames1cd84932020-04-09 12:15:13 -0700448LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J) {
449 return wrap(&unwrap(J)->getExecutionSession());
450}
451
452LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J) {
453 return wrap(&unwrap(J)->getMainJITDylib());
454}
455
Lang Hames0d5f15f2020-04-09 16:17:04 -0700456const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J) {
457 return unwrap(J)->getTargetTriple().str().c_str();
458}
459
Lang Hames1cd84932020-04-09 12:15:13 -0700460char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J) {
461 return unwrap(J)->getDataLayout().getGlobalPrefix();
462}
463
464LLVMOrcSymbolStringPoolEntryRef
465LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J, const char *UnmangledName) {
466 return wrap(OrcV2CAPIHelper::releaseSymbolStringPtr(
467 unwrap(J)->mangleAndIntern(UnmangledName)));
468}
469
Lang Hames37bcf2d2020-04-09 17:54:59 -0700470LLVMErrorRef LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J, LLVMOrcJITDylibRef JD,
Lang Hames0d5f15f2020-04-09 16:17:04 -0700471 LLVMMemoryBufferRef ObjBuffer) {
472 return wrap(unwrap(J)->addObjectFile(
Lang Hames37bcf2d2020-04-09 17:54:59 -0700473 *unwrap(JD), std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))));
Lang Hames0d5f15f2020-04-09 16:17:04 -0700474}
475
Lang Hames91d1f412020-10-14 17:17:44 -0700476LLVMErrorRef LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcLLJITRef J,
477 LLVMOrcResourceTrackerRef RT,
478 LLVMMemoryBufferRef ObjBuffer) {
479 return wrap(unwrap(J)->addObjectFile(
480 ResourceTrackerSP(unwrap(RT)),
481 std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))));
482}
483
Lang Hames633ea072020-03-14 14:16:42 -0700484LLVMErrorRef LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J,
Lang Hames37bcf2d2020-04-09 17:54:59 -0700485 LLVMOrcJITDylibRef JD,
Lang Hames633ea072020-03-14 14:16:42 -0700486 LLVMOrcThreadSafeModuleRef TSM) {
Lang Hamesc88d9ea2020-10-01 15:25:06 -0700487 std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM));
488 return wrap(unwrap(J)->addIRModule(*unwrap(JD), std::move(*TmpTSM)));
Lang Hames633ea072020-03-14 14:16:42 -0700489}
490
Lang Hames91d1f412020-10-14 17:17:44 -0700491LLVMErrorRef LLVMOrcLLJITAddLLVMIRModuleWithRT(LLVMOrcLLJITRef J,
492 LLVMOrcResourceTrackerRef RT,
493 LLVMOrcThreadSafeModuleRef TSM) {
494 std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM));
495 return wrap(unwrap(J)->addIRModule(ResourceTrackerSP(unwrap(RT)),
496 std::move(*TmpTSM)));
497}
498
Lang Hames633ea072020-03-14 14:16:42 -0700499LLVMErrorRef LLVMOrcLLJITLookup(LLVMOrcLLJITRef J,
500 LLVMOrcJITTargetAddress *Result,
501 const char *Name) {
Lang Hames1cd84932020-04-09 12:15:13 -0700502 assert(Result && "Result can not be null");
503
Lang Hames633ea072020-03-14 14:16:42 -0700504 auto Sym = unwrap(J)->lookup(Name);
505 if (!Sym) {
506 *Result = 0;
507 return wrap(Sym.takeError());
508 }
509
510 *Result = Sym->getAddress();
511 return LLVMErrorSuccess;
512}
Lang Hamesf3570702020-10-16 16:50:24 -0700513
514LLVMOrcObjectLayerRef
515LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager(
516 LLVMOrcExecutionSessionRef ES) {
517 assert(ES && "ES must not be null");
518 return wrap(new RTDyldObjectLinkingLayer(
519 *unwrap(ES), [] { return std::make_unique<SectionMemoryManager>(); }));
520}
521
522void LLVMOrcRTDyldObjectLinkingLayerRegisterJITEventListener(
523 LLVMOrcObjectLayerRef RTDyldObjLinkingLayer,
524 LLVMJITEventListenerRef Listener) {
525 assert(RTDyldObjLinkingLayer && "RTDyldObjLinkingLayer must not be null");
526 assert(Listener && "Listener must not be null");
527 reinterpret_cast<RTDyldObjectLinkingLayer *>(unwrap(RTDyldObjLinkingLayer))
528 ->registerJITEventListener(*unwrap(Listener));
529}