@@ -29,13 +29,22 @@ class OrcV2CAPIHelper {
29
29
using PoolEntry = SymbolStringPtr::PoolEntry;
30
30
using PoolEntryPtr = SymbolStringPtr::PoolEntryPtr;
31
31
32
- static PoolEntryPtr releaseSymbolStringPtr (SymbolStringPtr S) {
32
+ // Move from SymbolStringPtr to PoolEntryPtr (no change in ref count).
33
+ static PoolEntryPtr moveFromSymbolStringPtr (SymbolStringPtr S) {
33
34
PoolEntryPtr Result = nullptr ;
34
35
std::swap (Result, S.S );
35
36
return Result;
36
37
}
37
38
38
- static SymbolStringPtr retainSymbolStringPtr (PoolEntryPtr P) {
39
+ // Move from a PoolEntryPtr to a SymbolStringPtr (no change in ref count).
40
+ static SymbolStringPtr moveToSymbolStringPtr (PoolEntryPtr P) {
41
+ SymbolStringPtr S;
42
+ S.S = P;
43
+ return S;
44
+ }
45
+
46
+ // Copy a pool entry to a SymbolStringPtr (increments ref count).
47
+ static SymbolStringPtr copyToSymbolStringPtr (PoolEntryPtr P) {
39
48
return SymbolStringPtr (P);
40
49
}
41
50
@@ -71,6 +80,8 @@ DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcV2CAPIHelper::PoolEntry,
71
80
LLVMOrcSymbolStringPoolEntryRef)
72
81
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MaterializationUnit,
73
82
LLVMOrcMaterializationUnitRef)
83
+ DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MaterializationResponsibility,
84
+ LLVMOrcMaterializationResponsibilityRef)
74
85
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITDylib, LLVMOrcJITDylibRef)
75
86
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ResourceTracker, LLVMOrcResourceTrackerRef)
76
87
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DefinitionGenerator,
@@ -163,6 +174,66 @@ class CAPIDefinitionGenerator final : public DefinitionGenerator {
163
174
} // end namespace orc
164
175
} // end namespace llvm
165
176
177
+ namespace {
178
+
179
+ class OrcCAPIMaterializationUnit : public llvm ::orc::MaterializationUnit {
180
+ public:
181
+ OrcCAPIMaterializationUnit (
182
+ std::string Name, SymbolFlagsMap InitialSymbolFlags,
183
+ SymbolStringPtr InitSymbol, void *Ctx,
184
+ LLVMOrcMaterializationUnitMaterializeFunction Materialize,
185
+ LLVMOrcMaterializationUnitDiscardFunction Discard,
186
+ LLVMOrcMaterializationUnitDestroyFunction Destroy)
187
+ : llvm::orc::MaterializationUnit(std::move(InitialSymbolFlags),
188
+ std::move (InitSymbol)),
189
+ Name(std::move(Name)), Ctx(Ctx), Materialize(Materialize),
190
+ Discard(Discard), Destroy(Destroy) {}
191
+
192
+ ~OrcCAPIMaterializationUnit () {
193
+ if (Ctx)
194
+ Destroy (Ctx);
195
+ }
196
+
197
+ StringRef getName () const override { return Name; }
198
+
199
+ void materialize (std::unique_ptr<MaterializationResponsibility> R) override {
200
+ void *Tmp = Ctx;
201
+ Ctx = nullptr ;
202
+ Materialize (Tmp, wrap (R.release ()));
203
+ }
204
+
205
+ private:
206
+ void discard (const JITDylib &JD, const SymbolStringPtr &Name) override {
207
+ Discard (Ctx, wrap (&JD), wrap (OrcV2CAPIHelper::getRawPoolEntryPtr (Name)));
208
+ }
209
+
210
+ std::string Name;
211
+ void *Ctx = nullptr ;
212
+ LLVMOrcMaterializationUnitMaterializeFunction Materialize = nullptr ;
213
+ LLVMOrcMaterializationUnitDiscardFunction Discard = nullptr ;
214
+ LLVMOrcMaterializationUnitDestroyFunction Destroy = nullptr ;
215
+ };
216
+
217
+ static JITSymbolFlags toJITSymbolFlags (LLVMJITSymbolFlags F) {
218
+
219
+ JITSymbolFlags JSF;
220
+
221
+ if (F.GenericFlags & LLVMJITSymbolGenericFlagsExported)
222
+ JSF |= JITSymbolFlags::Exported;
223
+ if (F.GenericFlags & LLVMJITSymbolGenericFlagsWeak)
224
+ JSF |= JITSymbolFlags::Weak;
225
+ if (F.GenericFlags & LLVMJITSymbolGenericFlagsCallable)
226
+ JSF |= JITSymbolFlags::Callable;
227
+ if (F.GenericFlags & LLVMJITSymbolGenericFlagsMaterializationSideEffectsOnly)
228
+ JSF |= JITSymbolFlags::MaterializationSideEffectsOnly;
229
+
230
+ JSF.getTargetFlags () = F.TargetFlags ;
231
+
232
+ return JSF;
233
+ }
234
+
235
+ } // end anonymous namespace
236
+
166
237
void LLVMOrcExecutionSessionSetErrorReporter (
167
238
LLVMOrcExecutionSessionRef ES, LLVMOrcErrorReporterFunction ReportError,
168
239
void *Ctx) {
@@ -182,7 +253,7 @@ void LLVMOrcSymbolStringPoolClearDeadEntries(LLVMOrcSymbolStringPoolRef SSP) {
182
253
LLVMOrcSymbolStringPoolEntryRef
183
254
LLVMOrcExecutionSessionIntern (LLVMOrcExecutionSessionRef ES, const char *Name) {
184
255
return wrap (
185
- OrcV2CAPIHelper::releaseSymbolStringPtr (unwrap (ES)->intern (Name)));
256
+ OrcV2CAPIHelper::moveFromSymbolStringPtr (unwrap (ES)->intern (Name)));
186
257
}
187
258
188
259
void LLVMOrcRetainSymbolStringPoolEntry (LLVMOrcSymbolStringPoolEntryRef S) {
@@ -236,20 +307,29 @@ void LLVMOrcDisposeMaterializationUnit(LLVMOrcMaterializationUnitRef MU) {
236
307
std::unique_ptr<MaterializationUnit> TmpMU (unwrap (MU));
237
308
}
238
309
310
+ LLVMOrcMaterializationUnitRef LLVMOrcCreateCustomMaterializationUnit (
311
+ const char *Name, void *Ctx, LLVMOrcCSymbolFlagsMapPairs Syms,
312
+ size_t NumSyms, LLVMOrcSymbolStringPoolEntryRef InitSym,
313
+ LLVMOrcMaterializationUnitMaterializeFunction Materialize,
314
+ LLVMOrcMaterializationUnitDiscardFunction Discard,
315
+ LLVMOrcMaterializationUnitDestroyFunction Destroy) {
316
+ SymbolFlagsMap SFM;
317
+ for (size_t I = 0 ; I != NumSyms; ++I)
318
+ SFM[OrcV2CAPIHelper::moveToSymbolStringPtr (unwrap (Syms[I].Name ))] =
319
+ toJITSymbolFlags (Syms[I].Flags );
320
+
321
+ auto IS = OrcV2CAPIHelper::moveToSymbolStringPtr (unwrap (InitSym));
322
+
323
+ return wrap (new OrcCAPIMaterializationUnit (
324
+ Name, std::move (SFM), std::move (IS), Ctx, Materialize, Discard, Destroy));
325
+ }
326
+
239
327
LLVMOrcMaterializationUnitRef
240
328
LLVMOrcAbsoluteSymbols (LLVMOrcCSymbolMapPairs Syms, size_t NumPairs) {
241
329
SymbolMap SM;
242
330
for (size_t I = 0 ; I != NumPairs; ++I) {
243
- JITSymbolFlags Flags;
244
-
245
- if (Syms[I].Sym .Flags .GenericFlags & LLVMJITSymbolGenericFlagsExported)
246
- Flags |= JITSymbolFlags::Exported;
247
- if (Syms[I].Sym .Flags .GenericFlags & LLVMJITSymbolGenericFlagsWeak)
248
- Flags |= JITSymbolFlags::Weak;
249
-
250
- Flags.getTargetFlags () = Syms[I].Sym .Flags .TargetFlags ;
251
-
252
- SM[OrcV2CAPIHelper::retainSymbolStringPtr (unwrap (Syms[I].Name ))] =
331
+ JITSymbolFlags Flags = toJITSymbolFlags (Syms[I].Sym .Flags );
332
+ SM[OrcV2CAPIHelper::moveToSymbolStringPtr (unwrap (Syms[I].Name ))] =
253
333
JITEvaluatedSymbol (Syms[I].Sym .Address , Flags);
254
334
}
255
335
@@ -393,6 +473,14 @@ void LLVMOrcDisposeJITTargetMachineBuilder(
393
473
delete unwrap (JTMB);
394
474
}
395
475
476
+ void LLVMOrcObjectLayerEmit (LLVMOrcObjectLayerRef ObjLayer,
477
+ LLVMOrcMaterializationResponsibilityRef R,
478
+ LLVMMemoryBufferRef ObjBuffer) {
479
+ unwrap (ObjLayer)->emit (
480
+ std::unique_ptr<MaterializationResponsibility>(unwrap (R)),
481
+ std::unique_ptr<MemoryBuffer>(unwrap (ObjBuffer)));
482
+ }
483
+
396
484
void LLVMOrcDisposeObjectLayer (LLVMOrcObjectLayerRef ObjLayer) {
397
485
delete unwrap (ObjLayer);
398
486
}
@@ -463,7 +551,7 @@ char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J) {
463
551
464
552
LLVMOrcSymbolStringPoolEntryRef
465
553
LLVMOrcLLJITMangleAndIntern (LLVMOrcLLJITRef J, const char *UnmangledName) {
466
- return wrap (OrcV2CAPIHelper::releaseSymbolStringPtr (
554
+ return wrap (OrcV2CAPIHelper::moveFromSymbolStringPtr (
467
555
unwrap (J)->mangleAndIntern (UnmangledName)));
468
556
}
469
557
@@ -511,6 +599,10 @@ LLVMErrorRef LLVMOrcLLJITLookup(LLVMOrcLLJITRef J,
511
599
return LLVMErrorSuccess;
512
600
}
513
601
602
+ LLVMOrcObjectLayerRef LLVMOrcLLJITGetObjLinkingLayer (LLVMOrcLLJITRef J) {
603
+ return wrap (&unwrap (J)->getObjLinkingLayer ());
604
+ }
605
+
514
606
LLVMOrcObjectLayerRef
515
607
LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager (
516
608
LLVMOrcExecutionSessionRef ES) {
0 commit comments