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).
moveFromSymbolStringPtr(SymbolStringPtr S)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).
moveToSymbolStringPtr(PoolEntryPtr P)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).
copyToSymbolStringPtr(PoolEntryPtr P)48 static SymbolStringPtr copyToSymbolStringPtr(PoolEntryPtr P) {
49 return SymbolStringPtr(P);
50 }
51
getRawPoolEntryPtr(const SymbolStringPtr & S)52 static PoolEntryPtr getRawPoolEntryPtr(const SymbolStringPtr &S) {
53 return S.S;
54 }
55
retainPoolEntry(PoolEntryPtr P)56 static void retainPoolEntry(PoolEntryPtr P) {
57 SymbolStringPtr S(P);
58 S.S = nullptr;
59 }
60
releasePoolEntry(PoolEntryPtr P)61 static void releasePoolEntry(PoolEntryPtr P) {
62 SymbolStringPtr S;
63 S.S = P;
64 }
65
extractLookupState(LookupState & LS)66 static InProgressLookupState *extractLookupState(LookupState &LS) {
67 return LS.IPLS.release();
68 }
69
resetLookupState(LookupState & LS,InProgressLookupState * IPLS)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:
OrcCAPIMaterializationUnit(std::string Name,SymbolFlagsMap InitialSymbolFlags,SymbolStringPtr InitSymbol,void * Ctx,LLVMOrcMaterializationUnitMaterializeFunction Materialize,LLVMOrcMaterializationUnitDiscardFunction Discard,LLVMOrcMaterializationUnitDestroyFunction Destroy)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
~OrcCAPIMaterializationUnit()124 ~OrcCAPIMaterializationUnit() {
125 if (Ctx)
126 Destroy(Ctx);
127 }
128
getName() const129 StringRef getName() const override { return Name; }
130
materialize(std::unique_ptr<MaterializationResponsibility> R)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:
discard(const JITDylib & JD,const SymbolStringPtr & Name)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
toJITSymbolFlags(LLVMJITSymbolFlags F)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
fromJITSymbolFlags(JITSymbolFlags JSF)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
toSymbolMap(LLVMOrcCSymbolMapPairs Syms,size_t NumPairs)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
toSymbolDependenceMap(LLVMOrcCDependenceMapPairs Pairs,size_t NumPairs)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
toLookupKind(LLVMOrcLookupKind K)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
fromLookupKind(LookupKind K)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
toJITDylibLookupFlags(LLVMOrcJITDylibLookupFlags LF)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
fromJITDylibLookupFlags(JITDylibLookupFlags LF)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
toSymbolLookupFlags(LLVMOrcSymbolLookupFlags SLF)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
fromSymbolLookupFlags(SymbolLookupFlags SLF)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
fromJITEvaluatedSymbol(const JITEvaluatedSymbol & S)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:
CAPIDefinitionGenerator(LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose,void * Ctx,LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate)283 CAPIDefinitionGenerator(
284 LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose, void *Ctx,
285 LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate)
286 : Dispose(Dispose), Ctx(Ctx), TryToGenerate(TryToGenerate) {}
287
~CAPIDefinitionGenerator()288 ~CAPIDefinitionGenerator() {
289 if (Dispose)
290 Dispose(Ctx);
291 }
292
tryToGenerate(LookupState & LS,LookupKind K,JITDylib & JD,JITDylibLookupFlags JDLookupFlags,const SymbolLookupSet & LookupSet)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
LLVMOrcExecutionSessionSetErrorReporter(LLVMOrcExecutionSessionRef ES,LLVMOrcErrorReporterFunction ReportError,void * Ctx)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
LLVMOrcExecutionSessionGetSymbolStringPool(LLVMOrcExecutionSessionRef ES)345 LLVMOrcExecutionSessionGetSymbolStringPool(LLVMOrcExecutionSessionRef ES) {
346 return wrap(
347 unwrap(ES)->getExecutorProcessControl().getSymbolStringPool().get());
348 }
349
LLVMOrcSymbolStringPoolClearDeadEntries(LLVMOrcSymbolStringPoolRef SSP)350 void LLVMOrcSymbolStringPoolClearDeadEntries(LLVMOrcSymbolStringPoolRef SSP) {
351 unwrap(SSP)->clearDeadEntries();
352 }
353
354 LLVMOrcSymbolStringPoolEntryRef
LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES,const char * Name)355 LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES, const char *Name) {
356 return wrap(
357 OrcV2CAPIHelper::moveFromSymbolStringPtr(unwrap(ES)->intern(Name)));
358 }
359
LLVMOrcExecutionSessionLookup(LLVMOrcExecutionSessionRef ES,LLVMOrcLookupKind K,LLVMOrcCJITDylibSearchOrder SearchOrder,size_t SearchOrderSize,LLVMOrcCLookupSet Symbols,size_t SymbolsSize,LLVMOrcExecutionSessionLookupHandleResultFunction HandleResult,void * Ctx)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
LLVMOrcRetainSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S)396 void LLVMOrcRetainSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) {
397 OrcV2CAPIHelper::retainPoolEntry(unwrap(S));
398 }
399
LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S)400 void LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) {
401 OrcV2CAPIHelper::releasePoolEntry(unwrap(S));
402 }
403
LLVMOrcSymbolStringPoolEntryStr(LLVMOrcSymbolStringPoolEntryRef S)404 const char *LLVMOrcSymbolStringPoolEntryStr(LLVMOrcSymbolStringPoolEntryRef S) {
405 return unwrap(S)->getKey().data();
406 }
407
408 LLVMOrcResourceTrackerRef
LLVMOrcJITDylibCreateResourceTracker(LLVMOrcJITDylibRef JD)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
LLVMOrcJITDylibGetDefaultResourceTracker(LLVMOrcJITDylibRef JD)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
LLVMOrcReleaseResourceTracker(LLVMOrcResourceTrackerRef RT)423 void LLVMOrcReleaseResourceTracker(LLVMOrcResourceTrackerRef RT) {
424 ResourceTrackerSP TmpRT(unwrap(RT));
425 TmpRT->Release();
426 }
427
LLVMOrcResourceTrackerTransferTo(LLVMOrcResourceTrackerRef SrcRT,LLVMOrcResourceTrackerRef DstRT)428 void LLVMOrcResourceTrackerTransferTo(LLVMOrcResourceTrackerRef SrcRT,
429 LLVMOrcResourceTrackerRef DstRT) {
430 ResourceTrackerSP TmpRT(unwrap(SrcRT));
431 TmpRT->transferTo(*unwrap(DstRT));
432 }
433
LLVMOrcResourceTrackerRemove(LLVMOrcResourceTrackerRef RT)434 LLVMErrorRef LLVMOrcResourceTrackerRemove(LLVMOrcResourceTrackerRef RT) {
435 ResourceTrackerSP TmpRT(unwrap(RT));
436 return wrap(TmpRT->remove());
437 }
438
LLVMOrcDisposeDefinitionGenerator(LLVMOrcDefinitionGeneratorRef DG)439 void LLVMOrcDisposeDefinitionGenerator(LLVMOrcDefinitionGeneratorRef DG) {
440 std::unique_ptr<DefinitionGenerator> TmpDG(unwrap(DG));
441 }
442
LLVMOrcDisposeMaterializationUnit(LLVMOrcMaterializationUnitRef MU)443 void LLVMOrcDisposeMaterializationUnit(LLVMOrcMaterializationUnitRef MU) {
444 std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU));
445 }
446
LLVMOrcCreateCustomMaterializationUnit(const char * Name,void * Ctx,LLVMOrcCSymbolFlagsMapPairs Syms,size_t NumSyms,LLVMOrcSymbolStringPoolEntryRef InitSym,LLVMOrcMaterializationUnitMaterializeFunction Materialize,LLVMOrcMaterializationUnitDiscardFunction Discard,LLVMOrcMaterializationUnitDestroyFunction Destroy)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
LLVMOrcAbsoluteSymbols(LLVMOrcCSymbolMapPairs Syms,size_t NumPairs)465 LLVMOrcAbsoluteSymbols(LLVMOrcCSymbolMapPairs Syms, size_t NumPairs) {
466 SymbolMap SM = toSymbolMap(Syms, NumPairs);
467 return wrap(absoluteSymbols(std::move(SM)).release());
468 }
469
LLVMOrcLazyReexports(LLVMOrcLazyCallThroughManagerRef LCTM,LLVMOrcIndirectStubsManagerRef ISM,LLVMOrcJITDylibRef SourceJD,LLVMOrcCSymbolAliasMapPairs CallableAliases,size_t NumPairs)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
LLVMOrcDisposeMaterializationResponsibility(LLVMOrcMaterializationResponsibilityRef MR)490 void LLVMOrcDisposeMaterializationResponsibility(
491 LLVMOrcMaterializationResponsibilityRef MR) {
492 std::unique_ptr<MaterializationResponsibility> TmpMR(unwrap(MR));
493 }
494
LLVMOrcMaterializationResponsibilityGetTargetDylib(LLVMOrcMaterializationResponsibilityRef MR)495 LLVMOrcJITDylibRef LLVMOrcMaterializationResponsibilityGetTargetDylib(
496 LLVMOrcMaterializationResponsibilityRef MR) {
497 return wrap(&unwrap(MR)->getTargetJITDylib());
498 }
499
500 LLVMOrcExecutionSessionRef
LLVMOrcMaterializationResponsibilityGetExecutionSession(LLVMOrcMaterializationResponsibilityRef MR)501 LLVMOrcMaterializationResponsibilityGetExecutionSession(
502 LLVMOrcMaterializationResponsibilityRef MR) {
503 return wrap(&unwrap(MR)->getExecutionSession());
504 }
505
LLVMOrcMaterializationResponsibilityGetSymbols(LLVMOrcMaterializationResponsibilityRef MR,size_t * NumPairs)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
LLVMOrcDisposeCSymbolFlagsMap(LLVMOrcCSymbolFlagsMapPairs Pairs)523 void LLVMOrcDisposeCSymbolFlagsMap(LLVMOrcCSymbolFlagsMapPairs Pairs) {
524 free(Pairs);
525 }
526
527 LLVMOrcSymbolStringPoolEntryRef
LLVMOrcMaterializationResponsibilityGetInitializerSymbol(LLVMOrcMaterializationResponsibilityRef MR)528 LLVMOrcMaterializationResponsibilityGetInitializerSymbol(
529 LLVMOrcMaterializationResponsibilityRef MR) {
530 auto Sym = unwrap(MR)->getInitializerSymbol();
531 return wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Sym));
532 }
533
534 LLVMOrcSymbolStringPoolEntryRef *
LLVMOrcMaterializationResponsibilityGetRequestedSymbols(LLVMOrcMaterializationResponsibilityRef MR,size_t * NumSymbols)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
LLVMOrcDisposeSymbols(LLVMOrcSymbolStringPoolEntryRef * Symbols)551 void LLVMOrcDisposeSymbols(LLVMOrcSymbolStringPoolEntryRef *Symbols) {
552 free(Symbols);
553 }
554
LLVMOrcMaterializationResponsibilityNotifyResolved(LLVMOrcMaterializationResponsibilityRef MR,LLVMOrcCSymbolMapPairs Symbols,size_t NumPairs)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
LLVMOrcMaterializationResponsibilityNotifyEmitted(LLVMOrcMaterializationResponsibilityRef MR)562 LLVMErrorRef LLVMOrcMaterializationResponsibilityNotifyEmitted(
563 LLVMOrcMaterializationResponsibilityRef MR) {
564 return wrap(unwrap(MR)->notifyEmitted());
565 }
566
LLVMOrcMaterializationResponsibilityDefineMaterializing(LLVMOrcMaterializationResponsibilityRef MR,LLVMOrcCSymbolFlagsMapPairs Syms,size_t NumSyms)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
LLVMOrcMaterializationResponsibilityReplace(LLVMOrcMaterializationResponsibilityRef MR,LLVMOrcMaterializationUnitRef MU)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
LLVMOrcMaterializationResponsibilityDelegate(LLVMOrcMaterializationResponsibilityRef MR,LLVMOrcSymbolStringPoolEntryRef * Symbols,size_t NumSymbols,LLVMOrcMaterializationResponsibilityRef * Result)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
LLVMOrcMaterializationResponsibilityAddDependencies(LLVMOrcMaterializationResponsibilityRef MR,LLVMOrcSymbolStringPoolEntryRef Name,LLVMOrcCDependenceMapPairs Dependencies,size_t NumPairs)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
LLVMOrcMaterializationResponsibilityAddDependenciesForAll(LLVMOrcMaterializationResponsibilityRef MR,LLVMOrcCDependenceMapPairs Dependencies,size_t NumPairs)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
LLVMOrcMaterializationResponsibilityFailMaterialization(LLVMOrcMaterializationResponsibilityRef MR)620 void LLVMOrcMaterializationResponsibilityFailMaterialization(
621 LLVMOrcMaterializationResponsibilityRef MR) {
622 unwrap(MR)->failMaterialization();
623 }
624
LLVMOrcIRTransformLayerEmit(LLVMOrcIRTransformLayerRef IRLayer,LLVMOrcMaterializationResponsibilityRef MR,LLVMOrcThreadSafeModuleRef TSM)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
LLVMOrcExecutionSessionCreateBareJITDylib(LLVMOrcExecutionSessionRef ES,const char * Name)635 LLVMOrcExecutionSessionCreateBareJITDylib(LLVMOrcExecutionSessionRef ES,
636 const char *Name) {
637 return wrap(&unwrap(ES)->createBareJITDylib(Name));
638 }
639
640 LLVMErrorRef
LLVMOrcExecutionSessionCreateJITDylib(LLVMOrcExecutionSessionRef ES,LLVMOrcJITDylibRef * Result,const char * Name)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
LLVMOrcExecutionSessionGetJITDylibByName(LLVMOrcExecutionSessionRef ES,const char * Name)652 LLVMOrcExecutionSessionGetJITDylibByName(LLVMOrcExecutionSessionRef ES,
653 const char *Name) {
654 return wrap(unwrap(ES)->getJITDylibByName(Name));
655 }
656
LLVMOrcJITDylibDefine(LLVMOrcJITDylibRef JD,LLVMOrcMaterializationUnitRef MU)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
LLVMOrcJITDylibClear(LLVMOrcJITDylibRef JD)668 LLVMErrorRef LLVMOrcJITDylibClear(LLVMOrcJITDylibRef JD) {
669 return wrap(unwrap(JD)->clear());
670 }
671
LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD,LLVMOrcDefinitionGeneratorRef DG)672 void LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD,
673 LLVMOrcDefinitionGeneratorRef DG) {
674 unwrap(JD)->addGenerator(std::unique_ptr<DefinitionGenerator>(unwrap(DG)));
675 }
676
LLVMOrcCreateCustomCAPIDefinitionGenerator(LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction F,void * Ctx,LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose)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
LLVMOrcLookupStateContinueLookup(LLVMOrcLookupStateRef S,LLVMErrorRef Err)684 void LLVMOrcLookupStateContinueLookup(LLVMOrcLookupStateRef S,
685 LLVMErrorRef Err) {
686 LookupState LS;
687 OrcV2CAPIHelper::resetLookupState(LS, ::unwrap(S));
688 LS.continueLookup(unwrap(Err));
689 }
690
LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess(LLVMOrcDefinitionGeneratorRef * Result,char GlobalPrefix,LLVMOrcSymbolPredicate Filter,void * FilterCtx)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
LLVMOrcCreateDynamicLibrarySearchGeneratorForPath(LLVMOrcDefinitionGeneratorRef * Result,const char * FileName,char GlobalPrefix,LLVMOrcSymbolPredicate Filter,void * FilterCtx)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
LLVMOrcCreateStaticLibrarySearchGeneratorForPath(LLVMOrcDefinitionGeneratorRef * Result,LLVMOrcObjectLayerRef ObjLayer,const char * FileName,const char * TargetTriple)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
LLVMOrcCreateNewThreadSafeContext(void)771 LLVMOrcThreadSafeContextRef LLVMOrcCreateNewThreadSafeContext(void) {
772 return wrap(new ThreadSafeContext(std::make_unique<LLVMContext>()));
773 }
774
775 LLVMContextRef
LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx)776 LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx) {
777 return wrap(unwrap(TSCtx)->getContext());
778 }
779
LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx)780 void LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx) {
781 delete unwrap(TSCtx);
782 }
783
784 LLVMErrorRef
LLVMOrcThreadSafeModuleWithModuleDo(LLVMOrcThreadSafeModuleRef TSM,LLVMOrcGenericIRModuleOperationFunction F,void * Ctx)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
LLVMOrcCreateNewThreadSafeModule(LLVMModuleRef M,LLVMOrcThreadSafeContextRef TSCtx)793 LLVMOrcCreateNewThreadSafeModule(LLVMModuleRef M,
794 LLVMOrcThreadSafeContextRef TSCtx) {
795 return wrap(
796 new ThreadSafeModule(std::unique_ptr<Module>(unwrap(M)), *unwrap(TSCtx)));
797 }
798
LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM)799 void LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM) {
800 delete unwrap(TSM);
801 }
802
LLVMOrcJITTargetMachineBuilderDetectHost(LLVMOrcJITTargetMachineBuilderRef * Result)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
LLVMOrcJITTargetMachineBuilderCreateFromTargetMachine(LLVMTargetMachineRef TM)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
LLVMOrcDisposeJITTargetMachineBuilder(LLVMOrcJITTargetMachineBuilderRef JTMB)837 void LLVMOrcDisposeJITTargetMachineBuilder(
838 LLVMOrcJITTargetMachineBuilderRef JTMB) {
839 delete unwrap(JTMB);
840 }
841
LLVMOrcJITTargetMachineBuilderGetTargetTriple(LLVMOrcJITTargetMachineBuilderRef JTMB)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
LLVMOrcJITTargetMachineBuilderSetTargetTriple(LLVMOrcJITTargetMachineBuilderRef JTMB,const char * TargetTriple)850 void LLVMOrcJITTargetMachineBuilderSetTargetTriple(
851 LLVMOrcJITTargetMachineBuilderRef JTMB, const char *TargetTriple) {
852 unwrap(JTMB)->getTargetTriple() = Triple(TargetTriple);
853 }
854
LLVMOrcObjectLayerAddObjectFile(LLVMOrcObjectLayerRef ObjLayer,LLVMOrcJITDylibRef JD,LLVMMemoryBufferRef ObjBuffer)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
LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcObjectLayerRef ObjLayer,LLVMOrcResourceTrackerRef RT,LLVMMemoryBufferRef ObjBuffer)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
LLVMOrcObjectLayerEmit(LLVMOrcObjectLayerRef ObjLayer,LLVMOrcMaterializationResponsibilityRef R,LLVMMemoryBufferRef ObjBuffer)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
LLVMOrcDisposeObjectLayer(LLVMOrcObjectLayerRef ObjLayer)878 void LLVMOrcDisposeObjectLayer(LLVMOrcObjectLayerRef ObjLayer) {
879 delete unwrap(ObjLayer);
880 }
881
LLVMOrcIRTransformLayerSetTransform(LLVMOrcIRTransformLayerRef IRTransformLayer,LLVMOrcIRTransformLayerTransformFunction TransformFunction,void * Ctx)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
LLVMOrcObjectTransformLayerSetTransform(LLVMOrcObjectTransformLayerRef ObjTransformLayer,LLVMOrcObjectTransformLayerTransformFunction TransformFunction,void * Ctx)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
LLVMOrcCreateDumpObjects(const char * DumpDir,const char * IdentifierOverride)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
LLVMOrcDisposeDumpObjects(LLVMOrcDumpObjectsRef DumpObjects)924 void LLVMOrcDisposeDumpObjects(LLVMOrcDumpObjectsRef DumpObjects) {
925 delete unwrap(DumpObjects);
926 }
927
LLVMOrcDumpObjects_CallOperator(LLVMOrcDumpObjectsRef DumpObjects,LLVMMemoryBufferRef * ObjBuffer)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
LLVMOrcCreateLLJITBuilder(void)940 LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void) {
941 return wrap(new LLJITBuilder());
942 }
943
LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder)944 void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder) {
945 delete unwrap(Builder);
946 }
947
LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(LLVMOrcLLJITBuilderRef Builder,LLVMOrcJITTargetMachineBuilderRef JTMB)948 void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(
949 LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB) {
950 unwrap(Builder)->setJITTargetMachineBuilder(std::move(*unwrap(JTMB)));
951 LLVMOrcDisposeJITTargetMachineBuilder(JTMB);
952 }
953
LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator(LLVMOrcLLJITBuilderRef Builder,LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction F,void * Ctx)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
LLVMOrcCreateLLJIT(LLVMOrcLLJITRef * Result,LLVMOrcLLJITBuilderRef Builder)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
LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J)984 LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J) {
985 delete unwrap(J);
986 return LLVMErrorSuccess;
987 }
988
LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J)989 LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J) {
990 return wrap(&unwrap(J)->getExecutionSession());
991 }
992
LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J)993 LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J) {
994 return wrap(&unwrap(J)->getMainJITDylib());
995 }
996
LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J)997 const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J) {
998 return unwrap(J)->getTargetTriple().str().c_str();
999 }
1000
LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J)1001 char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J) {
1002 return unwrap(J)->getDataLayout().getGlobalPrefix();
1003 }
1004
1005 LLVMOrcSymbolStringPoolEntryRef
LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J,const char * UnmangledName)1006 LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J, const char *UnmangledName) {
1007 return wrap(OrcV2CAPIHelper::moveFromSymbolStringPtr(
1008 unwrap(J)->mangleAndIntern(UnmangledName)));
1009 }
1010
LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J,LLVMOrcJITDylibRef JD,LLVMMemoryBufferRef ObjBuffer)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
LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcLLJITRef J,LLVMOrcResourceTrackerRef RT,LLVMMemoryBufferRef ObjBuffer)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
LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J,LLVMOrcJITDylibRef JD,LLVMOrcThreadSafeModuleRef TSM)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
LLVMOrcLLJITAddLLVMIRModuleWithRT(LLVMOrcLLJITRef J,LLVMOrcResourceTrackerRef RT,LLVMOrcThreadSafeModuleRef TSM)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
LLVMOrcLLJITLookup(LLVMOrcLLJITRef J,LLVMOrcJITTargetAddress * Result,const char * Name)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
LLVMOrcLLJITGetObjLinkingLayer(LLVMOrcLLJITRef J)1055 LLVMOrcObjectLayerRef LLVMOrcLLJITGetObjLinkingLayer(LLVMOrcLLJITRef J) {
1056 return wrap(&unwrap(J)->getObjLinkingLayer());
1057 }
1058
1059 LLVMOrcObjectTransformLayerRef
LLVMOrcLLJITGetObjTransformLayer(LLVMOrcLLJITRef J)1060 LLVMOrcLLJITGetObjTransformLayer(LLVMOrcLLJITRef J) {
1061 return wrap(&unwrap(J)->getObjTransformLayer());
1062 }
1063
1064 LLVMOrcObjectLayerRef
LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager(LLVMOrcExecutionSessionRef ES)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
LLVMOrcCreateRTDyldObjectLinkingLayerWithMCJITMemoryManagerLikeCallbacks(LLVMOrcExecutionSessionRef ES,void * CreateContextCtx,LLVMMemoryManagerCreateContextCallback CreateContext,LLVMMemoryManagerNotifyTerminatingCallback NotifyTerminating,LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,LLVMMemoryManagerDestroyCallback Destroy)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
LLVMOrcRTDyldObjectLinkingLayerRegisterJITEventListener(LLVMOrcObjectLayerRef RTDyldObjLinkingLayer,LLVMJITEventListenerRef Listener)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
LLVMOrcLLJITGetIRTransformLayer(LLVMOrcLLJITRef J)1191 LLVMOrcIRTransformLayerRef LLVMOrcLLJITGetIRTransformLayer(LLVMOrcLLJITRef J) {
1192 return wrap(&unwrap(J)->getIRTransformLayer());
1193 }
1194
LLVMOrcLLJITGetDataLayoutStr(LLVMOrcLLJITRef J)1195 const char *LLVMOrcLLJITGetDataLayoutStr(LLVMOrcLLJITRef J) {
1196 return unwrap(J)->getDataLayout().getStringRepresentation().c_str();
1197 }
1198
1199 LLVMOrcIndirectStubsManagerRef
LLVMOrcCreateLocalIndirectStubsManager(const char * TargetTriple)1200 LLVMOrcCreateLocalIndirectStubsManager(const char *TargetTriple) {
1201 auto builder = createLocalIndirectStubsManagerBuilder(Triple(TargetTriple));
1202 return wrap(builder().release());
1203 }
1204
LLVMOrcDisposeIndirectStubsManager(LLVMOrcIndirectStubsManagerRef ISM)1205 void LLVMOrcDisposeIndirectStubsManager(LLVMOrcIndirectStubsManagerRef ISM) {
1206 std::unique_ptr<IndirectStubsManager> TmpISM(unwrap(ISM));
1207 }
1208
LLVMOrcCreateLocalLazyCallThroughManager(const char * TargetTriple,LLVMOrcExecutionSessionRef ES,LLVMOrcJITTargetAddress ErrorHandlerAddr,LLVMOrcLazyCallThroughManagerRef * Result)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
LLVMOrcDisposeLazyCallThroughManager(LLVMOrcLazyCallThroughManagerRef LCM)1222 void LLVMOrcDisposeLazyCallThroughManager(
1223 LLVMOrcLazyCallThroughManagerRef LCM) {
1224 std::unique_ptr<LazyCallThroughManager> TmpLCM(unwrap(LCM));
1225 }
1226