@@ -168,7 +168,15 @@ class PrintMetadataSource
168
168
}
169
169
};
170
170
171
- llvm::Constant *IRGenModule::getTypeRef (CanType type, MangledTypeRefRole role) {
171
+ llvm::Constant *IRGenModule::getTypeRef (Type type,
172
+ GenericSignature *genericSig,
173
+ MangledTypeRefRole role) {
174
+ return getTypeRef (type->getCanonicalType (genericSig), role);
175
+ }
176
+
177
+ llvm::Constant *IRGenModule::getTypeRef (CanType type,
178
+ MangledTypeRefRole role) {
179
+
172
180
switch (role) {
173
181
case MangledTypeRefRole::DefaultAssociatedTypeWitness:
174
182
case MangledTypeRefRole::Metadata:
@@ -357,6 +365,20 @@ class ReflectionMetadataBuilder {
357
365
}
358
366
}
359
367
368
+ // / Add a 32-bit relative offset to a mangled typeref string
369
+ // / in the typeref reflection section.
370
+ // /
371
+ // / By default, we use MangledTypeRefRole::Reflection, which does not
372
+ // / force emission of any type metadata referenced from the typeref.
373
+ // /
374
+ // / For reflection records which are demangled to produce type metadata
375
+ // / in-process, pass MangledTypeRefRole::Metadata instead.
376
+ void addTypeRef (Type type, GenericSignature *genericSig,
377
+ MangledTypeRefRole role =
378
+ MangledTypeRefRole::Reflection) {
379
+ addTypeRef (type->getCanonicalType (genericSig), role);
380
+ }
381
+
360
382
// / Add a 32-bit relative offset to a mangled typeref string
361
383
// / in the typeref reflection section.
362
384
// /
@@ -387,8 +409,7 @@ class ReflectionMetadataBuilder {
387
409
IGM.getAddrOfStringForTypeRef (mangledStr, role);
388
410
B.addRelativeAddress (mangledName);
389
411
} else {
390
- CanType type = nominal->getDeclaredType ()->getCanonicalType ();
391
- addTypeRef (type, role);
412
+ addTypeRef (nominal->getDeclaredType (), /* genericSig*/ nullptr , role);
392
413
}
393
414
}
394
415
@@ -491,8 +512,8 @@ class FieldTypeMetadataBuilder : public ReflectionMetadataBuilder {
491
512
const uint32_t fieldRecordSize = 12 ;
492
513
const NominalTypeDecl *NTD;
493
514
494
- void addFieldDecl (const ValueDecl *value, CanType type,
495
- bool indirect=false ) {
515
+ void addFieldDecl (const ValueDecl *value, Type type,
516
+ GenericSignature *genericSig, bool indirect=false ) {
496
517
reflection::FieldRecordFlags flags;
497
518
flags.setIsIndirectCase (indirect);
498
519
if (auto var = dyn_cast<VarDecl>(value))
@@ -506,7 +527,7 @@ class FieldTypeMetadataBuilder : public ReflectionMetadataBuilder {
506
527
// The standard library's Mirror demangles metadata from field
507
528
// descriptors, so use MangledTypeRefRole::Metadata to ensure
508
529
// runtime metadata is available.
509
- addTypeRef (type, MangledTypeRefRole::Metadata);
530
+ addTypeRef (type, genericSig, MangledTypeRefRole::Metadata);
510
531
}
511
532
512
533
if (IGM.IRGen .Opts .EnableReflectionNames ) {
@@ -536,9 +557,8 @@ class FieldTypeMetadataBuilder : public ReflectionMetadataBuilder {
536
557
auto properties = NTD->getStoredProperties ();
537
558
B.addInt32 (std::distance (properties.begin (), properties.end ()));
538
559
for (auto property : properties)
539
- addFieldDecl (property,
540
- property->getInterfaceType ()
541
- ->getCanonicalType ());
560
+ addFieldDecl (property, property->getInterfaceType (),
561
+ NTD->getGenericSignature ());
542
562
}
543
563
544
564
void layoutEnum () {
@@ -562,14 +582,13 @@ class FieldTypeMetadataBuilder : public ReflectionMetadataBuilder {
562
582
for (auto enumCase : strategy.getElementsWithPayload ()) {
563
583
bool indirect = (enumCase.decl ->isIndirect () ||
564
584
enumDecl->isIndirect ());
565
- addFieldDecl (enumCase.decl ,
566
- enumCase.decl ->getArgumentInterfaceType ()
567
- ->getCanonicalType (),
585
+ addFieldDecl (enumCase.decl , enumCase.decl ->getArgumentInterfaceType (),
586
+ enumDecl->getGenericSignature (),
568
587
indirect);
569
588
}
570
589
571
590
for (auto enumCase : strategy.getElementsWithNoPayload ()) {
572
- addFieldDecl (enumCase.decl , CanType ());
591
+ addFieldDecl (enumCase.decl , CanType (), nullptr );
573
592
}
574
593
}
575
594
@@ -596,9 +615,10 @@ class FieldTypeMetadataBuilder : public ReflectionMetadataBuilder {
596
615
auto *CD = dyn_cast<ClassDecl>(NTD);
597
616
auto *PD = dyn_cast<ProtocolDecl>(NTD);
598
617
if (CD && CD->getSuperclass ()) {
599
- addTypeRef (CD->getSuperclass ()-> getCanonicalType ());
618
+ addTypeRef (CD->getSuperclass (), CD-> getGenericSignature ());
600
619
} else if (PD && PD->getDeclaredType ()->getSuperclass ()) {
601
- addTypeRef (PD->getDeclaredType ()->getSuperclass ()->getCanonicalType ());
620
+ addTypeRef (PD->getDeclaredType ()->getSuperclass (),
621
+ PD->getGenericSignature ());
602
622
} else {
603
623
B.addInt32 (0 );
604
624
}
0 commit comments