1 //===--------------- OrcV2CBindings.cpp - C bindings OrcV2 APIs -----------===//
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
7 //===----------------------------------------------------------------------===//
9 #include "llvm-c/LLJIT.h"
10 #include "llvm-c/Orc.h"
11 #include "llvm-c/OrcEE.h"
12 #include "llvm-c/TargetMachine.h"
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"
21 using namespace llvm::orc
;
26 class InProgressLookupState
;
28 class OrcV2CAPIHelper
{
30 using PoolEntry
= SymbolStringPtr::PoolEntry
;
31 using PoolEntryPtr
= SymbolStringPtr::PoolEntryPtr
;
33 // Move from SymbolStringPtr to PoolEntryPtr (no change in ref count).
34 static PoolEntryPtr
moveFromSymbolStringPtr(SymbolStringPtr S
) {
35 PoolEntryPtr Result
= nullptr;
36 std::swap(Result
, S
.S
);
40 // Move from a PoolEntryPtr to a SymbolStringPtr (no change in ref count).
41 static SymbolStringPtr
moveToSymbolStringPtr(PoolEntryPtr P
) {
47 // Copy a pool entry to a SymbolStringPtr (increments ref count).
48 static SymbolStringPtr
copyToSymbolStringPtr(PoolEntryPtr P
) {
49 return SymbolStringPtr(P
);
52 static PoolEntryPtr
getRawPoolEntryPtr(const SymbolStringPtr
&S
) {
56 static void retainPoolEntry(PoolEntryPtr P
) {
61 static void releasePoolEntry(PoolEntryPtr P
) {
66 static InProgressLookupState
*extractLookupState(LookupState
&LS
) {
67 return LS
.IPLS
.release();
70 static void resetLookupState(LookupState
&LS
, InProgressLookupState
*IPLS
) {
71 return LS
.reset(IPLS
);
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
)
112 class CAPIDefinitionGenerator final
: public DefinitionGenerator
{
114 CAPIDefinitionGenerator(
116 LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate
)
117 : Ctx(Ctx
), TryToGenerate(TryToGenerate
) {}
119 Error
tryToGenerate(LookupState
&LS
, LookupKind K
, JITDylib
&JD
,
120 JITDylibLookupFlags JDLookupFlags
,
121 const SymbolLookupSet
&LookupSet
) override
{
123 // Take the lookup state.
124 LLVMOrcLookupStateRef LSR
= ::wrap(OrcV2CAPIHelper::extractLookupState(LS
));
126 // Translate the lookup kind.
127 LLVMOrcLookupKind CLookupKind
;
129 case LookupKind::Static
:
130 CLookupKind
= LLVMOrcLookupKindStatic
;
132 case LookupKind::DLSym
:
133 CLookupKind
= LLVMOrcLookupKindDLSym
;
137 // Translate the JITDylibSearchFlags.
138 LLVMOrcJITDylibLookupFlags CJDLookupFlags
;
139 switch (JDLookupFlags
) {
140 case JITDylibLookupFlags::MatchExportedSymbolsOnly
:
141 CJDLookupFlags
= LLVMOrcJITDylibLookupFlagsMatchExportedSymbolsOnly
;
143 case JITDylibLookupFlags::MatchAllSymbols
:
144 CJDLookupFlags
= LLVMOrcJITDylibLookupFlagsMatchAllSymbols
;
148 // Translate the lookup set.
149 std::vector
<LLVMOrcCLookupSetElement
> CLookupSet
;
150 CLookupSet
.reserve(LookupSet
.size());
151 for (auto &KV
: LookupSet
) {
152 LLVMOrcSymbolLookupFlags SLF
;
153 LLVMOrcSymbolStringPoolEntryRef Name
=
154 ::wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(KV
.first
));
156 case SymbolLookupFlags::RequiredSymbol
:
157 SLF
= LLVMOrcSymbolLookupFlagsRequiredSymbol
;
159 case SymbolLookupFlags::WeaklyReferencedSymbol
:
160 SLF
= LLVMOrcSymbolLookupFlagsWeaklyReferencedSymbol
;
163 CLookupSet
.push_back({Name
, SLF
});
166 // Run the C TryToGenerate function.
167 auto Err
= unwrap(TryToGenerate(::wrap(this), Ctx
, &LSR
, CLookupKind
,
168 ::wrap(&JD
), CJDLookupFlags
,
169 CLookupSet
.data(), CLookupSet
.size()));
171 // Restore the lookup state.
172 OrcV2CAPIHelper::resetLookupState(LS
, ::unwrap(LSR
));
179 LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate
;
182 } // end namespace orc
183 } // end namespace llvm
187 class OrcCAPIMaterializationUnit
: public llvm::orc::MaterializationUnit
{
189 OrcCAPIMaterializationUnit(
190 std::string Name
, SymbolFlagsMap InitialSymbolFlags
,
191 SymbolStringPtr InitSymbol
, void *Ctx
,
192 LLVMOrcMaterializationUnitMaterializeFunction Materialize
,
193 LLVMOrcMaterializationUnitDiscardFunction Discard
,
194 LLVMOrcMaterializationUnitDestroyFunction Destroy
)
195 : llvm::orc::MaterializationUnit(
196 Interface(std::move(InitialSymbolFlags
), std::move(InitSymbol
))),
197 Name(std::move(Name
)), Ctx(Ctx
), Materialize(Materialize
),
198 Discard(Discard
), Destroy(Destroy
) {}
200 ~OrcCAPIMaterializationUnit() {
205 StringRef
getName() const override
{ return Name
; }
207 void materialize(std::unique_ptr
<MaterializationResponsibility
> R
) override
{
210 Materialize(Tmp
, wrap(R
.release()));
214 void discard(const JITDylib
&JD
, const SymbolStringPtr
&Name
) override
{
215 Discard(Ctx
, wrap(&JD
), wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name
)));
220 LLVMOrcMaterializationUnitMaterializeFunction Materialize
= nullptr;
221 LLVMOrcMaterializationUnitDiscardFunction Discard
= nullptr;
222 LLVMOrcMaterializationUnitDestroyFunction Destroy
= nullptr;
225 static JITSymbolFlags
toJITSymbolFlags(LLVMJITSymbolFlags F
) {
229 if (F
.GenericFlags
& LLVMJITSymbolGenericFlagsExported
)
230 JSF
|= JITSymbolFlags::Exported
;
231 if (F
.GenericFlags
& LLVMJITSymbolGenericFlagsWeak
)
232 JSF
|= JITSymbolFlags::Weak
;
233 if (F
.GenericFlags
& LLVMJITSymbolGenericFlagsCallable
)
234 JSF
|= JITSymbolFlags::Callable
;
235 if (F
.GenericFlags
& LLVMJITSymbolGenericFlagsMaterializationSideEffectsOnly
)
236 JSF
|= JITSymbolFlags::MaterializationSideEffectsOnly
;
238 JSF
.getTargetFlags() = F
.TargetFlags
;
243 static LLVMJITSymbolFlags
fromJITSymbolFlags(JITSymbolFlags JSF
) {
244 LLVMJITSymbolFlags F
= {0, 0};
245 if (JSF
& JITSymbolFlags::Exported
)
246 F
.GenericFlags
|= LLVMJITSymbolGenericFlagsExported
;
247 if (JSF
& JITSymbolFlags::Weak
)
248 F
.GenericFlags
|= LLVMJITSymbolGenericFlagsWeak
;
249 if (JSF
& JITSymbolFlags::Callable
)
250 F
.GenericFlags
|= LLVMJITSymbolGenericFlagsCallable
;
251 if (JSF
& JITSymbolFlags::MaterializationSideEffectsOnly
)
252 F
.GenericFlags
|= LLVMJITSymbolGenericFlagsMaterializationSideEffectsOnly
;
254 F
.TargetFlags
= JSF
.getTargetFlags();
259 static SymbolMap
toSymbolMap(LLVMOrcCSymbolMapPairs Syms
, size_t NumPairs
) {
261 for (size_t I
= 0; I
!= NumPairs
; ++I
) {
262 JITSymbolFlags Flags
= toJITSymbolFlags(Syms
[I
].Sym
.Flags
);
263 SM
[OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Syms
[I
].Name
))] =
264 JITEvaluatedSymbol(Syms
[I
].Sym
.Address
, Flags
);
269 static SymbolDependenceMap
270 toSymbolDependenceMap(LLVMOrcCDependenceMapPairs Pairs
, size_t NumPairs
) {
271 SymbolDependenceMap SDM
;
272 for (size_t I
= 0; I
!= NumPairs
; ++I
) {
273 JITDylib
*JD
= unwrap(Pairs
[I
].JD
);
276 for (size_t J
= 0; J
!= Pairs
[I
].Names
.Length
; ++J
) {
277 auto Sym
= Pairs
[I
].Names
.Symbols
[J
];
278 Names
.insert(OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Sym
)));
285 } // end anonymous namespace
287 void LLVMOrcExecutionSessionSetErrorReporter(
288 LLVMOrcExecutionSessionRef ES
, LLVMOrcErrorReporterFunction ReportError
,
290 unwrap(ES
)->setErrorReporter(
291 [=](Error Err
) { ReportError(Ctx
, wrap(std::move(Err
))); });
294 LLVMOrcSymbolStringPoolRef
295 LLVMOrcExecutionSessionGetSymbolStringPool(LLVMOrcExecutionSessionRef ES
) {
297 unwrap(ES
)->getExecutorProcessControl().getSymbolStringPool().get());
300 void LLVMOrcSymbolStringPoolClearDeadEntries(LLVMOrcSymbolStringPoolRef SSP
) {
301 unwrap(SSP
)->clearDeadEntries();
304 LLVMOrcSymbolStringPoolEntryRef
305 LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES
, const char *Name
) {
307 OrcV2CAPIHelper::moveFromSymbolStringPtr(unwrap(ES
)->intern(Name
)));
310 void LLVMOrcRetainSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S
) {
311 OrcV2CAPIHelper::retainPoolEntry(unwrap(S
));
314 void LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S
) {
315 OrcV2CAPIHelper::releasePoolEntry(unwrap(S
));
318 const char *LLVMOrcSymbolStringPoolEntryStr(LLVMOrcSymbolStringPoolEntryRef S
) {
319 return unwrap(S
)->getKey().data();
322 LLVMOrcResourceTrackerRef
323 LLVMOrcJITDylibCreateResourceTracker(LLVMOrcJITDylibRef JD
) {
324 auto RT
= unwrap(JD
)->createResourceTracker();
325 // Retain the pointer for the C API client.
327 return wrap(RT
.get());
330 LLVMOrcResourceTrackerRef
331 LLVMOrcJITDylibGetDefaultResourceTracker(LLVMOrcJITDylibRef JD
) {
332 auto RT
= unwrap(JD
)->getDefaultResourceTracker();
333 // Retain the pointer for the C API client.
334 return wrap(RT
.get());
337 void LLVMOrcReleaseResourceTracker(LLVMOrcResourceTrackerRef RT
) {
338 ResourceTrackerSP
TmpRT(unwrap(RT
));
342 void LLVMOrcResourceTrackerTransferTo(LLVMOrcResourceTrackerRef SrcRT
,
343 LLVMOrcResourceTrackerRef DstRT
) {
344 ResourceTrackerSP
TmpRT(unwrap(SrcRT
));
345 TmpRT
->transferTo(*unwrap(DstRT
));
348 LLVMErrorRef
LLVMOrcResourceTrackerRemove(LLVMOrcResourceTrackerRef RT
) {
349 ResourceTrackerSP
TmpRT(unwrap(RT
));
350 return wrap(TmpRT
->remove());
353 void LLVMOrcDisposeDefinitionGenerator(LLVMOrcDefinitionGeneratorRef DG
) {
354 std::unique_ptr
<DefinitionGenerator
> TmpDG(unwrap(DG
));
357 void LLVMOrcDisposeMaterializationUnit(LLVMOrcMaterializationUnitRef MU
) {
358 std::unique_ptr
<MaterializationUnit
> TmpMU(unwrap(MU
));
361 LLVMOrcMaterializationUnitRef
LLVMOrcCreateCustomMaterializationUnit(
362 const char *Name
, void *Ctx
, LLVMOrcCSymbolFlagsMapPairs Syms
,
363 size_t NumSyms
, LLVMOrcSymbolStringPoolEntryRef InitSym
,
364 LLVMOrcMaterializationUnitMaterializeFunction Materialize
,
365 LLVMOrcMaterializationUnitDiscardFunction Discard
,
366 LLVMOrcMaterializationUnitDestroyFunction Destroy
) {
368 for (size_t I
= 0; I
!= NumSyms
; ++I
)
369 SFM
[OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Syms
[I
].Name
))] =
370 toJITSymbolFlags(Syms
[I
].Flags
);
372 auto IS
= OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(InitSym
));
374 return wrap(new OrcCAPIMaterializationUnit(
375 Name
, std::move(SFM
), std::move(IS
), Ctx
, Materialize
, Discard
, Destroy
));
378 LLVMOrcMaterializationUnitRef
379 LLVMOrcAbsoluteSymbols(LLVMOrcCSymbolMapPairs Syms
, size_t NumPairs
) {
380 SymbolMap SM
= toSymbolMap(Syms
, NumPairs
);
381 return wrap(absoluteSymbols(std::move(SM
)).release());
384 LLVMOrcMaterializationUnitRef
LLVMOrcLazyReexports(
385 LLVMOrcLazyCallThroughManagerRef LCTM
, LLVMOrcIndirectStubsManagerRef ISM
,
386 LLVMOrcJITDylibRef SourceJD
, LLVMOrcCSymbolAliasMapPairs CallableAliases
,
390 for (size_t I
= 0; I
!= NumPairs
; ++I
) {
391 auto pair
= CallableAliases
[I
];
392 JITSymbolFlags Flags
= toJITSymbolFlags(pair
.Entry
.Flags
);
393 SymbolStringPtr Name
=
394 OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(pair
.Entry
.Name
));
395 SAM
[OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(pair
.Name
))] =
396 SymbolAliasMapEntry(Name
, Flags
);
399 return wrap(lazyReexports(*unwrap(LCTM
), *unwrap(ISM
), *unwrap(SourceJD
),
404 void LLVMOrcDisposeMaterializationResponsibility(
405 LLVMOrcMaterializationResponsibilityRef MR
) {
406 std::unique_ptr
<MaterializationResponsibility
> TmpMR(unwrap(MR
));
409 LLVMOrcJITDylibRef
LLVMOrcMaterializationResponsibilityGetTargetDylib(
410 LLVMOrcMaterializationResponsibilityRef MR
) {
411 return wrap(&unwrap(MR
)->getTargetJITDylib());
414 LLVMOrcExecutionSessionRef
415 LLVMOrcMaterializationResponsibilityGetExecutionSession(
416 LLVMOrcMaterializationResponsibilityRef MR
) {
417 return wrap(&unwrap(MR
)->getExecutionSession());
420 LLVMOrcCSymbolFlagsMapPairs
LLVMOrcMaterializationResponsibilityGetSymbols(
421 LLVMOrcMaterializationResponsibilityRef MR
, size_t *NumPairs
) {
423 auto Symbols
= unwrap(MR
)->getSymbols();
424 LLVMOrcCSymbolFlagsMapPairs Result
= static_cast<LLVMOrcCSymbolFlagsMapPairs
>(
425 safe_malloc(Symbols
.size() * sizeof(LLVMOrcCSymbolFlagsMapPair
)));
427 for (auto const &pair
: Symbols
) {
428 auto Name
= wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(pair
.first
));
429 auto Flags
= pair
.second
;
430 Result
[I
] = {Name
, fromJITSymbolFlags(Flags
)};
433 *NumPairs
= Symbols
.size();
437 void LLVMOrcDisposeCSymbolFlagsMap(LLVMOrcCSymbolFlagsMapPairs Pairs
) {
441 LLVMOrcSymbolStringPoolEntryRef
442 LLVMOrcMaterializationResponsibilityGetInitializerSymbol(
443 LLVMOrcMaterializationResponsibilityRef MR
) {
444 auto Sym
= unwrap(MR
)->getInitializerSymbol();
445 return wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Sym
));
448 LLVMOrcSymbolStringPoolEntryRef
*
449 LLVMOrcMaterializationResponsibilityGetRequestedSymbols(
450 LLVMOrcMaterializationResponsibilityRef MR
, size_t *NumSymbols
) {
452 auto Symbols
= unwrap(MR
)->getRequestedSymbols();
453 LLVMOrcSymbolStringPoolEntryRef
*Result
=
454 static_cast<LLVMOrcSymbolStringPoolEntryRef
*>(safe_malloc(
455 Symbols
.size() * sizeof(LLVMOrcSymbolStringPoolEntryRef
)));
457 for (auto &Name
: Symbols
) {
458 Result
[I
] = wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name
));
461 *NumSymbols
= Symbols
.size();
465 void LLVMOrcDisposeSymbols(LLVMOrcSymbolStringPoolEntryRef
*Symbols
) {
469 LLVMErrorRef
LLVMOrcMaterializationResponsibilityNotifyResolved(
470 LLVMOrcMaterializationResponsibilityRef MR
, LLVMOrcCSymbolMapPairs Symbols
,
472 SymbolMap SM
= toSymbolMap(Symbols
, NumPairs
);
473 return wrap(unwrap(MR
)->notifyResolved(std::move(SM
)));
476 LLVMErrorRef
LLVMOrcMaterializationResponsibilityNotifyEmitted(
477 LLVMOrcMaterializationResponsibilityRef MR
) {
478 return wrap(unwrap(MR
)->notifyEmitted());
481 LLVMErrorRef
LLVMOrcMaterializationResponsibilityDefineMaterializing(
482 LLVMOrcMaterializationResponsibilityRef MR
,
483 LLVMOrcCSymbolFlagsMapPairs Syms
, size_t NumSyms
) {
485 for (size_t I
= 0; I
!= NumSyms
; ++I
)
486 SFM
[OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Syms
[I
].Name
))] =
487 toJITSymbolFlags(Syms
[I
].Flags
);
489 return wrap(unwrap(MR
)->defineMaterializing(std::move(SFM
)));
492 LLVMErrorRef
LLVMOrcMaterializationResponsibilityReplace(
493 LLVMOrcMaterializationResponsibilityRef MR
,
494 LLVMOrcMaterializationUnitRef MU
) {
495 std::unique_ptr
<MaterializationUnit
> TmpMU(unwrap(MU
));
496 return wrap(unwrap(MR
)->replace(std::move(TmpMU
)));
499 LLVMErrorRef
LLVMOrcMaterializationResponsibilityDelegate(
500 LLVMOrcMaterializationResponsibilityRef MR
,
501 LLVMOrcSymbolStringPoolEntryRef
*Symbols
, size_t NumSymbols
,
502 LLVMOrcMaterializationResponsibilityRef
*Result
) {
504 for (size_t I
= 0; I
!= NumSymbols
; I
++) {
505 Syms
.insert(OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Symbols
[I
])));
507 auto OtherMR
= unwrap(MR
)->delegate(Syms
);
510 return wrap(OtherMR
.takeError());
512 *Result
= wrap(OtherMR
->release());
513 return LLVMErrorSuccess
;
516 void LLVMOrcMaterializationResponsibilityAddDependencies(
517 LLVMOrcMaterializationResponsibilityRef MR
,
518 LLVMOrcSymbolStringPoolEntryRef Name
,
519 LLVMOrcCDependenceMapPairs Dependencies
, size_t NumPairs
) {
521 SymbolDependenceMap SDM
= toSymbolDependenceMap(Dependencies
, NumPairs
);
522 auto Sym
= OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Name
));
523 unwrap(MR
)->addDependencies(Sym
, SDM
);
526 void LLVMOrcMaterializationResponsibilityAddDependenciesForAll(
527 LLVMOrcMaterializationResponsibilityRef MR
,
528 LLVMOrcCDependenceMapPairs Dependencies
, size_t NumPairs
) {
530 SymbolDependenceMap SDM
= toSymbolDependenceMap(Dependencies
, NumPairs
);
531 unwrap(MR
)->addDependenciesForAll(SDM
);
534 void LLVMOrcMaterializationResponsibilityFailMaterialization(
535 LLVMOrcMaterializationResponsibilityRef MR
) {
536 unwrap(MR
)->failMaterialization();
539 void LLVMOrcIRTransformLayerEmit(LLVMOrcIRTransformLayerRef IRLayer
,
540 LLVMOrcMaterializationResponsibilityRef MR
,
541 LLVMOrcThreadSafeModuleRef TSM
) {
542 std::unique_ptr
<ThreadSafeModule
> TmpTSM(unwrap(TSM
));
543 unwrap(IRLayer
)->emit(
544 std::unique_ptr
<MaterializationResponsibility
>(unwrap(MR
)),
549 LLVMOrcExecutionSessionCreateBareJITDylib(LLVMOrcExecutionSessionRef ES
,
551 return wrap(&unwrap(ES
)->createBareJITDylib(Name
));
555 LLVMOrcExecutionSessionCreateJITDylib(LLVMOrcExecutionSessionRef ES
,
556 LLVMOrcJITDylibRef
*Result
,
558 auto JD
= unwrap(ES
)->createJITDylib(Name
);
560 return wrap(JD
.takeError());
561 *Result
= wrap(&*JD
);
562 return LLVMErrorSuccess
;
566 LLVMOrcExecutionSessionGetJITDylibByName(LLVMOrcExecutionSessionRef ES
,
568 return wrap(unwrap(ES
)->getJITDylibByName(Name
));
571 LLVMErrorRef
LLVMOrcJITDylibDefine(LLVMOrcJITDylibRef JD
,
572 LLVMOrcMaterializationUnitRef MU
) {
573 std::unique_ptr
<MaterializationUnit
> TmpMU(unwrap(MU
));
575 if (auto Err
= unwrap(JD
)->define(TmpMU
)) {
577 return wrap(std::move(Err
));
579 return LLVMErrorSuccess
;
582 LLVMErrorRef
LLVMOrcJITDylibClear(LLVMOrcJITDylibRef JD
) {
583 return wrap(unwrap(JD
)->clear());
586 void LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD
,
587 LLVMOrcDefinitionGeneratorRef DG
) {
588 unwrap(JD
)->addGenerator(std::unique_ptr
<DefinitionGenerator
>(unwrap(DG
)));
591 LLVMOrcDefinitionGeneratorRef
LLVMOrcCreateCustomCAPIDefinitionGenerator(
592 LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction F
, void *Ctx
) {
593 auto DG
= std::make_unique
<CAPIDefinitionGenerator
>(Ctx
, F
);
594 return wrap(DG
.release());
597 LLVMErrorRef
LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess(
598 LLVMOrcDefinitionGeneratorRef
*Result
, char GlobalPrefix
,
599 LLVMOrcSymbolPredicate Filter
, void *FilterCtx
) {
600 assert(Result
&& "Result can not be null");
601 assert((Filter
|| !FilterCtx
) &&
602 "if Filter is null then FilterCtx must also be null");
604 DynamicLibrarySearchGenerator::SymbolPredicate Pred
;
606 Pred
= [=](const SymbolStringPtr
&Name
) -> bool {
607 return Filter(FilterCtx
, wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name
)));
610 auto ProcessSymsGenerator
=
611 DynamicLibrarySearchGenerator::GetForCurrentProcess(GlobalPrefix
, Pred
);
613 if (!ProcessSymsGenerator
) {
615 return wrap(ProcessSymsGenerator
.takeError());
618 *Result
= wrap(ProcessSymsGenerator
->release());
619 return LLVMErrorSuccess
;
622 LLVMErrorRef
LLVMOrcCreateDynamicLibrarySearchGeneratorForPath(
623 LLVMOrcDefinitionGeneratorRef
*Result
, const char *FileName
,
624 char GlobalPrefix
, LLVMOrcSymbolPredicate Filter
, void *FilterCtx
) {
625 assert(Result
&& "Result can not be null");
626 assert(FileName
&& "FileName can not be null");
627 assert((Filter
|| !FilterCtx
) &&
628 "if Filter is null then FilterCtx must also be null");
630 DynamicLibrarySearchGenerator::SymbolPredicate Pred
;
632 Pred
= [=](const SymbolStringPtr
&Name
) -> bool {
633 return Filter(FilterCtx
, wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name
)));
636 auto LibrarySymsGenerator
=
637 DynamicLibrarySearchGenerator::Load(FileName
, GlobalPrefix
, Pred
);
639 if (!LibrarySymsGenerator
) {
641 return wrap(LibrarySymsGenerator
.takeError());
644 *Result
= wrap(LibrarySymsGenerator
->release());
645 return LLVMErrorSuccess
;
648 LLVMErrorRef
LLVMOrcCreateStaticLibrarySearchGeneratorForPath(
649 LLVMOrcDefinitionGeneratorRef
*Result
, LLVMOrcObjectLayerRef ObjLayer
,
650 const char *FileName
, const char *TargetTriple
) {
651 assert(Result
&& "Result can not be null");
652 assert(FileName
&& "Filename can not be null");
653 assert(ObjLayer
&& "ObjectLayer can not be null");
656 auto TT
= Triple(TargetTriple
);
657 auto LibrarySymsGenerator
=
658 StaticLibraryDefinitionGenerator::Load(*unwrap(ObjLayer
), FileName
, TT
);
659 if (!LibrarySymsGenerator
) {
661 return wrap(LibrarySymsGenerator
.takeError());
663 *Result
= wrap(LibrarySymsGenerator
->release());
664 return LLVMErrorSuccess
;
666 auto LibrarySymsGenerator
=
667 StaticLibraryDefinitionGenerator::Load(*unwrap(ObjLayer
), FileName
);
668 if (!LibrarySymsGenerator
) {
670 return wrap(LibrarySymsGenerator
.takeError());
672 *Result
= wrap(LibrarySymsGenerator
->release());
673 return LLVMErrorSuccess
;
677 LLVMOrcThreadSafeContextRef
LLVMOrcCreateNewThreadSafeContext(void) {
678 return wrap(new ThreadSafeContext(std::make_unique
<LLVMContext
>()));
682 LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx
) {
683 return wrap(unwrap(TSCtx
)->getContext());
686 void LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx
) {
687 delete unwrap(TSCtx
);
691 LLVMOrcThreadSafeModuleWithModuleDo(LLVMOrcThreadSafeModuleRef TSM
,
692 LLVMOrcGenericIRModuleOperationFunction F
,
694 return wrap(unwrap(TSM
)->withModuleDo(
695 [&](Module
&M
) { return unwrap(F(Ctx
, wrap(&M
))); }));
698 LLVMOrcThreadSafeModuleRef
699 LLVMOrcCreateNewThreadSafeModule(LLVMModuleRef M
,
700 LLVMOrcThreadSafeContextRef TSCtx
) {
702 new ThreadSafeModule(std::unique_ptr
<Module
>(unwrap(M
)), *unwrap(TSCtx
)));
705 void LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM
) {
709 LLVMErrorRef
LLVMOrcJITTargetMachineBuilderDetectHost(
710 LLVMOrcJITTargetMachineBuilderRef
*Result
) {
711 assert(Result
&& "Result can not be null");
713 auto JTMB
= JITTargetMachineBuilder::detectHost();
716 return wrap(JTMB
.takeError());
719 *Result
= wrap(new JITTargetMachineBuilder(std::move(*JTMB
)));
720 return LLVMErrorSuccess
;
723 LLVMOrcJITTargetMachineBuilderRef
724 LLVMOrcJITTargetMachineBuilderCreateFromTargetMachine(LLVMTargetMachineRef TM
) {
725 auto *TemplateTM
= unwrap(TM
);
728 std::make_unique
<JITTargetMachineBuilder
>(TemplateTM
->getTargetTriple());
731 .setCPU(TemplateTM
->getTargetCPU().str())
732 .setRelocationModel(TemplateTM
->getRelocationModel())
733 .setCodeModel(TemplateTM
->getCodeModel())
734 .setCodeGenOptLevel(TemplateTM
->getOptLevel())
735 .setFeatures(TemplateTM
->getTargetFeatureString())
736 .setOptions(TemplateTM
->Options
);
738 LLVMDisposeTargetMachine(TM
);
740 return wrap(JTMB
.release());
743 void LLVMOrcDisposeJITTargetMachineBuilder(
744 LLVMOrcJITTargetMachineBuilderRef JTMB
) {
748 char *LLVMOrcJITTargetMachineBuilderGetTargetTriple(
749 LLVMOrcJITTargetMachineBuilderRef JTMB
) {
750 auto Tmp
= unwrap(JTMB
)->getTargetTriple().str();
751 char *TargetTriple
= (char *)malloc(Tmp
.size() + 1);
752 strcpy(TargetTriple
, Tmp
.c_str());
756 void LLVMOrcJITTargetMachineBuilderSetTargetTriple(
757 LLVMOrcJITTargetMachineBuilderRef JTMB
, const char *TargetTriple
) {
758 unwrap(JTMB
)->getTargetTriple() = Triple(TargetTriple
);
761 LLVMErrorRef
LLVMOrcObjectLayerAddObjectFile(LLVMOrcObjectLayerRef ObjLayer
,
762 LLVMOrcJITDylibRef JD
,
763 LLVMMemoryBufferRef ObjBuffer
) {
764 return wrap(unwrap(ObjLayer
)->add(
765 *unwrap(JD
), std::unique_ptr
<MemoryBuffer
>(unwrap(ObjBuffer
))));
768 LLVMErrorRef
LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcObjectLayerRef ObjLayer
,
769 LLVMOrcResourceTrackerRef RT
,
770 LLVMMemoryBufferRef ObjBuffer
) {
772 unwrap(ObjLayer
)->add(ResourceTrackerSP(unwrap(RT
)),
773 std::unique_ptr
<MemoryBuffer
>(unwrap(ObjBuffer
))));
776 void LLVMOrcObjectLayerEmit(LLVMOrcObjectLayerRef ObjLayer
,
777 LLVMOrcMaterializationResponsibilityRef R
,
778 LLVMMemoryBufferRef ObjBuffer
) {
779 unwrap(ObjLayer
)->emit(
780 std::unique_ptr
<MaterializationResponsibility
>(unwrap(R
)),
781 std::unique_ptr
<MemoryBuffer
>(unwrap(ObjBuffer
)));
784 void LLVMOrcDisposeObjectLayer(LLVMOrcObjectLayerRef ObjLayer
) {
785 delete unwrap(ObjLayer
);
788 void LLVMOrcIRTransformLayerSetTransform(
789 LLVMOrcIRTransformLayerRef IRTransformLayer
,
790 LLVMOrcIRTransformLayerTransformFunction TransformFunction
, void *Ctx
) {
791 unwrap(IRTransformLayer
)
793 [=](ThreadSafeModule TSM
,
794 MaterializationResponsibility
&R
) -> Expected
<ThreadSafeModule
> {
795 LLVMOrcThreadSafeModuleRef TSMRef
=
796 wrap(new ThreadSafeModule(std::move(TSM
)));
797 if (LLVMErrorRef Err
= TransformFunction(Ctx
, &TSMRef
, wrap(&R
))) {
798 assert(!TSMRef
&& "TSMRef was not reset to null on error");
801 return std::move(*unwrap(TSMRef
));
805 void LLVMOrcObjectTransformLayerSetTransform(
806 LLVMOrcObjectTransformLayerRef ObjTransformLayer
,
807 LLVMOrcObjectTransformLayerTransformFunction TransformFunction
, void *Ctx
) {
808 unwrap(ObjTransformLayer
)
809 ->setTransform([TransformFunction
, Ctx
](std::unique_ptr
<MemoryBuffer
> Obj
)
810 -> Expected
<std::unique_ptr
<MemoryBuffer
>> {
811 LLVMMemoryBufferRef ObjBuffer
= wrap(Obj
.release());
812 if (LLVMErrorRef Err
= TransformFunction(Ctx
, &ObjBuffer
)) {
813 assert(!ObjBuffer
&& "ObjBuffer was not reset to null on error");
816 return std::unique_ptr
<MemoryBuffer
>(unwrap(ObjBuffer
));
820 LLVMOrcDumpObjectsRef
LLVMOrcCreateDumpObjects(const char *DumpDir
,
821 const char *IdentifierOverride
) {
822 assert(DumpDir
&& "DumpDir should not be null");
823 assert(IdentifierOverride
&& "IdentifierOverride should not be null");
824 return wrap(new DumpObjects(DumpDir
, IdentifierOverride
));
827 void LLVMOrcDisposeDumpObjects(LLVMOrcDumpObjectsRef DumpObjects
) {
828 delete unwrap(DumpObjects
);
831 LLVMErrorRef
LLVMOrcDumpObjects_CallOperator(LLVMOrcDumpObjectsRef DumpObjects
,
832 LLVMMemoryBufferRef
*ObjBuffer
) {
833 std::unique_ptr
<MemoryBuffer
> OB(unwrap(*ObjBuffer
));
834 if (auto Result
= (*unwrap(DumpObjects
))(std::move(OB
))) {
835 *ObjBuffer
= wrap(Result
->release());
836 return LLVMErrorSuccess
;
838 *ObjBuffer
= nullptr;
839 return wrap(Result
.takeError());
843 LLVMOrcLLJITBuilderRef
LLVMOrcCreateLLJITBuilder(void) {
844 return wrap(new LLJITBuilder());
847 void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder
) {
848 delete unwrap(Builder
);
851 void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(
852 LLVMOrcLLJITBuilderRef Builder
, LLVMOrcJITTargetMachineBuilderRef JTMB
) {
853 unwrap(Builder
)->setJITTargetMachineBuilder(std::move(*unwrap(JTMB
)));
854 LLVMOrcDisposeJITTargetMachineBuilder(JTMB
);
857 void LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator(
858 LLVMOrcLLJITBuilderRef Builder
,
859 LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction F
, void *Ctx
) {
860 unwrap(Builder
)->setObjectLinkingLayerCreator(
861 [=](ExecutionSession
&ES
, const Triple
&TT
) {
862 auto TTStr
= TT
.str();
863 return std::unique_ptr
<ObjectLayer
>(
864 unwrap(F(Ctx
, wrap(&ES
), TTStr
.c_str())));
868 LLVMErrorRef
LLVMOrcCreateLLJIT(LLVMOrcLLJITRef
*Result
,
869 LLVMOrcLLJITBuilderRef Builder
) {
870 assert(Result
&& "Result can not be null");
873 Builder
= LLVMOrcCreateLLJITBuilder();
875 auto J
= unwrap(Builder
)->create();
876 LLVMOrcDisposeLLJITBuilder(Builder
);
880 return wrap(J
.takeError());
883 *Result
= wrap(J
->release());
884 return LLVMErrorSuccess
;
887 LLVMErrorRef
LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J
) {
889 return LLVMErrorSuccess
;
892 LLVMOrcExecutionSessionRef
LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J
) {
893 return wrap(&unwrap(J
)->getExecutionSession());
896 LLVMOrcJITDylibRef
LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J
) {
897 return wrap(&unwrap(J
)->getMainJITDylib());
900 const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J
) {
901 return unwrap(J
)->getTargetTriple().str().c_str();
904 char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J
) {
905 return unwrap(J
)->getDataLayout().getGlobalPrefix();
908 LLVMOrcSymbolStringPoolEntryRef
909 LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J
, const char *UnmangledName
) {
910 return wrap(OrcV2CAPIHelper::moveFromSymbolStringPtr(
911 unwrap(J
)->mangleAndIntern(UnmangledName
)));
914 LLVMErrorRef
LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J
, LLVMOrcJITDylibRef JD
,
915 LLVMMemoryBufferRef ObjBuffer
) {
916 return wrap(unwrap(J
)->addObjectFile(
917 *unwrap(JD
), std::unique_ptr
<MemoryBuffer
>(unwrap(ObjBuffer
))));
920 LLVMErrorRef
LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcLLJITRef J
,
921 LLVMOrcResourceTrackerRef RT
,
922 LLVMMemoryBufferRef ObjBuffer
) {
923 return wrap(unwrap(J
)->addObjectFile(
924 ResourceTrackerSP(unwrap(RT
)),
925 std::unique_ptr
<MemoryBuffer
>(unwrap(ObjBuffer
))));
928 LLVMErrorRef
LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J
,
929 LLVMOrcJITDylibRef JD
,
930 LLVMOrcThreadSafeModuleRef TSM
) {
931 std::unique_ptr
<ThreadSafeModule
> TmpTSM(unwrap(TSM
));
932 return wrap(unwrap(J
)->addIRModule(*unwrap(JD
), std::move(*TmpTSM
)));
935 LLVMErrorRef
LLVMOrcLLJITAddLLVMIRModuleWithRT(LLVMOrcLLJITRef J
,
936 LLVMOrcResourceTrackerRef RT
,
937 LLVMOrcThreadSafeModuleRef TSM
) {
938 std::unique_ptr
<ThreadSafeModule
> TmpTSM(unwrap(TSM
));
939 return wrap(unwrap(J
)->addIRModule(ResourceTrackerSP(unwrap(RT
)),
940 std::move(*TmpTSM
)));
943 LLVMErrorRef
LLVMOrcLLJITLookup(LLVMOrcLLJITRef J
,
944 LLVMOrcJITTargetAddress
*Result
,
946 assert(Result
&& "Result can not be null");
948 auto Sym
= unwrap(J
)->lookup(Name
);
951 return wrap(Sym
.takeError());
954 *Result
= Sym
->getAddress();
955 return LLVMErrorSuccess
;
958 LLVMOrcObjectLayerRef
LLVMOrcLLJITGetObjLinkingLayer(LLVMOrcLLJITRef J
) {
959 return wrap(&unwrap(J
)->getObjLinkingLayer());
962 LLVMOrcObjectTransformLayerRef
963 LLVMOrcLLJITGetObjTransformLayer(LLVMOrcLLJITRef J
) {
964 return wrap(&unwrap(J
)->getObjTransformLayer());
967 LLVMOrcObjectLayerRef
968 LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager(
969 LLVMOrcExecutionSessionRef ES
) {
970 assert(ES
&& "ES must not be null");
971 return wrap(new RTDyldObjectLinkingLayer(
972 *unwrap(ES
), [] { return std::make_unique
<SectionMemoryManager
>(); }));
975 void LLVMOrcRTDyldObjectLinkingLayerRegisterJITEventListener(
976 LLVMOrcObjectLayerRef RTDyldObjLinkingLayer
,
977 LLVMJITEventListenerRef Listener
) {
978 assert(RTDyldObjLinkingLayer
&& "RTDyldObjLinkingLayer must not be null");
979 assert(Listener
&& "Listener must not be null");
980 reinterpret_cast<RTDyldObjectLinkingLayer
*>(unwrap(RTDyldObjLinkingLayer
))
981 ->registerJITEventListener(*unwrap(Listener
));
984 LLVMOrcIRTransformLayerRef
LLVMOrcLLJITGetIRTransformLayer(LLVMOrcLLJITRef J
) {
985 return wrap(&unwrap(J
)->getIRTransformLayer());
988 const char *LLVMOrcLLJITGetDataLayoutStr(LLVMOrcLLJITRef J
) {
989 return unwrap(J
)->getDataLayout().getStringRepresentation().c_str();
992 LLVMOrcIndirectStubsManagerRef
993 LLVMOrcCreateLocalIndirectStubsManager(const char *TargetTriple
) {
994 auto builder
= createLocalIndirectStubsManagerBuilder(Triple(TargetTriple
));
995 return wrap(builder().release());
998 void LLVMOrcDisposeIndirectStubsManager(LLVMOrcIndirectStubsManagerRef ISM
) {
999 std::unique_ptr
<IndirectStubsManager
> TmpISM(unwrap(ISM
));
1002 LLVMErrorRef
LLVMOrcCreateLocalLazyCallThroughManager(
1003 const char *TargetTriple
, LLVMOrcExecutionSessionRef ES
,
1004 LLVMOrcJITTargetAddress ErrorHandlerAddr
,
1005 LLVMOrcLazyCallThroughManagerRef
*Result
) {
1006 auto LCTM
= createLocalLazyCallThroughManager(Triple(TargetTriple
),
1007 *unwrap(ES
), ErrorHandlerAddr
);
1010 return wrap(LCTM
.takeError());
1011 *Result
= wrap(LCTM
->release());
1012 return LLVMErrorSuccess
;
1015 void LLVMOrcDisposeLazyCallThroughManager(
1016 LLVMOrcLazyCallThroughManagerRef LCM
) {
1017 std::unique_ptr
<LazyCallThroughManager
> TmpLCM(unwrap(LCM
));