xref: /freebsd/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp (revision 7ef62cebc2f965b0f640263e179276928885e33d)
1 //===--------------- 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/LLJIT.h"
10 #include "llvm-c/Orc.h"
11 #include "llvm-c/OrcEE.h"
12 #include "llvm-c/TargetMachine.h"
13 
14 #include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"
15 #include "llvm/ExecutionEngine/Orc/LLJIT.h"
16 #include "llvm/ExecutionEngine/Orc/ObjectTransformLayer.h"
17 #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"
18 #include "llvm/ExecutionEngine/SectionMemoryManager.h"
19 
20 using namespace llvm;
21 using namespace llvm::orc;
22 
23 namespace llvm {
24 namespace orc {
25 
26 class InProgressLookupState;
27 
28 class OrcV2CAPIHelper {
29 public:
30   using PoolEntry = SymbolStringPtr::PoolEntry;
31   using PoolEntryPtr = SymbolStringPtr::PoolEntryPtr;
32 
33   // Move from SymbolStringPtr to PoolEntryPtr (no change in ref count).
34   static PoolEntryPtr moveFromSymbolStringPtr(SymbolStringPtr S) {
35     PoolEntryPtr Result = nullptr;
36     std::swap(Result, S.S);
37     return Result;
38   }
39 
40   // Move from a PoolEntryPtr to a SymbolStringPtr (no change in ref count).
41   static SymbolStringPtr moveToSymbolStringPtr(PoolEntryPtr P) {
42     SymbolStringPtr S;
43     S.S = P;
44     return S;
45   }
46 
47   // Copy a pool entry to a SymbolStringPtr (increments ref count).
48   static SymbolStringPtr copyToSymbolStringPtr(PoolEntryPtr P) {
49     return SymbolStringPtr(P);
50   }
51 
52   static PoolEntryPtr getRawPoolEntryPtr(const SymbolStringPtr &S) {
53     return S.S;
54   }
55 
56   static void retainPoolEntry(PoolEntryPtr P) {
57     SymbolStringPtr S(P);
58     S.S = nullptr;
59   }
60 
61   static void releasePoolEntry(PoolEntryPtr P) {
62     SymbolStringPtr S;
63     S.S = P;
64   }
65 
66   static InProgressLookupState *extractLookupState(LookupState &LS) {
67     return LS.IPLS.release();
68   }
69 
70   static void resetLookupState(LookupState &LS, InProgressLookupState *IPLS) {
71     return LS.reset(IPLS);
72   }
73 };
74 
75 } // namespace orc
76 } // namespace llvm
77 
78 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ExecutionSession, LLVMOrcExecutionSessionRef)
79 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(SymbolStringPool, LLVMOrcSymbolStringPoolRef)
80 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcV2CAPIHelper::PoolEntry,
81                                    LLVMOrcSymbolStringPoolEntryRef)
82 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MaterializationUnit,
83                                    LLVMOrcMaterializationUnitRef)
84 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MaterializationResponsibility,
85                                    LLVMOrcMaterializationResponsibilityRef)
86 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITDylib, LLVMOrcJITDylibRef)
87 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ResourceTracker, LLVMOrcResourceTrackerRef)
88 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DefinitionGenerator,
89                                    LLVMOrcDefinitionGeneratorRef)
90 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(InProgressLookupState, LLVMOrcLookupStateRef)
91 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeContext,
92                                    LLVMOrcThreadSafeContextRef)
93 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeModule, LLVMOrcThreadSafeModuleRef)
94 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITTargetMachineBuilder,
95                                    LLVMOrcJITTargetMachineBuilderRef)
96 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ObjectLayer, LLVMOrcObjectLayerRef)
97 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRTransformLayer, LLVMOrcIRTransformLayerRef)
98 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ObjectTransformLayer,
99                                    LLVMOrcObjectTransformLayerRef)
100 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DumpObjects, LLVMOrcDumpObjectsRef)
101 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IndirectStubsManager,
102                                    LLVMOrcIndirectStubsManagerRef)
103 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LazyCallThroughManager,
104                                    LLVMOrcLazyCallThroughManagerRef)
105 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJITBuilder, LLVMOrcLLJITBuilderRef)
106 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJIT, LLVMOrcLLJITRef)
107 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef)
108 
109 namespace {
110 
111 class OrcCAPIMaterializationUnit : public llvm::orc::MaterializationUnit {
112 public:
113   OrcCAPIMaterializationUnit(
114       std::string Name, SymbolFlagsMap InitialSymbolFlags,
115       SymbolStringPtr InitSymbol, void *Ctx,
116       LLVMOrcMaterializationUnitMaterializeFunction Materialize,
117       LLVMOrcMaterializationUnitDiscardFunction Discard,
118       LLVMOrcMaterializationUnitDestroyFunction Destroy)
119       : llvm::orc::MaterializationUnit(
120             Interface(std::move(InitialSymbolFlags), std::move(InitSymbol))),
121         Name(std::move(Name)), Ctx(Ctx), Materialize(Materialize),
122         Discard(Discard), Destroy(Destroy) {}
123 
124   ~OrcCAPIMaterializationUnit() {
125     if (Ctx)
126       Destroy(Ctx);
127   }
128 
129   StringRef getName() const override { return Name; }
130 
131   void materialize(std::unique_ptr<MaterializationResponsibility> R) override {
132     void *Tmp = Ctx;
133     Ctx = nullptr;
134     Materialize(Tmp, wrap(R.release()));
135   }
136 
137 private:
138   void discard(const JITDylib &JD, const SymbolStringPtr &Name) override {
139     Discard(Ctx, wrap(&JD), wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name)));
140   }
141 
142   std::string Name;
143   void *Ctx = nullptr;
144   LLVMOrcMaterializationUnitMaterializeFunction Materialize = nullptr;
145   LLVMOrcMaterializationUnitDiscardFunction Discard = nullptr;
146   LLVMOrcMaterializationUnitDestroyFunction Destroy = nullptr;
147 };
148 
149 static JITSymbolFlags toJITSymbolFlags(LLVMJITSymbolFlags F) {
150 
151   JITSymbolFlags JSF;
152 
153   if (F.GenericFlags & LLVMJITSymbolGenericFlagsExported)
154     JSF |= JITSymbolFlags::Exported;
155   if (F.GenericFlags & LLVMJITSymbolGenericFlagsWeak)
156     JSF |= JITSymbolFlags::Weak;
157   if (F.GenericFlags & LLVMJITSymbolGenericFlagsCallable)
158     JSF |= JITSymbolFlags::Callable;
159   if (F.GenericFlags & LLVMJITSymbolGenericFlagsMaterializationSideEffectsOnly)
160     JSF |= JITSymbolFlags::MaterializationSideEffectsOnly;
161 
162   JSF.getTargetFlags() = F.TargetFlags;
163 
164   return JSF;
165 }
166 
167 static LLVMJITSymbolFlags fromJITSymbolFlags(JITSymbolFlags JSF) {
168   LLVMJITSymbolFlags F = {0, 0};
169   if (JSF & JITSymbolFlags::Exported)
170     F.GenericFlags |= LLVMJITSymbolGenericFlagsExported;
171   if (JSF & JITSymbolFlags::Weak)
172     F.GenericFlags |= LLVMJITSymbolGenericFlagsWeak;
173   if (JSF & JITSymbolFlags::Callable)
174     F.GenericFlags |= LLVMJITSymbolGenericFlagsCallable;
175   if (JSF & JITSymbolFlags::MaterializationSideEffectsOnly)
176     F.GenericFlags |= LLVMJITSymbolGenericFlagsMaterializationSideEffectsOnly;
177 
178   F.TargetFlags = JSF.getTargetFlags();
179 
180   return F;
181 }
182 
183 static SymbolMap toSymbolMap(LLVMOrcCSymbolMapPairs Syms, size_t NumPairs) {
184   SymbolMap SM;
185   for (size_t I = 0; I != NumPairs; ++I) {
186     JITSymbolFlags Flags = toJITSymbolFlags(Syms[I].Sym.Flags);
187     SM[OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Syms[I].Name))] =
188         JITEvaluatedSymbol(Syms[I].Sym.Address, Flags);
189   }
190   return SM;
191 }
192 
193 static SymbolDependenceMap
194 toSymbolDependenceMap(LLVMOrcCDependenceMapPairs Pairs, size_t NumPairs) {
195   SymbolDependenceMap SDM;
196   for (size_t I = 0; I != NumPairs; ++I) {
197     JITDylib *JD = unwrap(Pairs[I].JD);
198     SymbolNameSet Names;
199 
200     for (size_t J = 0; J != Pairs[I].Names.Length; ++J) {
201       auto Sym = Pairs[I].Names.Symbols[J];
202       Names.insert(OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Sym)));
203     }
204     SDM[JD] = Names;
205   }
206   return SDM;
207 }
208 
209 static LookupKind toLookupKind(LLVMOrcLookupKind K) {
210   switch (K) {
211   case LLVMOrcLookupKindStatic:
212     return LookupKind::Static;
213   case LLVMOrcLookupKindDLSym:
214     return LookupKind::DLSym;
215   }
216   llvm_unreachable("unrecognized LLVMOrcLookupKind value");
217 }
218 
219 static LLVMOrcLookupKind fromLookupKind(LookupKind K) {
220   switch (K) {
221   case LookupKind::Static:
222     return LLVMOrcLookupKindStatic;
223   case LookupKind::DLSym:
224     return LLVMOrcLookupKindDLSym;
225   }
226   llvm_unreachable("unrecognized LookupKind value");
227 }
228 
229 static JITDylibLookupFlags
230 toJITDylibLookupFlags(LLVMOrcJITDylibLookupFlags LF) {
231   switch (LF) {
232   case LLVMOrcJITDylibLookupFlagsMatchExportedSymbolsOnly:
233     return JITDylibLookupFlags::MatchExportedSymbolsOnly;
234   case LLVMOrcJITDylibLookupFlagsMatchAllSymbols:
235     return JITDylibLookupFlags::MatchAllSymbols;
236   }
237   llvm_unreachable("unrecognized LLVMOrcJITDylibLookupFlags value");
238 }
239 
240 static LLVMOrcJITDylibLookupFlags
241 fromJITDylibLookupFlags(JITDylibLookupFlags LF) {
242   switch (LF) {
243   case JITDylibLookupFlags::MatchExportedSymbolsOnly:
244     return LLVMOrcJITDylibLookupFlagsMatchExportedSymbolsOnly;
245   case JITDylibLookupFlags::MatchAllSymbols:
246     return LLVMOrcJITDylibLookupFlagsMatchAllSymbols;
247   }
248   llvm_unreachable("unrecognized JITDylibLookupFlags value");
249 }
250 
251 static SymbolLookupFlags toSymbolLookupFlags(LLVMOrcSymbolLookupFlags SLF) {
252   switch (SLF) {
253   case LLVMOrcSymbolLookupFlagsRequiredSymbol:
254     return SymbolLookupFlags::RequiredSymbol;
255   case LLVMOrcSymbolLookupFlagsWeaklyReferencedSymbol:
256     return SymbolLookupFlags::WeaklyReferencedSymbol;
257   }
258   llvm_unreachable("unrecognized LLVMOrcSymbolLookupFlags value");
259 }
260 
261 static LLVMOrcSymbolLookupFlags fromSymbolLookupFlags(SymbolLookupFlags SLF) {
262   switch (SLF) {
263   case SymbolLookupFlags::RequiredSymbol:
264     return LLVMOrcSymbolLookupFlagsRequiredSymbol;
265   case SymbolLookupFlags::WeaklyReferencedSymbol:
266     return LLVMOrcSymbolLookupFlagsWeaklyReferencedSymbol;
267   }
268   llvm_unreachable("unrecognized SymbolLookupFlags value");
269 }
270 
271 static LLVMJITEvaluatedSymbol
272 fromJITEvaluatedSymbol(const JITEvaluatedSymbol &S) {
273   return {S.getAddress(), fromJITSymbolFlags(S.getFlags())};
274 }
275 
276 } // end anonymous namespace
277 
278 namespace llvm {
279 namespace orc {
280 
281 class CAPIDefinitionGenerator final : public DefinitionGenerator {
282 public:
283   CAPIDefinitionGenerator(
284       LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose, void *Ctx,
285       LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate)
286       : Dispose(Dispose), Ctx(Ctx), TryToGenerate(TryToGenerate) {}
287 
288   ~CAPIDefinitionGenerator() {
289     if (Dispose)
290       Dispose(Ctx);
291   }
292 
293   Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD,
294                       JITDylibLookupFlags JDLookupFlags,
295                       const SymbolLookupSet &LookupSet) override {
296 
297     // Take the lookup state.
298     LLVMOrcLookupStateRef LSR = ::wrap(OrcV2CAPIHelper::extractLookupState(LS));
299 
300     // Translate the lookup kind.
301     LLVMOrcLookupKind CLookupKind = fromLookupKind(K);
302 
303     // Translate the JITDylibLookupFlags.
304     LLVMOrcJITDylibLookupFlags CJDLookupFlags =
305         fromJITDylibLookupFlags(JDLookupFlags);
306 
307     // Translate the lookup set.
308     std::vector<LLVMOrcCLookupSetElement> CLookupSet;
309     CLookupSet.reserve(LookupSet.size());
310     for (auto &KV : LookupSet) {
311       LLVMOrcSymbolStringPoolEntryRef Name =
312           ::wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(KV.first));
313       LLVMOrcSymbolLookupFlags SLF = fromSymbolLookupFlags(KV.second);
314       CLookupSet.push_back({Name, SLF});
315     }
316 
317     // Run the C TryToGenerate function.
318     auto Err = unwrap(TryToGenerate(::wrap(this), Ctx, &LSR, CLookupKind,
319                                     ::wrap(&JD), CJDLookupFlags,
320                                     CLookupSet.data(), CLookupSet.size()));
321 
322     // Restore the lookup state.
323     OrcV2CAPIHelper::resetLookupState(LS, ::unwrap(LSR));
324 
325     return Err;
326   }
327 
328 private:
329   LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose;
330   void *Ctx;
331   LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate;
332 };
333 
334 } // end namespace orc
335 } // end namespace llvm
336 
337 void LLVMOrcExecutionSessionSetErrorReporter(
338     LLVMOrcExecutionSessionRef ES, LLVMOrcErrorReporterFunction ReportError,
339     void *Ctx) {
340   unwrap(ES)->setErrorReporter(
341       [=](Error Err) { ReportError(Ctx, wrap(std::move(Err))); });
342 }
343 
344 LLVMOrcSymbolStringPoolRef
345 LLVMOrcExecutionSessionGetSymbolStringPool(LLVMOrcExecutionSessionRef ES) {
346   return wrap(
347       unwrap(ES)->getExecutorProcessControl().getSymbolStringPool().get());
348 }
349 
350 void LLVMOrcSymbolStringPoolClearDeadEntries(LLVMOrcSymbolStringPoolRef SSP) {
351   unwrap(SSP)->clearDeadEntries();
352 }
353 
354 LLVMOrcSymbolStringPoolEntryRef
355 LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES, const char *Name) {
356   return wrap(
357       OrcV2CAPIHelper::moveFromSymbolStringPtr(unwrap(ES)->intern(Name)));
358 }
359 
360 void LLVMOrcExecutionSessionLookup(
361     LLVMOrcExecutionSessionRef ES, LLVMOrcLookupKind K,
362     LLVMOrcCJITDylibSearchOrder SearchOrder, size_t SearchOrderSize,
363     LLVMOrcCLookupSet Symbols, size_t SymbolsSize,
364     LLVMOrcExecutionSessionLookupHandleResultFunction HandleResult, void *Ctx) {
365   assert(ES && "ES cannot be null");
366   assert(SearchOrder && "SearchOrder cannot be null");
367   assert(Symbols && "Symbols cannot be null");
368   assert(HandleResult && "HandleResult cannot be null");
369 
370   JITDylibSearchOrder SO;
371   for (size_t I = 0; I != SearchOrderSize; ++I)
372     SO.push_back({unwrap(SearchOrder[I].JD),
373                   toJITDylibLookupFlags(SearchOrder[I].JDLookupFlags)});
374 
375   SymbolLookupSet SLS;
376   for (size_t I = 0; I != SymbolsSize; ++I)
377     SLS.add(OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Symbols[I].Name)),
378             toSymbolLookupFlags(Symbols[I].LookupFlags));
379 
380   unwrap(ES)->lookup(
381       toLookupKind(K), SO, std::move(SLS), SymbolState::Ready,
382       [HandleResult, Ctx](Expected<SymbolMap> Result) {
383         if (Result) {
384           SmallVector<LLVMOrcCSymbolMapPair> CResult;
385           for (auto &KV : *Result)
386             CResult.push_back(LLVMOrcCSymbolMapPair{
387                 wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(KV.first)),
388                 fromJITEvaluatedSymbol(KV.second)});
389           HandleResult(LLVMErrorSuccess, CResult.data(), CResult.size(), Ctx);
390         } else
391           HandleResult(wrap(Result.takeError()), nullptr, 0, Ctx);
392       },
393       NoDependenciesToRegister);
394 }
395 
396 void LLVMOrcRetainSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) {
397   OrcV2CAPIHelper::retainPoolEntry(unwrap(S));
398 }
399 
400 void LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) {
401   OrcV2CAPIHelper::releasePoolEntry(unwrap(S));
402 }
403 
404 const char *LLVMOrcSymbolStringPoolEntryStr(LLVMOrcSymbolStringPoolEntryRef S) {
405   return unwrap(S)->getKey().data();
406 }
407 
408 LLVMOrcResourceTrackerRef
409 LLVMOrcJITDylibCreateResourceTracker(LLVMOrcJITDylibRef JD) {
410   auto RT = unwrap(JD)->createResourceTracker();
411   // Retain the pointer for the C API client.
412   RT->Retain();
413   return wrap(RT.get());
414 }
415 
416 LLVMOrcResourceTrackerRef
417 LLVMOrcJITDylibGetDefaultResourceTracker(LLVMOrcJITDylibRef JD) {
418   auto RT = unwrap(JD)->getDefaultResourceTracker();
419   // Retain the pointer for the C API client.
420   return wrap(RT.get());
421 }
422 
423 void LLVMOrcReleaseResourceTracker(LLVMOrcResourceTrackerRef RT) {
424   ResourceTrackerSP TmpRT(unwrap(RT));
425   TmpRT->Release();
426 }
427 
428 void LLVMOrcResourceTrackerTransferTo(LLVMOrcResourceTrackerRef SrcRT,
429                                       LLVMOrcResourceTrackerRef DstRT) {
430   ResourceTrackerSP TmpRT(unwrap(SrcRT));
431   TmpRT->transferTo(*unwrap(DstRT));
432 }
433 
434 LLVMErrorRef LLVMOrcResourceTrackerRemove(LLVMOrcResourceTrackerRef RT) {
435   ResourceTrackerSP TmpRT(unwrap(RT));
436   return wrap(TmpRT->remove());
437 }
438 
439 void LLVMOrcDisposeDefinitionGenerator(LLVMOrcDefinitionGeneratorRef DG) {
440   std::unique_ptr<DefinitionGenerator> TmpDG(unwrap(DG));
441 }
442 
443 void LLVMOrcDisposeMaterializationUnit(LLVMOrcMaterializationUnitRef MU) {
444   std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU));
445 }
446 
447 LLVMOrcMaterializationUnitRef LLVMOrcCreateCustomMaterializationUnit(
448     const char *Name, void *Ctx, LLVMOrcCSymbolFlagsMapPairs Syms,
449     size_t NumSyms, LLVMOrcSymbolStringPoolEntryRef InitSym,
450     LLVMOrcMaterializationUnitMaterializeFunction Materialize,
451     LLVMOrcMaterializationUnitDiscardFunction Discard,
452     LLVMOrcMaterializationUnitDestroyFunction Destroy) {
453   SymbolFlagsMap SFM;
454   for (size_t I = 0; I != NumSyms; ++I)
455     SFM[OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Syms[I].Name))] =
456         toJITSymbolFlags(Syms[I].Flags);
457 
458   auto IS = OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(InitSym));
459 
460   return wrap(new OrcCAPIMaterializationUnit(
461       Name, std::move(SFM), std::move(IS), Ctx, Materialize, Discard, Destroy));
462 }
463 
464 LLVMOrcMaterializationUnitRef
465 LLVMOrcAbsoluteSymbols(LLVMOrcCSymbolMapPairs Syms, size_t NumPairs) {
466   SymbolMap SM = toSymbolMap(Syms, NumPairs);
467   return wrap(absoluteSymbols(std::move(SM)).release());
468 }
469 
470 LLVMOrcMaterializationUnitRef LLVMOrcLazyReexports(
471     LLVMOrcLazyCallThroughManagerRef LCTM, LLVMOrcIndirectStubsManagerRef ISM,
472     LLVMOrcJITDylibRef SourceJD, LLVMOrcCSymbolAliasMapPairs CallableAliases,
473     size_t NumPairs) {
474 
475   SymbolAliasMap SAM;
476   for (size_t I = 0; I != NumPairs; ++I) {
477     auto pair = CallableAliases[I];
478     JITSymbolFlags Flags = toJITSymbolFlags(pair.Entry.Flags);
479     SymbolStringPtr Name =
480         OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(pair.Entry.Name));
481     SAM[OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(pair.Name))] =
482         SymbolAliasMapEntry(Name, Flags);
483   }
484 
485   return wrap(lazyReexports(*unwrap(LCTM), *unwrap(ISM), *unwrap(SourceJD),
486                             std::move(SAM))
487                   .release());
488 }
489 
490 void LLVMOrcDisposeMaterializationResponsibility(
491     LLVMOrcMaterializationResponsibilityRef MR) {
492   std::unique_ptr<MaterializationResponsibility> TmpMR(unwrap(MR));
493 }
494 
495 LLVMOrcJITDylibRef LLVMOrcMaterializationResponsibilityGetTargetDylib(
496     LLVMOrcMaterializationResponsibilityRef MR) {
497   return wrap(&unwrap(MR)->getTargetJITDylib());
498 }
499 
500 LLVMOrcExecutionSessionRef
501 LLVMOrcMaterializationResponsibilityGetExecutionSession(
502     LLVMOrcMaterializationResponsibilityRef MR) {
503   return wrap(&unwrap(MR)->getExecutionSession());
504 }
505 
506 LLVMOrcCSymbolFlagsMapPairs LLVMOrcMaterializationResponsibilityGetSymbols(
507     LLVMOrcMaterializationResponsibilityRef MR, size_t *NumPairs) {
508 
509   auto Symbols = unwrap(MR)->getSymbols();
510   LLVMOrcCSymbolFlagsMapPairs Result = static_cast<LLVMOrcCSymbolFlagsMapPairs>(
511       safe_malloc(Symbols.size() * sizeof(LLVMOrcCSymbolFlagsMapPair)));
512   size_t I = 0;
513   for (auto const &pair : Symbols) {
514     auto Name = wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(pair.first));
515     auto Flags = pair.second;
516     Result[I] = {Name, fromJITSymbolFlags(Flags)};
517     I++;
518   }
519   *NumPairs = Symbols.size();
520   return Result;
521 }
522 
523 void LLVMOrcDisposeCSymbolFlagsMap(LLVMOrcCSymbolFlagsMapPairs Pairs) {
524   free(Pairs);
525 }
526 
527 LLVMOrcSymbolStringPoolEntryRef
528 LLVMOrcMaterializationResponsibilityGetInitializerSymbol(
529     LLVMOrcMaterializationResponsibilityRef MR) {
530   auto Sym = unwrap(MR)->getInitializerSymbol();
531   return wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Sym));
532 }
533 
534 LLVMOrcSymbolStringPoolEntryRef *
535 LLVMOrcMaterializationResponsibilityGetRequestedSymbols(
536     LLVMOrcMaterializationResponsibilityRef MR, size_t *NumSymbols) {
537 
538   auto Symbols = unwrap(MR)->getRequestedSymbols();
539   LLVMOrcSymbolStringPoolEntryRef *Result =
540       static_cast<LLVMOrcSymbolStringPoolEntryRef *>(safe_malloc(
541           Symbols.size() * sizeof(LLVMOrcSymbolStringPoolEntryRef)));
542   size_t I = 0;
543   for (auto &Name : Symbols) {
544     Result[I] = wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name));
545     I++;
546   }
547   *NumSymbols = Symbols.size();
548   return Result;
549 }
550 
551 void LLVMOrcDisposeSymbols(LLVMOrcSymbolStringPoolEntryRef *Symbols) {
552   free(Symbols);
553 }
554 
555 LLVMErrorRef LLVMOrcMaterializationResponsibilityNotifyResolved(
556     LLVMOrcMaterializationResponsibilityRef MR, LLVMOrcCSymbolMapPairs Symbols,
557     size_t NumPairs) {
558   SymbolMap SM = toSymbolMap(Symbols, NumPairs);
559   return wrap(unwrap(MR)->notifyResolved(std::move(SM)));
560 }
561 
562 LLVMErrorRef LLVMOrcMaterializationResponsibilityNotifyEmitted(
563     LLVMOrcMaterializationResponsibilityRef MR) {
564   return wrap(unwrap(MR)->notifyEmitted());
565 }
566 
567 LLVMErrorRef LLVMOrcMaterializationResponsibilityDefineMaterializing(
568     LLVMOrcMaterializationResponsibilityRef MR,
569     LLVMOrcCSymbolFlagsMapPairs Syms, size_t NumSyms) {
570   SymbolFlagsMap SFM;
571   for (size_t I = 0; I != NumSyms; ++I)
572     SFM[OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Syms[I].Name))] =
573         toJITSymbolFlags(Syms[I].Flags);
574 
575   return wrap(unwrap(MR)->defineMaterializing(std::move(SFM)));
576 }
577 
578 LLVMErrorRef LLVMOrcMaterializationResponsibilityReplace(
579     LLVMOrcMaterializationResponsibilityRef MR,
580     LLVMOrcMaterializationUnitRef MU) {
581   std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU));
582   return wrap(unwrap(MR)->replace(std::move(TmpMU)));
583 }
584 
585 LLVMErrorRef LLVMOrcMaterializationResponsibilityDelegate(
586     LLVMOrcMaterializationResponsibilityRef MR,
587     LLVMOrcSymbolStringPoolEntryRef *Symbols, size_t NumSymbols,
588     LLVMOrcMaterializationResponsibilityRef *Result) {
589   SymbolNameSet Syms;
590   for (size_t I = 0; I != NumSymbols; I++) {
591     Syms.insert(OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Symbols[I])));
592   }
593   auto OtherMR = unwrap(MR)->delegate(Syms);
594 
595   if (!OtherMR) {
596     return wrap(OtherMR.takeError());
597   }
598   *Result = wrap(OtherMR->release());
599   return LLVMErrorSuccess;
600 }
601 
602 void LLVMOrcMaterializationResponsibilityAddDependencies(
603     LLVMOrcMaterializationResponsibilityRef MR,
604     LLVMOrcSymbolStringPoolEntryRef Name,
605     LLVMOrcCDependenceMapPairs Dependencies, size_t NumPairs) {
606 
607   SymbolDependenceMap SDM = toSymbolDependenceMap(Dependencies, NumPairs);
608   auto Sym = OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Name));
609   unwrap(MR)->addDependencies(Sym, SDM);
610 }
611 
612 void LLVMOrcMaterializationResponsibilityAddDependenciesForAll(
613     LLVMOrcMaterializationResponsibilityRef MR,
614     LLVMOrcCDependenceMapPairs Dependencies, size_t NumPairs) {
615 
616   SymbolDependenceMap SDM = toSymbolDependenceMap(Dependencies, NumPairs);
617   unwrap(MR)->addDependenciesForAll(SDM);
618 }
619 
620 void LLVMOrcMaterializationResponsibilityFailMaterialization(
621     LLVMOrcMaterializationResponsibilityRef MR) {
622   unwrap(MR)->failMaterialization();
623 }
624 
625 void LLVMOrcIRTransformLayerEmit(LLVMOrcIRTransformLayerRef IRLayer,
626                                  LLVMOrcMaterializationResponsibilityRef MR,
627                                  LLVMOrcThreadSafeModuleRef TSM) {
628   std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM));
629   unwrap(IRLayer)->emit(
630       std::unique_ptr<MaterializationResponsibility>(unwrap(MR)),
631       std::move(*TmpTSM));
632 }
633 
634 LLVMOrcJITDylibRef
635 LLVMOrcExecutionSessionCreateBareJITDylib(LLVMOrcExecutionSessionRef ES,
636                                           const char *Name) {
637   return wrap(&unwrap(ES)->createBareJITDylib(Name));
638 }
639 
640 LLVMErrorRef
641 LLVMOrcExecutionSessionCreateJITDylib(LLVMOrcExecutionSessionRef ES,
642                                       LLVMOrcJITDylibRef *Result,
643                                       const char *Name) {
644   auto JD = unwrap(ES)->createJITDylib(Name);
645   if (!JD)
646     return wrap(JD.takeError());
647   *Result = wrap(&*JD);
648   return LLVMErrorSuccess;
649 }
650 
651 LLVMOrcJITDylibRef
652 LLVMOrcExecutionSessionGetJITDylibByName(LLVMOrcExecutionSessionRef ES,
653                                          const char *Name) {
654   return wrap(unwrap(ES)->getJITDylibByName(Name));
655 }
656 
657 LLVMErrorRef LLVMOrcJITDylibDefine(LLVMOrcJITDylibRef JD,
658                                    LLVMOrcMaterializationUnitRef MU) {
659   std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU));
660 
661   if (auto Err = unwrap(JD)->define(TmpMU)) {
662     TmpMU.release();
663     return wrap(std::move(Err));
664   }
665   return LLVMErrorSuccess;
666 }
667 
668 LLVMErrorRef LLVMOrcJITDylibClear(LLVMOrcJITDylibRef JD) {
669   return wrap(unwrap(JD)->clear());
670 }
671 
672 void LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD,
673                                  LLVMOrcDefinitionGeneratorRef DG) {
674   unwrap(JD)->addGenerator(std::unique_ptr<DefinitionGenerator>(unwrap(DG)));
675 }
676 
677 LLVMOrcDefinitionGeneratorRef LLVMOrcCreateCustomCAPIDefinitionGenerator(
678     LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction F, void *Ctx,
679     LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose) {
680   auto DG = std::make_unique<CAPIDefinitionGenerator>(Dispose, Ctx, F);
681   return wrap(DG.release());
682 }
683 
684 void LLVMOrcLookupStateContinueLookup(LLVMOrcLookupStateRef S,
685                                       LLVMErrorRef Err) {
686   LookupState LS;
687   OrcV2CAPIHelper::resetLookupState(LS, ::unwrap(S));
688   LS.continueLookup(unwrap(Err));
689 }
690 
691 LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess(
692     LLVMOrcDefinitionGeneratorRef *Result, char GlobalPrefix,
693     LLVMOrcSymbolPredicate Filter, void *FilterCtx) {
694   assert(Result && "Result can not be null");
695   assert((Filter || !FilterCtx) &&
696          "if Filter is null then FilterCtx must also be null");
697 
698   DynamicLibrarySearchGenerator::SymbolPredicate Pred;
699   if (Filter)
700     Pred = [=](const SymbolStringPtr &Name) -> bool {
701       return Filter(FilterCtx, wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name)));
702     };
703 
704   auto ProcessSymsGenerator =
705       DynamicLibrarySearchGenerator::GetForCurrentProcess(GlobalPrefix, Pred);
706 
707   if (!ProcessSymsGenerator) {
708     *Result = nullptr;
709     return wrap(ProcessSymsGenerator.takeError());
710   }
711 
712   *Result = wrap(ProcessSymsGenerator->release());
713   return LLVMErrorSuccess;
714 }
715 
716 LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForPath(
717     LLVMOrcDefinitionGeneratorRef *Result, const char *FileName,
718     char GlobalPrefix, LLVMOrcSymbolPredicate Filter, void *FilterCtx) {
719   assert(Result && "Result can not be null");
720   assert(FileName && "FileName can not be null");
721   assert((Filter || !FilterCtx) &&
722          "if Filter is null then FilterCtx must also be null");
723 
724   DynamicLibrarySearchGenerator::SymbolPredicate Pred;
725   if (Filter)
726     Pred = [=](const SymbolStringPtr &Name) -> bool {
727       return Filter(FilterCtx, wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name)));
728     };
729 
730   auto LibrarySymsGenerator =
731       DynamicLibrarySearchGenerator::Load(FileName, GlobalPrefix, Pred);
732 
733   if (!LibrarySymsGenerator) {
734     *Result = nullptr;
735     return wrap(LibrarySymsGenerator.takeError());
736   }
737 
738   *Result = wrap(LibrarySymsGenerator->release());
739   return LLVMErrorSuccess;
740 }
741 
742 LLVMErrorRef LLVMOrcCreateStaticLibrarySearchGeneratorForPath(
743     LLVMOrcDefinitionGeneratorRef *Result, LLVMOrcObjectLayerRef ObjLayer,
744     const char *FileName, const char *TargetTriple) {
745   assert(Result && "Result can not be null");
746   assert(FileName && "Filename can not be null");
747   assert(ObjLayer && "ObjectLayer can not be null");
748 
749   if (TargetTriple) {
750     auto TT = Triple(TargetTriple);
751     auto LibrarySymsGenerator =
752         StaticLibraryDefinitionGenerator::Load(*unwrap(ObjLayer), FileName, TT);
753     if (!LibrarySymsGenerator) {
754       *Result = nullptr;
755       return wrap(LibrarySymsGenerator.takeError());
756     }
757     *Result = wrap(LibrarySymsGenerator->release());
758     return LLVMErrorSuccess;
759   } else {
760     auto LibrarySymsGenerator =
761         StaticLibraryDefinitionGenerator::Load(*unwrap(ObjLayer), FileName);
762     if (!LibrarySymsGenerator) {
763       *Result = nullptr;
764       return wrap(LibrarySymsGenerator.takeError());
765     }
766     *Result = wrap(LibrarySymsGenerator->release());
767     return LLVMErrorSuccess;
768   }
769 }
770 
771 LLVMOrcThreadSafeContextRef LLVMOrcCreateNewThreadSafeContext(void) {
772   return wrap(new ThreadSafeContext(std::make_unique<LLVMContext>()));
773 }
774 
775 LLVMContextRef
776 LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx) {
777   return wrap(unwrap(TSCtx)->getContext());
778 }
779 
780 void LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx) {
781   delete unwrap(TSCtx);
782 }
783 
784 LLVMErrorRef
785 LLVMOrcThreadSafeModuleWithModuleDo(LLVMOrcThreadSafeModuleRef TSM,
786                                     LLVMOrcGenericIRModuleOperationFunction F,
787                                     void *Ctx) {
788   return wrap(unwrap(TSM)->withModuleDo(
789       [&](Module &M) { return unwrap(F(Ctx, wrap(&M))); }));
790 }
791 
792 LLVMOrcThreadSafeModuleRef
793 LLVMOrcCreateNewThreadSafeModule(LLVMModuleRef M,
794                                  LLVMOrcThreadSafeContextRef TSCtx) {
795   return wrap(
796       new ThreadSafeModule(std::unique_ptr<Module>(unwrap(M)), *unwrap(TSCtx)));
797 }
798 
799 void LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM) {
800   delete unwrap(TSM);
801 }
802 
803 LLVMErrorRef LLVMOrcJITTargetMachineBuilderDetectHost(
804     LLVMOrcJITTargetMachineBuilderRef *Result) {
805   assert(Result && "Result can not be null");
806 
807   auto JTMB = JITTargetMachineBuilder::detectHost();
808   if (!JTMB) {
809     Result = nullptr;
810     return wrap(JTMB.takeError());
811   }
812 
813   *Result = wrap(new JITTargetMachineBuilder(std::move(*JTMB)));
814   return LLVMErrorSuccess;
815 }
816 
817 LLVMOrcJITTargetMachineBuilderRef
818 LLVMOrcJITTargetMachineBuilderCreateFromTargetMachine(LLVMTargetMachineRef TM) {
819   auto *TemplateTM = unwrap(TM);
820 
821   auto JTMB =
822       std::make_unique<JITTargetMachineBuilder>(TemplateTM->getTargetTriple());
823 
824   (*JTMB)
825       .setCPU(TemplateTM->getTargetCPU().str())
826       .setRelocationModel(TemplateTM->getRelocationModel())
827       .setCodeModel(TemplateTM->getCodeModel())
828       .setCodeGenOptLevel(TemplateTM->getOptLevel())
829       .setFeatures(TemplateTM->getTargetFeatureString())
830       .setOptions(TemplateTM->Options);
831 
832   LLVMDisposeTargetMachine(TM);
833 
834   return wrap(JTMB.release());
835 }
836 
837 void LLVMOrcDisposeJITTargetMachineBuilder(
838     LLVMOrcJITTargetMachineBuilderRef JTMB) {
839   delete unwrap(JTMB);
840 }
841 
842 char *LLVMOrcJITTargetMachineBuilderGetTargetTriple(
843     LLVMOrcJITTargetMachineBuilderRef JTMB) {
844   auto Tmp = unwrap(JTMB)->getTargetTriple().str();
845   char *TargetTriple = (char *)malloc(Tmp.size() + 1);
846   strcpy(TargetTriple, Tmp.c_str());
847   return TargetTriple;
848 }
849 
850 void LLVMOrcJITTargetMachineBuilderSetTargetTriple(
851     LLVMOrcJITTargetMachineBuilderRef JTMB, const char *TargetTriple) {
852   unwrap(JTMB)->getTargetTriple() = Triple(TargetTriple);
853 }
854 
855 LLVMErrorRef LLVMOrcObjectLayerAddObjectFile(LLVMOrcObjectLayerRef ObjLayer,
856                                              LLVMOrcJITDylibRef JD,
857                                              LLVMMemoryBufferRef ObjBuffer) {
858   return wrap(unwrap(ObjLayer)->add(
859       *unwrap(JD), std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))));
860 }
861 
862 LLVMErrorRef LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcObjectLayerRef ObjLayer,
863                                              LLVMOrcResourceTrackerRef RT,
864                                              LLVMMemoryBufferRef ObjBuffer) {
865   return wrap(
866       unwrap(ObjLayer)->add(ResourceTrackerSP(unwrap(RT)),
867                             std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))));
868 }
869 
870 void LLVMOrcObjectLayerEmit(LLVMOrcObjectLayerRef ObjLayer,
871                             LLVMOrcMaterializationResponsibilityRef R,
872                             LLVMMemoryBufferRef ObjBuffer) {
873   unwrap(ObjLayer)->emit(
874       std::unique_ptr<MaterializationResponsibility>(unwrap(R)),
875       std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)));
876 }
877 
878 void LLVMOrcDisposeObjectLayer(LLVMOrcObjectLayerRef ObjLayer) {
879   delete unwrap(ObjLayer);
880 }
881 
882 void LLVMOrcIRTransformLayerSetTransform(
883     LLVMOrcIRTransformLayerRef IRTransformLayer,
884     LLVMOrcIRTransformLayerTransformFunction TransformFunction, void *Ctx) {
885   unwrap(IRTransformLayer)
886       ->setTransform(
887           [=](ThreadSafeModule TSM,
888               MaterializationResponsibility &R) -> Expected<ThreadSafeModule> {
889             LLVMOrcThreadSafeModuleRef TSMRef =
890                 wrap(new ThreadSafeModule(std::move(TSM)));
891             if (LLVMErrorRef Err = TransformFunction(Ctx, &TSMRef, wrap(&R))) {
892               assert(!TSMRef && "TSMRef was not reset to null on error");
893               return unwrap(Err);
894             }
895             assert(TSMRef && "Transform succeeded, but TSMRef was set to null");
896             ThreadSafeModule Result = std::move(*unwrap(TSMRef));
897             LLVMOrcDisposeThreadSafeModule(TSMRef);
898             return std::move(Result);
899           });
900 }
901 
902 void LLVMOrcObjectTransformLayerSetTransform(
903     LLVMOrcObjectTransformLayerRef ObjTransformLayer,
904     LLVMOrcObjectTransformLayerTransformFunction TransformFunction, void *Ctx) {
905   unwrap(ObjTransformLayer)
906       ->setTransform([TransformFunction, Ctx](std::unique_ptr<MemoryBuffer> Obj)
907                          -> Expected<std::unique_ptr<MemoryBuffer>> {
908         LLVMMemoryBufferRef ObjBuffer = wrap(Obj.release());
909         if (LLVMErrorRef Err = TransformFunction(Ctx, &ObjBuffer)) {
910           assert(!ObjBuffer && "ObjBuffer was not reset to null on error");
911           return unwrap(Err);
912         }
913         return std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer));
914       });
915 }
916 
917 LLVMOrcDumpObjectsRef LLVMOrcCreateDumpObjects(const char *DumpDir,
918                                                const char *IdentifierOverride) {
919   assert(DumpDir && "DumpDir should not be null");
920   assert(IdentifierOverride && "IdentifierOverride should not be null");
921   return wrap(new DumpObjects(DumpDir, IdentifierOverride));
922 }
923 
924 void LLVMOrcDisposeDumpObjects(LLVMOrcDumpObjectsRef DumpObjects) {
925   delete unwrap(DumpObjects);
926 }
927 
928 LLVMErrorRef LLVMOrcDumpObjects_CallOperator(LLVMOrcDumpObjectsRef DumpObjects,
929                                              LLVMMemoryBufferRef *ObjBuffer) {
930   std::unique_ptr<MemoryBuffer> OB(unwrap(*ObjBuffer));
931   if (auto Result = (*unwrap(DumpObjects))(std::move(OB))) {
932     *ObjBuffer = wrap(Result->release());
933     return LLVMErrorSuccess;
934   } else {
935     *ObjBuffer = nullptr;
936     return wrap(Result.takeError());
937   }
938 }
939 
940 LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void) {
941   return wrap(new LLJITBuilder());
942 }
943 
944 void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder) {
945   delete unwrap(Builder);
946 }
947 
948 void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(
949     LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB) {
950   unwrap(Builder)->setJITTargetMachineBuilder(std::move(*unwrap(JTMB)));
951   LLVMOrcDisposeJITTargetMachineBuilder(JTMB);
952 }
953 
954 void LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator(
955     LLVMOrcLLJITBuilderRef Builder,
956     LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction F, void *Ctx) {
957   unwrap(Builder)->setObjectLinkingLayerCreator(
958       [=](ExecutionSession &ES, const Triple &TT) {
959         auto TTStr = TT.str();
960         return std::unique_ptr<ObjectLayer>(
961             unwrap(F(Ctx, wrap(&ES), TTStr.c_str())));
962       });
963 }
964 
965 LLVMErrorRef LLVMOrcCreateLLJIT(LLVMOrcLLJITRef *Result,
966                                 LLVMOrcLLJITBuilderRef Builder) {
967   assert(Result && "Result can not be null");
968 
969   if (!Builder)
970     Builder = LLVMOrcCreateLLJITBuilder();
971 
972   auto J = unwrap(Builder)->create();
973   LLVMOrcDisposeLLJITBuilder(Builder);
974 
975   if (!J) {
976     Result = nullptr;
977     return wrap(J.takeError());
978   }
979 
980   *Result = wrap(J->release());
981   return LLVMErrorSuccess;
982 }
983 
984 LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J) {
985   delete unwrap(J);
986   return LLVMErrorSuccess;
987 }
988 
989 LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J) {
990   return wrap(&unwrap(J)->getExecutionSession());
991 }
992 
993 LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J) {
994   return wrap(&unwrap(J)->getMainJITDylib());
995 }
996 
997 const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J) {
998   return unwrap(J)->getTargetTriple().str().c_str();
999 }
1000 
1001 char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J) {
1002   return unwrap(J)->getDataLayout().getGlobalPrefix();
1003 }
1004 
1005 LLVMOrcSymbolStringPoolEntryRef
1006 LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J, const char *UnmangledName) {
1007   return wrap(OrcV2CAPIHelper::moveFromSymbolStringPtr(
1008       unwrap(J)->mangleAndIntern(UnmangledName)));
1009 }
1010 
1011 LLVMErrorRef LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J, LLVMOrcJITDylibRef JD,
1012                                        LLVMMemoryBufferRef ObjBuffer) {
1013   return wrap(unwrap(J)->addObjectFile(
1014       *unwrap(JD), std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))));
1015 }
1016 
1017 LLVMErrorRef LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcLLJITRef J,
1018                                              LLVMOrcResourceTrackerRef RT,
1019                                              LLVMMemoryBufferRef ObjBuffer) {
1020   return wrap(unwrap(J)->addObjectFile(
1021       ResourceTrackerSP(unwrap(RT)),
1022       std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))));
1023 }
1024 
1025 LLVMErrorRef LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J,
1026                                          LLVMOrcJITDylibRef JD,
1027                                          LLVMOrcThreadSafeModuleRef TSM) {
1028   std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM));
1029   return wrap(unwrap(J)->addIRModule(*unwrap(JD), std::move(*TmpTSM)));
1030 }
1031 
1032 LLVMErrorRef LLVMOrcLLJITAddLLVMIRModuleWithRT(LLVMOrcLLJITRef J,
1033                                                LLVMOrcResourceTrackerRef RT,
1034                                                LLVMOrcThreadSafeModuleRef TSM) {
1035   std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM));
1036   return wrap(unwrap(J)->addIRModule(ResourceTrackerSP(unwrap(RT)),
1037                                      std::move(*TmpTSM)));
1038 }
1039 
1040 LLVMErrorRef LLVMOrcLLJITLookup(LLVMOrcLLJITRef J,
1041                                 LLVMOrcJITTargetAddress *Result,
1042                                 const char *Name) {
1043   assert(Result && "Result can not be null");
1044 
1045   auto Sym = unwrap(J)->lookup(Name);
1046   if (!Sym) {
1047     *Result = 0;
1048     return wrap(Sym.takeError());
1049   }
1050 
1051   *Result = Sym->getValue();
1052   return LLVMErrorSuccess;
1053 }
1054 
1055 LLVMOrcObjectLayerRef LLVMOrcLLJITGetObjLinkingLayer(LLVMOrcLLJITRef J) {
1056   return wrap(&unwrap(J)->getObjLinkingLayer());
1057 }
1058 
1059 LLVMOrcObjectTransformLayerRef
1060 LLVMOrcLLJITGetObjTransformLayer(LLVMOrcLLJITRef J) {
1061   return wrap(&unwrap(J)->getObjTransformLayer());
1062 }
1063 
1064 LLVMOrcObjectLayerRef
1065 LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager(
1066     LLVMOrcExecutionSessionRef ES) {
1067   assert(ES && "ES must not be null");
1068   return wrap(new RTDyldObjectLinkingLayer(
1069       *unwrap(ES), [] { return std::make_unique<SectionMemoryManager>(); }));
1070 }
1071 
1072 LLVMOrcObjectLayerRef
1073 LLVMOrcCreateRTDyldObjectLinkingLayerWithMCJITMemoryManagerLikeCallbacks(
1074     LLVMOrcExecutionSessionRef ES, void *CreateContextCtx,
1075     LLVMMemoryManagerCreateContextCallback CreateContext,
1076     LLVMMemoryManagerNotifyTerminatingCallback NotifyTerminating,
1077     LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,
1078     LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,
1079     LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,
1080     LLVMMemoryManagerDestroyCallback Destroy) {
1081 
1082   struct MCJITMemoryManagerLikeCallbacks {
1083     MCJITMemoryManagerLikeCallbacks() = default;
1084     MCJITMemoryManagerLikeCallbacks(
1085         void *CreateContextCtx,
1086         LLVMMemoryManagerCreateContextCallback CreateContext,
1087         LLVMMemoryManagerNotifyTerminatingCallback NotifyTerminating,
1088         LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,
1089         LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,
1090         LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,
1091         LLVMMemoryManagerDestroyCallback Destroy)
1092         : CreateContextCtx(CreateContextCtx), CreateContext(CreateContext),
1093           NotifyTerminating(NotifyTerminating),
1094           AllocateCodeSection(AllocateCodeSection),
1095           AllocateDataSection(AllocateDataSection),
1096           FinalizeMemory(FinalizeMemory), Destroy(Destroy) {}
1097 
1098     MCJITMemoryManagerLikeCallbacks(MCJITMemoryManagerLikeCallbacks &&Other) {
1099       std::swap(CreateContextCtx, Other.CreateContextCtx);
1100       std::swap(CreateContext, Other.CreateContext);
1101       std::swap(NotifyTerminating, Other.NotifyTerminating);
1102       std::swap(AllocateCodeSection, Other.AllocateCodeSection);
1103       std::swap(AllocateDataSection, Other.AllocateDataSection);
1104       std::swap(FinalizeMemory, Other.FinalizeMemory);
1105       std::swap(Destroy, Other.Destroy);
1106     }
1107 
1108     ~MCJITMemoryManagerLikeCallbacks() {
1109       if (NotifyTerminating)
1110         NotifyTerminating(CreateContextCtx);
1111     }
1112 
1113     void *CreateContextCtx = nullptr;
1114     LLVMMemoryManagerCreateContextCallback CreateContext = nullptr;
1115     LLVMMemoryManagerNotifyTerminatingCallback NotifyTerminating = nullptr;
1116     LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection = nullptr;
1117     LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection = nullptr;
1118     LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory = nullptr;
1119     LLVMMemoryManagerDestroyCallback Destroy = nullptr;
1120   };
1121 
1122   class MCJITMemoryManagerLikeCallbacksMemMgr : public RTDyldMemoryManager {
1123   public:
1124     MCJITMemoryManagerLikeCallbacksMemMgr(
1125         const MCJITMemoryManagerLikeCallbacks &CBs)
1126         : CBs(CBs) {
1127       Opaque = CBs.CreateContext(CBs.CreateContextCtx);
1128     }
1129     ~MCJITMemoryManagerLikeCallbacksMemMgr() override { CBs.Destroy(Opaque); }
1130 
1131     uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
1132                                  unsigned SectionID,
1133                                  StringRef SectionName) override {
1134       return CBs.AllocateCodeSection(Opaque, Size, Alignment, SectionID,
1135                                      SectionName.str().c_str());
1136     }
1137 
1138     uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
1139                                  unsigned SectionID, StringRef SectionName,
1140                                  bool isReadOnly) override {
1141       return CBs.AllocateDataSection(Opaque, Size, Alignment, SectionID,
1142                                      SectionName.str().c_str(), isReadOnly);
1143     }
1144 
1145     bool finalizeMemory(std::string *ErrMsg) override {
1146       char *ErrMsgCString = nullptr;
1147       bool Result = CBs.FinalizeMemory(Opaque, &ErrMsgCString);
1148       assert((Result || !ErrMsgCString) &&
1149              "Did not expect an error message if FinalizeMemory succeeded");
1150       if (ErrMsgCString) {
1151         if (ErrMsg)
1152           *ErrMsg = ErrMsgCString;
1153         free(ErrMsgCString);
1154       }
1155       return Result;
1156     }
1157 
1158   private:
1159     const MCJITMemoryManagerLikeCallbacks &CBs;
1160     void *Opaque = nullptr;
1161   };
1162 
1163   assert(ES && "ES must not be null");
1164   assert(CreateContext && "CreateContext must not be null");
1165   assert(NotifyTerminating && "NotifyTerminating must not be null");
1166   assert(AllocateCodeSection && "AllocateCodeSection must not be null");
1167   assert(AllocateDataSection && "AllocateDataSection must not be null");
1168   assert(FinalizeMemory && "FinalizeMemory must not be null");
1169   assert(Destroy && "Destroy must not be null");
1170 
1171   MCJITMemoryManagerLikeCallbacks CBs(
1172       CreateContextCtx, CreateContext, NotifyTerminating, AllocateCodeSection,
1173       AllocateDataSection, FinalizeMemory, Destroy);
1174 
1175   return wrap(new RTDyldObjectLinkingLayer(*unwrap(ES), [CBs = std::move(CBs)] {
1176     return std::make_unique<MCJITMemoryManagerLikeCallbacksMemMgr>(CBs);
1177   }));
1178 
1179   return nullptr;
1180 }
1181 
1182 void LLVMOrcRTDyldObjectLinkingLayerRegisterJITEventListener(
1183     LLVMOrcObjectLayerRef RTDyldObjLinkingLayer,
1184     LLVMJITEventListenerRef Listener) {
1185   assert(RTDyldObjLinkingLayer && "RTDyldObjLinkingLayer must not be null");
1186   assert(Listener && "Listener must not be null");
1187   reinterpret_cast<RTDyldObjectLinkingLayer *>(unwrap(RTDyldObjLinkingLayer))
1188       ->registerJITEventListener(*unwrap(Listener));
1189 }
1190 
1191 LLVMOrcIRTransformLayerRef LLVMOrcLLJITGetIRTransformLayer(LLVMOrcLLJITRef J) {
1192   return wrap(&unwrap(J)->getIRTransformLayer());
1193 }
1194 
1195 const char *LLVMOrcLLJITGetDataLayoutStr(LLVMOrcLLJITRef J) {
1196   return unwrap(J)->getDataLayout().getStringRepresentation().c_str();
1197 }
1198 
1199 LLVMOrcIndirectStubsManagerRef
1200 LLVMOrcCreateLocalIndirectStubsManager(const char *TargetTriple) {
1201   auto builder = createLocalIndirectStubsManagerBuilder(Triple(TargetTriple));
1202   return wrap(builder().release());
1203 }
1204 
1205 void LLVMOrcDisposeIndirectStubsManager(LLVMOrcIndirectStubsManagerRef ISM) {
1206   std::unique_ptr<IndirectStubsManager> TmpISM(unwrap(ISM));
1207 }
1208 
1209 LLVMErrorRef LLVMOrcCreateLocalLazyCallThroughManager(
1210     const char *TargetTriple, LLVMOrcExecutionSessionRef ES,
1211     LLVMOrcJITTargetAddress ErrorHandlerAddr,
1212     LLVMOrcLazyCallThroughManagerRef *Result) {
1213   auto LCTM = createLocalLazyCallThroughManager(Triple(TargetTriple),
1214                                                 *unwrap(ES), ErrorHandlerAddr);
1215 
1216   if (!LCTM)
1217     return wrap(LCTM.takeError());
1218   *Result = wrap(LCTM->release());
1219   return LLVMErrorSuccess;
1220 }
1221 
1222 void LLVMOrcDisposeLazyCallThroughManager(
1223     LLVMOrcLazyCallThroughManagerRef LCM) {
1224   std::unique_ptr<LazyCallThroughManager> TmpLCM(unwrap(LCM));
1225 }
1226