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