Skip to content

Commit 2b44e85

Browse files
committed
[ABI] Use mangled superclass names from class context descriptors.
Rather than rely on the metadata initialization function to compute and fill in the superclass, use the mangled superclass name to construct the superclass metadata.
1 parent 0970ab9 commit 2b44e85

File tree

10 files changed

+29
-170
lines changed

10 files changed

+29
-170
lines changed

include/swift/Runtime/Metadata.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,6 @@ swift_relocateClassMetadata(ClassDescriptor *descriptor,
629629
/// class metadata pattern by swift_allocateGenericClassMetadata().
630630
SWIFT_RUNTIME_EXPORT
631631
void swift_initClassMetadata(ClassMetadata *self,
632-
ClassMetadata *super,
633632
ClassLayoutFlags flags,
634633
size_t numFields,
635634
const TypeLayout * const *fieldTypes,
@@ -646,7 +645,6 @@ void swift_initClassMetadata(ClassMetadata *self,
646645
/// size is not known at compile time.
647646
SWIFT_RUNTIME_EXPORT
648647
void swift_updateClassMetadata(ClassMetadata *self,
649-
ClassMetadata *super,
650648
ClassLayoutFlags flags,
651649
size_t numFields,
652650
const TypeLayout * const *fieldTypes,

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -773,30 +773,28 @@ FUNCTION(RelocateClassMetadata,
773773

774774
// struct FieldInfo { size_t Size; size_t AlignMask; };
775775
// void swift_initClassMetadata(Metadata *self,
776-
// Metadata *super,
777776
// ClassLayoutFlags flags,
778777
// size_t numFields,
779778
// TypeLayout * const *fieldTypes,
780779
// size_t *fieldOffsets);
781780
FUNCTION(InitClassMetadata,
782781
swift_initClassMetadata, C_CC,
783782
RETURNS(VoidTy),
784-
ARGS(TypeMetadataPtrTy, TypeMetadataPtrTy, SizeTy, SizeTy,
783+
ARGS(TypeMetadataPtrTy, SizeTy, SizeTy,
785784
Int8PtrPtrTy->getPointerTo(),
786785
SizeTy->getPointerTo()),
787786
ATTRS(NoUnwind))
788787

789788
// struct FieldInfo { size_t Size; size_t AlignMask; };
790789
// void swift_updateClassMetadata(Metadata *self,
791-
// Metadata *super,
792790
// ClassLayoutFlags flags,
793791
// size_t numFields,
794792
// TypeLayout * const *fieldTypes,
795793
// size_t *fieldOffsets);
796794
FUNCTION(UpdateClassMetadata,
797795
swift_updateClassMetadata, C_CC,
798796
RETURNS(VoidTy),
799-
ARGS(TypeMetadataPtrTy, TypeMetadataPtrTy, SizeTy, SizeTy,
797+
ARGS(TypeMetadataPtrTy, SizeTy, SizeTy,
800798
Int8PtrPtrTy->getPointerTo(),
801799
SizeTy->getPointerTo()),
802800
ATTRS(NoUnwind))

lib/IRGen/GenMeta.cpp

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1814,28 +1814,10 @@ static void emitInitializeFieldOffsetVector(IRGenFunction &IGF,
18141814
if (!doesClassMetadataRequireRelocation(IGM, classDecl))
18151815
flags |= ClassLayoutFlags::HasStaticVTable;
18161816

1817-
// Get the superclass metadata, if the class has one.
1818-
llvm::Value *superclassMetadata;
1819-
if (auto superclassType = classDecl->getSuperclass()) {
1820-
superclassType = classDecl->mapTypeIntoContext(superclassType);
1821-
1822-
auto request = DynamicMetadataRequest::getNonBlocking(
1823-
MetadataState::NonTransitiveComplete, collector);
1824-
1825-
superclassMetadata =
1826-
emitClassHeapMetadataRef(IGF, superclassType->getCanonicalType(),
1827-
MetadataValueType::TypeMetadata,
1828-
request,
1829-
/*allowUninit*/ false);
1830-
} else {
1831-
superclassMetadata =
1832-
llvm::ConstantPointerNull::get(IGM.TypeMetadataPtrTy);
1833-
}
1834-
18351817
if (doesClassMetadataRequireInitialization(IGM, classDecl)) {
18361818
// Call swift_initClassMetadata().
18371819
IGF.Builder.CreateCall(IGM.getInitClassMetadataFn(),
1838-
{metadata, superclassMetadata,
1820+
{metadata,
18391821
IGM.getSize(Size(uintptr_t(flags))),
18401822
numFields, fields.getAddress(), fieldVector});
18411823
} else {
@@ -1846,7 +1828,7 @@ static void emitInitializeFieldOffsetVector(IRGenFunction &IGF,
18461828
// already references the superclass in this case, but we still want
18471829
// to ensure the superclass metadata is initialized first.
18481830
IGF.Builder.CreateCall(IGM.getUpdateClassMetadataFn(),
1849-
{metadata, superclassMetadata,
1831+
{metadata,
18501832
IGM.getSize(Size(uintptr_t(flags))),
18511833
numFields, fields.getAddress(), fieldVector});
18521834
}

stdlib/public/runtime/Metadata.cpp

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2539,13 +2539,13 @@ static void initGenericObjCClass(ClassMetadata *self,
25392539

25402540
void
25412541
swift::swift_initClassMetadata(ClassMetadata *self,
2542-
ClassMetadata *super,
25432542
ClassLayoutFlags layoutFlags,
25442543
size_t numFields,
25452544
const TypeLayout * const *fieldTypes,
25462545
size_t *fieldOffsets) {
25472546
// If there is a mangled superclass name, demangle it to the superclass
25482547
// type.
2548+
const ClassMetadata *super = nullptr;
25492549
if (auto superclassNameBase = self->getDescription()->SuperclassType.get()) {
25502550
StringRef superclassName =
25512551
Demangle::makeSymbolicMangledNameStringRef(superclassNameBase);
@@ -2564,22 +2564,7 @@ swift::swift_initClassMetadata(ClassMetadata *self,
25642564
superclass = objcWrapper->Class;
25652565
#endif
25662566

2567-
if (superclass != super) {
2568-
auto superclassType = swift_getTypeName(superclass, true);
2569-
auto providedSuperclassType = swift_getTypeName(super, true);
2570-
fatalError(0,
2571-
"demangled superclass %s (@%p) of %s differs from "
2572-
"compiler-provided "
2573-
"superclass %s (@%p) in swift_initClassMetadata\n",
2574-
StringRef(superclassType.data, superclassType.length)
2575-
.str().c_str(),
2576-
superclass,
2577-
self->getDescription()->Name.get(),
2578-
StringRef(providedSuperclassType.data,
2579-
providedSuperclassType.length)
2580-
.str().c_str(),
2581-
super);
2582-
}
2567+
super = cast<ClassMetadata>(superclass);
25832568
}
25842569

25852570
self->Superclass = super;
@@ -2627,13 +2612,14 @@ swift::swift_initClassMetadata(ClassMetadata *self,
26272612
#if SWIFT_OBJC_INTEROP
26282613
void
26292614
swift::swift_updateClassMetadata(ClassMetadata *self,
2630-
ClassMetadata *super,
26312615
ClassLayoutFlags layoutFlags,
26322616
size_t numFields,
26332617
const TypeLayout * const *fieldTypes,
26342618
size_t *fieldOffsets) {
2619+
#ifndef NDEBUG
26352620
// If there is a mangled superclass name, demangle it to the superclass
26362621
// type.
2622+
const ClassMetadata *super = nullptr;
26372623
if (auto superclassNameBase = self->getDescription()->SuperclassType.get()) {
26382624
StringRef superclassName =
26392625
Demangle::makeSymbolicMangledNameStringRef(superclassNameBase);
@@ -2652,18 +2638,14 @@ swift::swift_updateClassMetadata(ClassMetadata *self,
26522638
superclass = objcWrapper->Class;
26532639
#endif
26542640

2655-
if (superclass != super) {
2656-
fatalError(0,
2657-
"demangled superclass %p differs from compiler-provided "
2658-
"superclass %p in swift_updateClassMetadata\n",
2659-
superclass, super);
2660-
}
2641+
super = cast<ClassMetadata>(superclass);
26612642
}
26622643

26632644
if (!super)
26642645
assert(self->Superclass == getRootSuperclass());
26652646
else
26662647
assert(self->Superclass == super);
2648+
#endif
26672649

26682650
// FIXME: Plumb this through
26692651
#if 1

test/IRGen/class_resilience.swift

Lines changed: 7 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ extension ResilientGenericOutsideParent {
415415
// CHECK: dependency-satisfied:
416416

417417
// -- ClassLayoutFlags = 0x100 (HasStaticVTable)
418-
// CHECK: void @swift_initClassMetadata(%swift.type* %0, %swift.type* null, [[INT]] 256, [[INT]] 3, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
418+
// CHECK: void @swift_initClassMetadata(%swift.type* %0, [[INT]] 256, [[INT]] 3, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
419419

420420
// CHECK-native: [[FIELD_OFFSET:%.*]] = load [[INT]], [[INT]]* {{.*}}
421421
// CHECK-native-NEXT: store [[INT]] [[FIELD_OFFSET]], [[INT]]* @"$s16class_resilience26ClassWithResilientPropertyC1s16resilient_struct4SizeVvpWvd"
@@ -463,7 +463,7 @@ extension ResilientGenericOutsideParent {
463463
// CHECK: dependency-satisfied:
464464

465465
// -- ClassLayoutFlags = 0x100 (HasStaticVTable)
466-
// CHECK: call void @swift_initClassMetadata(%swift.type* %0, %swift.type* null, [[INT]] 256, [[INT]] 2, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
466+
// CHECK: call void @swift_initClassMetadata(%swift.type* %0, [[INT]] 256, [[INT]] 2, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
467467

468468
// CHECK-native: [[FIELD_OFFSET:%.*]] = load [[INT]], [[INT]]* {{.*}}
469469
// CHECK-native-NEXT: store [[INT]] [[FIELD_OFFSET]], [[INT]]* @"$s16class_resilience33ClassWithResilientlySizedPropertyC1r16resilient_struct9RectangleVvpWvd"
@@ -495,27 +495,10 @@ extension ResilientGenericOutsideParent {
495495

496496
// CHECK-LABEL: define internal swiftcc %swift.metadata_response @"$s16class_resilience14ResilientChildCMr"(%swift.type*, i8*, i8**)
497497

498-
// Initialize the superclass field...
499-
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s15resilient_class22ResilientOutsideParentCMa"([[INT]] 257)
500-
// CHECK: [[SUPER:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
501-
// CHECK-NEXT: [[STATUS:%.*]] = extractvalue %swift.metadata_response [[T0]], 1
502-
// CHECK-NEXT: [[RESULT:%.*]] = icmp ule [[INT]] [[STATUS]], 1
503-
// CHECK-NEXT: br i1 [[RESULT]], label %dependency-satisfied, label %metadata-dependencies.cont
504-
505-
// CHECK: dependency-satisfied:
506-
507498
// Initialize field offset vector...
508-
// CHECK: call void @swift_initClassMetadata(%swift.type* %0, %swift.type* [[SUPER]], [[INT]] 0, [[INT]] 1, i8*** {{.*}}, [[INT]]* {{.*}})
499+
// CHECK: call void @swift_initClassMetadata(%swift.type* %0, [[INT]] 0, [[INT]] 1, i8*** {{.*}}, [[INT]]* {{.*}})
509500

510-
// CHECK: br label %metadata-dependencies.cont
511-
512-
// CHECK: metadata-dependencies.cont:
513-
514-
// CHECK-NEXT: [[PENDING_METADATA:%.*]] = phi %swift.type* [ [[SUPER]], %entry ], [ null, %dependency-satisfied ]
515-
// CHECK-NEXT: [[NEW_STATUS:%.*]] = phi [[INT]] [ 1, %entry ], [ 0, %dependency-satisfied ]
516-
// CHECK-NEXT: [[T0:%.*]] = insertvalue %swift.metadata_response undef, %swift.type* [[PENDING_METADATA]], 0
517-
// CHECK-NEXT: [[T1:%.*]] = insertvalue %swift.metadata_response [[T0]], [[INT]] [[NEW_STATUS]], 1
518-
// CHECK-NEXT: ret %swift.metadata_response [[T1]]
501+
// CHECK: ret %swift.metadata_response
519502

520503

521504
// ResilientChild method lookup function
@@ -555,25 +538,7 @@ extension ResilientGenericOutsideParent {
555538
// CHECK-LABEL: define internal swiftcc %swift.metadata_response @"$s16class_resilience16FixedLayoutChildCMr"(%swift.type*, i8*, i8**)
556539

557540
// Initialize the superclass field...
558-
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s15resilient_class22ResilientOutsideParentCMa"([[INT]] 257)
559-
// CHECK: [[SUPER:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
560-
// CHECK-NEXT: [[STATUS:%.*]] = extractvalue %swift.metadata_response [[T0]], 1
561-
// CHECK-NEXT: [[RESULT:%.*]] = icmp ule [[INT]] [[STATUS]], 1
562-
// CHECK-NEXT: br i1 [[RESULT]], label %dependency-satisfied, label %metadata-dependencies.cont
563-
564-
// CHECK: dependency-satisfied:
565-
566-
// CHECK: call void @swift_initClassMetadata(%swift.type* %0, %swift.type* [[SUPER]], [[INT]] 0, [[INT]] 1, i8*** {{%.*}}, [[INT]]* {{%.*}})
567-
568-
// CHECK: br label %metadata-dependencies.cont
569-
570-
// CHECK: metadata-dependencies.cont:
571-
572-
// CHECK-NEXT: [[PENDING_METADATA:%.*]] = phi %swift.type* [ [[SUPER]], %entry ], [ null, %dependency-satisfied ]
573-
// CHECK-NEXT: [[NEW_STATUS:%.*]] = phi [[INT]] [ 1, %entry ], [ 0, %dependency-satisfied ]
574-
// CHECK-NEXT: [[T0:%.*]] = insertvalue %swift.metadata_response undef, %swift.type* [[PENDING_METADATA]], 0
575-
// CHECK-NEXT: [[T1:%.*]] = insertvalue %swift.metadata_response [[T0]], [[INT]] [[NEW_STATUS]], 1
576-
// CHECK-NEXT: ret %swift.metadata_response [[T1]]
541+
// CHECK: call void @swift_initClassMetadata(%swift.type* %0, [[INT]] 0, [[INT]] 1, i8*** {{%.*}}, [[INT]]* {{%.*}})
577542

578543

579544
// FixedLayoutChild metadata relocation function
@@ -593,19 +558,8 @@ extension ResilientGenericOutsideParent {
593558
// CHECK-LABEL: define internal swiftcc %swift.metadata_response @"$s16class_resilience21ResilientGenericChildCMr"
594559
// CHECK-SAME: (%swift.type* [[METADATA:%.*]], i8*, i8**)
595560

596-
// Initialize the superclass pointer...
597-
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s15resilient_class29ResilientGenericOutsideParentCMa"([[INT]] 257, %swift.type* %T)
598-
// CHECK: [[SUPER:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
599-
// CHECK: [[SUPER_STATUS:%.*]] = extractvalue %swift.metadata_response [[T0]], 1
600-
// CHECK: [[SUPER_OK:%.*]] = icmp ule [[INT]] [[SUPER_STATUS]], 1
601-
// CHECK: br i1 [[SUPER_OK]],
602-
603-
// CHECK: call void @swift_initClassMetadata(%swift.type* [[METADATA]], %swift.type* [[SUPER]], [[INT]] 0,
604-
// CHECK: [[DEP:%.*]] = phi %swift.type* [ [[SUPER]], {{.*}} ], [ null, {{.*}} ]
605-
// CHECK: [[DEP_REQ:%.*]] = phi [[INT]] [ 1, {{.*}} ], [ 0, {{.*}} ]
606-
// CHECK: [[T0:%.*]] = insertvalue %swift.metadata_response undef, %swift.type* [[DEP]], 0
607-
// CHECK: [[T1:%.*]] = insertvalue %swift.metadata_response [[T0]], [[INT]] [[DEP_REQ]], 1
608-
// CHECK: ret %swift.metadata_response [[T1]]
561+
// CHECK: call void @swift_initClassMetadata(%swift.type* [[METADATA]], [[INT]] 0,
562+
// CHECK: ret %swift.metadata_response
609563

610564

611565
// ResilientGenericChild method lookup function

test/IRGen/completely_fragile_class_layout.sil

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ bb0(%0 : @guaranteed $ClassWithResilientField):
191191
// CHECK: dependency-satisfied:
192192

193193
// -- ClassLayoutFlags = 0x100 (HasStaticVTable)
194-
// CHECK: void @swift_updateClassMetadata(%swift.type* %0, %swift.type* null, [[INT]] 256, [[INT]] 3, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
194+
// CHECK: void @swift_updateClassMetadata(%swift.type* %0, [[INT]] 256, [[INT]] 3, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
195195

196196
// CHECK-native: [[FIELD_OFFSET:%.*]] = load [[INT]], [[INT]]* {{.*}}
197197
// CHECK-native-NEXT: store [[INT]] [[FIELD_OFFSET]], [[INT]]* @"$s31completely_fragile_class_layout23ClassWithResilientFieldC1s16resilient_struct4SizeVvpWvd"
@@ -222,33 +222,10 @@ bb0(%0 : @guaranteed $ClassWithResilientField):
222222
// CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 0, i8* [[FIELDS_ADDR]])
223223
// CHECK-NEXT: [[FIELDS_PTR:%.*]] = getelementptr inbounds [0 x i8**], [0 x i8**]* [[FIELDS]], i32 0, i32 0
224224

225-
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s31completely_fragile_class_layout23ClassWithResilientFieldCMa"([[INT]] 257)
226-
// CHECK-NEXT: [[SUPER:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
227-
// CHECK-NEXT: [[STATUS:%.*]] = extractvalue %swift.metadata_response [[T0]], 1
228-
// CHECK-NEXT: [[RESULT:%.*]] = icmp ule [[INT]] [[STATUS]], 1
229-
// CHECK-NEXT: br i1 [[RESULT]], label %dependency-satisfied, label %metadata-dependencies.cont
230-
231-
// CHECK: dependency-satisfied:
232-
233225
// -- ClassLayoutFlags = 0x100 (HasStaticVTable)
234-
// CHECK: void @swift_updateClassMetadata(%swift.type* %0, %swift.type* [[SUPER]], [[INT]] 256, [[INT]] 0, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
235-
236-
// CHECK-native: [[FIELD_OFFSET:%.*]] = load [[INT]], [[INT]]* {{.*}}
237-
// CHECK-native-NEXT: store [[INT]] [[FIELD_OFFSET]], [[INT]]* @"$s31completely_fragile_class_layout23ClassWithResilientFieldC1s16resilient_struct4SizeVvpWvd"
238-
239-
// CHECK-native: [[FIELD_OFFSET:%.*]] = load [[INT]], [[INT]]* {{.*}}
240-
// CHECK-native-NEXT: store [[INT]] [[FIELD_OFFSET]], [[INT]]* @"$s31completely_fragile_class_layout23ClassWithResilientFieldC5colors5Int32VvpWvd"
241-
242-
// CHECK: br label %metadata-dependencies.cont
243-
244-
// CHECK: metadata-dependencies.cont:
245-
246-
// CHECK-NEXT: [[PENDING_METADATA:%.*]] = phi %swift.type* [ [[SUPER]], %entry ], [ null, %dependency-satisfied ]
247-
// CHECK-NEXT: [[NEW_STATUS:%.*]] = phi [[INT]] [ 1, %entry ], [ 0, %dependency-satisfied ]
248-
// CHECK-NEXT: [[T0:%.*]] = insertvalue %swift.metadata_response undef, %swift.type* [[PENDING_METADATA]], 0
249-
// CHECK-NEXT: [[T1:%.*]] = insertvalue %swift.metadata_response [[T0]], [[INT]] [[NEW_STATUS]], 1
250-
// CHECK-NEXT: ret %swift.metadata_response [[T1]]
226+
// CHECK: void @swift_updateClassMetadata(%swift.type* %0, [[INT]] 256, [[INT]] 0, i8*** [[FIELDS_PTR]], [[INT]]* [[FIELDS_DEST]])
251227

228+
// CHECK: ret %swift.metadata_response zeroinitializer
252229

253230
// Metadata accessor for ClassWithResilientEnum looks like singleton initialization:
254231

test/IRGen/concrete_inherits_generic_base.swift

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,5 @@ presentBase(Base(x: "two"))
8282
presentBase(Base(x: 2))
8383

8484
// CHECK-LABEL: define internal swiftcc %swift.metadata_response @"$s3foo12SuperDerivedCMr"(%swift.type*, i8*, i8**)
85-
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s3foo7DerivedCMa"([[INT]] 257)
86-
// CHECK-NEXT: [[SUPERCLASS:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
87-
// CHECK-NEXT: [[STATUS:%.*]] = extractvalue %swift.metadata_response [[T0]], 1
88-
// CHECK-NEXT: [[RESULT:%.*]] = icmp ule [[INT]] [[STATUS]], 1
89-
// CHECK-NEXT: br i1 [[RESULT]], label %dependency-satisfied, label %metadata-dependencies.cont
90-
91-
// CHECK: dependency-satisfied:
92-
9385
// -- ClassLayoutFlags = 0x100 (HasStaticVTable)
94-
// CHECK: call void @swift_initClassMetadata(%swift.type* %0, %swift.type* [[SUPERCLASS]], [[INT]] 256, {{.*}})
95-
96-
// CHECK: metadata-dependencies.cont:
97-
// CHECK: ret %swift.metadata_response
86+
// CHECK: call void @swift_initClassMetadata(%swift.type* %0, [[INT]] 256, {{.*}})

0 commit comments

Comments
 (0)