@@ -174,20 +174,28 @@ class PrintMetadataSource
174
174
175
175
class ReflectionMetadataBuilder : public ConstantBuilder <> {
176
176
protected:
177
- llvm::SetVector<CanType> &BuiltinTypes;
178
177
179
178
// Collect any builtin types referenced from this type.
180
179
void addBuiltinTypeRefs (CanType type) {
181
180
type.visit ([&](Type t) {
182
181
if (t->is <BuiltinType>())
183
- BuiltinTypes.insert (CanType (t));
184
-
185
- // We need at least size/alignment information for types imported by
186
- // clang, so we'll treat them as a builtin type, essentially an
187
- // opaque blob.
182
+ IGM.BuiltinTypes .insert (CanType (t));
183
+
184
+ // We need size/alignment information for imported value types,
185
+ // so emit builtin descriptors for them.
186
+ //
187
+ // In effect they're treated like an opaque blob, which is OK
188
+ // for now, at least until we want to import C++ types or
189
+ // something like that.
190
+ //
191
+ // Classes go down a different path.
188
192
if (auto Nominal = t->getAnyNominal ())
189
- if (Nominal->hasClangNode ())
190
- BuiltinTypes.insert (CanType (t));
193
+ if (Nominal->hasClangNode ()) {
194
+ if (auto CD = dyn_cast<ClassDecl>(Nominal))
195
+ IGM.ImportedClasses .insert (CD);
196
+ else
197
+ IGM.BuiltinTypes .insert (CanType (t));
198
+ }
191
199
});
192
200
}
193
201
@@ -210,9 +218,8 @@ class ReflectionMetadataBuilder : public ConstantBuilder<> {
210
218
}
211
219
212
220
public:
213
- ReflectionMetadataBuilder (IRGenModule &IGM,
214
- llvm::SetVector<CanType> &BuiltinTypes)
215
- : ConstantBuilder(IGM), BuiltinTypes(BuiltinTypes) {}
221
+ ReflectionMetadataBuilder (IRGenModule &IGM)
222
+ : ConstantBuilder(IGM) {}
216
223
};
217
224
218
225
class AssociatedTypeMetadataBuilder : public ReflectionMetadataBuilder {
@@ -294,15 +301,11 @@ class AssociatedTypeMetadataBuilder : public ReflectionMetadataBuilder {
294
301
}
295
302
296
303
public:
297
- AssociatedTypeMetadataBuilder (IRGenModule &IGM, const NominalTypeDecl *Decl,
298
- llvm::SetVector<CanType> &BuiltinTypes)
299
- : ReflectionMetadataBuilder(IGM, BuiltinTypes),
300
- NominalOrExtensionDecl (Decl) {}
304
+ AssociatedTypeMetadataBuilder (IRGenModule &IGM, const NominalTypeDecl *Decl)
305
+ : ReflectionMetadataBuilder(IGM), NominalOrExtensionDecl(Decl) {}
301
306
302
- AssociatedTypeMetadataBuilder (IRGenModule &IGM, const ExtensionDecl *Decl,
303
- llvm::SetVector<CanType> &BuiltinTypes)
304
- : ReflectionMetadataBuilder(IGM, BuiltinTypes),
305
- NominalOrExtensionDecl(Decl) {}
307
+ AssociatedTypeMetadataBuilder (IRGenModule &IGM, const ExtensionDecl *Decl)
308
+ : ReflectionMetadataBuilder(IGM), NominalOrExtensionDecl(Decl) {}
306
309
307
310
308
311
llvm::GlobalVariable *emit () {
@@ -362,12 +365,6 @@ class FieldTypeMetadataBuilder : public ReflectionMetadataBuilder {
362
365
addConstantInt32 (0 );
363
366
}
364
367
365
- void addImportedRecord () {
366
- addConstantInt16 (uint16_t (FieldDescriptorKind::Imported));
367
- addConstantInt16 (0 );
368
- addConstantInt32 (0 );
369
- }
370
-
371
368
void layout () {
372
369
using swift::reflection::FieldDescriptorKind;
373
370
@@ -383,10 +380,8 @@ class FieldTypeMetadataBuilder : public ReflectionMetadataBuilder {
383
380
}
384
381
}
385
382
386
- if (NTD->hasClangNode ()) {
387
- addImportedRecord ();
383
+ if (NTD->hasClangNode ())
388
384
return ;
389
- }
390
385
391
386
switch (NTD->getKind ()) {
392
387
case DeclKind::Class:
@@ -442,10 +437,8 @@ class FieldTypeMetadataBuilder : public ReflectionMetadataBuilder {
442
437
443
438
public:
444
439
FieldTypeMetadataBuilder (IRGenModule &IGM,
445
- const NominalTypeDecl * NTD,
446
- llvm::SetVector<CanType> &BuiltinTypes)
447
- : ReflectionMetadataBuilder(IGM, BuiltinTypes),
448
- NTD (NTD) {}
440
+ const NominalTypeDecl * NTD)
441
+ : ReflectionMetadataBuilder(IGM), NTD(NTD) {}
449
442
450
443
llvm::GlobalVariable *emit () {
451
444
@@ -487,15 +480,14 @@ class BuiltinTypeMetadataBuilder : public ReflectionMetadataBuilder {
487
480
}
488
481
489
482
void layout () {
490
- for (auto builtinType : BuiltinTypes) {
483
+ for (auto builtinType : IGM. BuiltinTypes ) {
491
484
addBuiltinType (builtinType);
492
485
}
493
486
}
494
487
495
488
public:
496
- BuiltinTypeMetadataBuilder (IRGenModule &IGM,
497
- llvm::SetVector<CanType> &BuiltinTypes)
498
- : ReflectionMetadataBuilder(IGM, BuiltinTypes) {}
489
+ BuiltinTypeMetadataBuilder (IRGenModule &IGM)
490
+ : ReflectionMetadataBuilder(IGM) {}
499
491
500
492
llvm::GlobalVariable *emit () {
501
493
@@ -531,11 +523,8 @@ class BuiltinTypeMetadataBuilder : public ReflectionMetadataBuilder {
531
523
class BoxDescriptorBuilder : public ReflectionMetadataBuilder {
532
524
CanType BoxedType;
533
525
public:
534
- BoxDescriptorBuilder (IRGenModule &IGM,
535
- llvm::SetVector<CanType> &BuiltinTypes,
536
- CanType BoxedType)
537
- : ReflectionMetadataBuilder(IGM, BuiltinTypes),
538
- BoxedType (BoxedType) {}
526
+ BoxDescriptorBuilder (IRGenModule &IGM, CanType BoxedType)
527
+ : ReflectionMetadataBuilder(IGM), BoxedType(BoxedType) {}
539
528
540
529
void layout () {
541
530
addConstantInt32 (1 );
@@ -585,13 +574,12 @@ class CaptureDescriptorBuilder : public ReflectionMetadataBuilder {
585
574
const HeapLayout &Layout;
586
575
public:
587
576
CaptureDescriptorBuilder (IRGenModule &IGM,
588
- llvm::SetVector<CanType> &BuiltinTypes,
589
577
SILFunction &Caller,
590
578
CanSILFunctionType OrigCalleeType,
591
579
CanSILFunctionType SubstCalleeType,
592
580
ArrayRef<Substitution> Subs,
593
581
const HeapLayout &Layout)
594
- : ReflectionMetadataBuilder(IGM, BuiltinTypes ),
582
+ : ReflectionMetadataBuilder(IGM),
595
583
Caller (Caller), OrigCalleeType(OrigCalleeType),
596
584
SubstCalleeType(SubstCalleeType), Subs(Subs),
597
585
Layout(Layout) {}
@@ -819,7 +807,7 @@ IRGenModule::getAddrOfBoxDescriptor(CanType BoxedType) {
819
807
if (!IRGen.Opts .EnableReflectionMetadata )
820
808
return llvm::Constant::getNullValue (CaptureDescriptorPtrTy);
821
809
822
- BoxDescriptorBuilder builder (*this , BuiltinTypes, BoxedType);
810
+ BoxDescriptorBuilder builder (*this , BoxedType);
823
811
824
812
auto var = builder.emit ();
825
813
if (var)
@@ -837,7 +825,7 @@ IRGenModule::getAddrOfCaptureDescriptor(SILFunction &Caller,
837
825
if (!IRGen.Opts .EnableReflectionMetadata )
838
826
return llvm::Constant::getNullValue (CaptureDescriptorPtrTy);
839
827
840
- CaptureDescriptorBuilder builder (*this , BuiltinTypes, Caller,
828
+ CaptureDescriptorBuilder builder (*this , Caller,
841
829
OrigCalleeType, SubstCalleeType, Subs,
842
830
Layout);
843
831
@@ -860,7 +848,7 @@ void IRGenModule::emitAssociatedTypeMetadataRecord(const NominalTypeDecl *Decl){
860
848
if (!IRGen.Opts .EnableReflectionMetadata )
861
849
return ;
862
850
863
- AssociatedTypeMetadataBuilder builder (*this , Decl, BuiltinTypes );
851
+ AssociatedTypeMetadataBuilder builder (*this , Decl);
864
852
auto var = builder.emit ();
865
853
if (var)
866
854
addUsedGlobal (var);
@@ -870,7 +858,7 @@ void IRGenModule::emitAssociatedTypeMetadataRecord(const ExtensionDecl *Ext) {
870
858
if (!IRGen.Opts .EnableReflectionMetadata )
871
859
return ;
872
860
873
- AssociatedTypeMetadataBuilder builder (*this , Ext, BuiltinTypes );
861
+ AssociatedTypeMetadataBuilder builder (*this , Ext);
874
862
auto var = builder.emit ();
875
863
if (var)
876
864
addUsedGlobal (var);
@@ -885,12 +873,10 @@ void IRGenModule::emitBuiltinReflectionMetadata() {
885
873
BuiltinTypes.insert (Context.TheUnsafeValueBufferType );
886
874
}
887
875
888
- for (auto Ty : BuiltinTypes)
889
- if (auto Nominal = Ty.getAnyNominal ())
890
- if (Nominal->hasClangNode ())
891
- emitFieldMetadataRecord (Nominal);
876
+ for (auto CD : ImportedClasses)
877
+ emitFieldMetadataRecord (CD);
892
878
893
- BuiltinTypeMetadataBuilder builder (*this , BuiltinTypes );
879
+ BuiltinTypeMetadataBuilder builder (*this );
894
880
auto var = builder.emit ();
895
881
if (var)
896
882
addUsedGlobal (var);
@@ -900,7 +886,7 @@ void IRGenModule::emitFieldMetadataRecord(const NominalTypeDecl *Decl) {
900
886
if (!IRGen.Opts .EnableReflectionMetadata )
901
887
return ;
902
888
903
- FieldTypeMetadataBuilder builder (*this , Decl, BuiltinTypes );
889
+ FieldTypeMetadataBuilder builder (*this , Decl);
904
890
auto var = builder.emit ();
905
891
if (var)
906
892
addUsedGlobal (var);
0 commit comments