Skip to content

Commit b1f4430

Browse files
committed
Runtime: Rename swift_initClassMetadata_UniversalStrategy()
Rename it to swift_initClassMetadata() just like we recently did swift_initStructMetadata(), and add a StructLayoutFlags parameter so we can version calls to this function in the future. Maybe at some point this will become a separate ClassLayoutFlags type, but at this point it doesn't matter because IRGen always passes a value of 0.
1 parent f830540 commit b1f4430

File tree

11 files changed

+61
-35
lines changed

11 files changed

+61
-35
lines changed

include/swift/ABI/MetadataValues.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -980,6 +980,27 @@ static inline bool isValueWitnessTableMutable(StructLayoutFlags flags) {
980980
return uintptr_t(flags) & uintptr_t(StructLayoutFlags::IsVWTMutable);
981981
}
982982

983+
/// Flags for class layout.
984+
enum class ClassLayoutFlags : uintptr_t {
985+
/// Reserve space for 256 layout algorithms.
986+
AlgorithmMask = 0xff,
987+
988+
/// The ABI baseline algorithm, i.e. the algorithm implemented in Swift 5.
989+
Swift5Algorithm = 0x00,
990+
};
991+
static inline ClassLayoutFlags operator|(ClassLayoutFlags lhs,
992+
ClassLayoutFlags rhs) {
993+
return ClassLayoutFlags(uintptr_t(lhs) | uintptr_t(rhs));
994+
}
995+
static inline ClassLayoutFlags &operator|=(ClassLayoutFlags &lhs,
996+
ClassLayoutFlags rhs) {
997+
return (lhs = (lhs | rhs));
998+
}
999+
static inline ClassLayoutFlags getLayoutAlgorithm(ClassLayoutFlags flags) {
1000+
return ClassLayoutFlags(uintptr_t(flags)
1001+
& uintptr_t(ClassLayoutFlags::AlgorithmMask));
1002+
}
1003+
9831004
/// Flags for enum layout.
9841005
enum class EnumLayoutFlags : uintptr_t {
9851006
/// Reserve space for 256 layout algorithms.

include/swift/Runtime/Metadata.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4075,10 +4075,11 @@ swift_relocateClassMetadata(ClassMetadata *self,
40754075
/// Initialize the field offset vector for a dependent-layout class, using the
40764076
/// "Universal" layout strategy.
40774077
SWIFT_RUNTIME_EXPORT
4078-
void swift_initClassMetadata_UniversalStrategy(ClassMetadata *self,
4079-
size_t numFields,
4080-
const TypeLayout * const *fieldTypes,
4081-
size_t *fieldOffsets);
4078+
void swift_initClassMetadata(ClassMetadata *self,
4079+
ClassLayoutFlags flags,
4080+
size_t numFields,
4081+
const TypeLayout * const *fieldTypes,
4082+
size_t *fieldOffsets);
40824083

40834084
/// \brief Fetch a uniqued metadata for a metatype type.
40844085
SWIFT_RUNTIME_EXPORT

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -914,14 +914,15 @@ FUNCTION(RelocateClassMetadata,
914914
ATTRS(NoUnwind))
915915

916916
// struct FieldInfo { size_t Size; size_t AlignMask; };
917-
// void swift_initClassMetadata_UniversalStrategy(Metadata *self,
918-
// size_t numFields,
919-
// TypeLayout * const *fieldTypes,
920-
// size_t *fieldOffsets);
921-
FUNCTION(InitClassMetadataUniversal,
922-
swift_initClassMetadata_UniversalStrategy, C_CC,
923-
RETURNS(VoidTy),
924-
ARGS(TypeMetadataPtrTy, SizeTy,
917+
// void swift_initClassMetadata(Metadata *self,
918+
// ClassLayoutFlags flags,
919+
// size_t numFields,
920+
// TypeLayout * const *fieldTypes,
921+
// size_t *fieldOffsets);
922+
FUNCTION(InitClassMetadata,
923+
swift_initClassMetadata, C_CC,
924+
RETURNS(VoidTy),
925+
ARGS(TypeMetadataPtrTy, SizeTy, SizeTy,
925926
Int8PtrPtrTy->getPointerTo(),
926927
SizeTy->getPointerTo()),
927928
ATTRS(NoUnwind))
@@ -934,7 +935,8 @@ FUNCTION(InitClassMetadataUniversal,
934935
FUNCTION(InitStructMetadata,
935936
swift_initStructMetadata, C_CC,
936937
RETURNS(VoidTy),
937-
ARGS(TypeMetadataPtrTy, SizeTy, SizeTy, Int8PtrPtrTy->getPointerTo(0),
938+
ARGS(TypeMetadataPtrTy, SizeTy, SizeTy,
939+
Int8PtrPtrTy->getPointerTo(0),
938940
SizeTy->getPointerTo()),
939941
ATTRS(NoUnwind))
940942

lib/IRGen/GenClass.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1810,9 +1810,8 @@ namespace {
18101810
break;
18111811
}
18121812
case FieldAccess::ConstantIndirect:
1813-
// Otherwise, swift_initClassMetadata_UniversalStrategy() will point
1814-
// the Objective-C runtime into the field offset vector of the
1815-
// instantiated metadata.
1813+
// Otherwise, swift_initClassMetadata() will point the Objective-C
1814+
// runtime into the field offset vector of the instantiated metadata.
18161815
offsetPtr
18171816
= llvm::ConstantPointerNull::get(IGM.IntPtrTy->getPointerTo());
18181817
break;

lib/IRGen/GenMeta.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1405,9 +1405,11 @@ void irgen::emitInitializeFieldOffsetVector(IRGenFunction &IGF,
14051405
auto numFields = IGF.IGM.getSize(Size(storedProperties.size()));
14061406

14071407
if (isa<ClassDecl>(target)) {
1408-
IGF.Builder.CreateCall(IGF.IGM.getInitClassMetadataUniversalFn(),
1409-
{metadata, numFields,
1410-
fields.getAddress(), fieldVector});
1408+
ClassLayoutFlags flags = ClassLayoutFlags::Swift5Algorithm;
1409+
1410+
IGF.Builder.CreateCall(IGF.IGM.getInitClassMetadataFn(),
1411+
{metadata, IGF.IGM.getSize(Size(uintptr_t(flags))),
1412+
numFields, fields.getAddress(), fieldVector});
14111413
} else {
14121414
assert(isa<StructDecl>(target));
14131415
StructLayoutFlags flags = StructLayoutFlags::Swift5Algorithm;

stdlib/public/runtime/Metadata.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1845,10 +1845,11 @@ swift::swift_relocateClassMetadata(ClassMetadata *self,
18451845
/// Initialize the field offset vector for a dependent-layout class, using the
18461846
/// "Universal" layout strategy.
18471847
void
1848-
swift::swift_initClassMetadata_UniversalStrategy(ClassMetadata *self,
1849-
size_t numFields,
1850-
const TypeLayout * const *fieldTypes,
1851-
size_t *fieldOffsets) {
1848+
swift::swift_initClassMetadata(ClassMetadata *self,
1849+
ClassLayoutFlags layoutFlags,
1850+
size_t numFields,
1851+
const TypeLayout * const *fieldTypes,
1852+
size_t *fieldOffsets) {
18521853
_swift_initializeSuperclass(self);
18531854

18541855
// Start layout by appending to a standard heap object header.

test/IRGen/class_resilience.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ extension ResilientGenericOutsideParent {
323323
// CHECK: [[METADATA:%.*]] = call %swift.type* @swift_relocateClassMetadata({{.*}}, [[INT]] {{60|96}}, [[INT]] 4)
324324
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$S16resilient_struct4SizeVMa"([[INT]] 0)
325325
// CHECK-NEXT: [[SIZE_METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
326-
// CHECK: call void @swift_initClassMetadata_UniversalStrategy(%swift.type* [[METADATA]], [[INT]] 3, {{.*}})
326+
// CHECK: call void @swift_initClassMetadata(%swift.type* [[METADATA]], [[INT]] 0, [[INT]] 3, {{.*}})
327327
// CHECK-native: [[METADATA_PTR:%.*]] = bitcast %swift.type* [[METADATA]] to [[INT]]*
328328
// CHECK-native-NEXT: [[FIELD_OFFSET_PTR:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_PTR]], [[INT]] {{12|15}}
329329
// CHECK-native-NEXT: [[FIELD_OFFSET:%.*]] = load [[INT]], [[INT]]* [[FIELD_OFFSET_PTR]]
@@ -341,7 +341,7 @@ extension ResilientGenericOutsideParent {
341341
// CHECK: [[METADATA:%.*]] = call %swift.type* @swift_relocateClassMetadata({{.*}}, [[INT]] {{60|96}}, [[INT]] 3)
342342
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$S16resilient_struct9RectangleVMa"([[INT]] 0)
343343
// CHECK-NEXT: [[RECTANGLE_METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
344-
// CHECK: call void @swift_initClassMetadata_UniversalStrategy(%swift.type* [[METADATA]], [[INT]] 2, {{.*}})
344+
// CHECK: call void @swift_initClassMetadata(%swift.type* [[METADATA]], [[INT]] 0, [[INT]] 2, {{.*}})
345345
// CHECK-native: [[METADATA_PTR:%.*]] = bitcast %swift.type* [[METADATA]] to [[INT]]*
346346
// CHECK-native-NEXT: [[FIELD_OFFSET_PTR:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[METADATA_PTR]], [[INT]] {{11|14}}
347347
// CHECK-native-NEXT: [[FIELD_OFFSET:%.*]] = load [[INT]], [[INT]]* [[FIELD_OFFSET_PTR]]
@@ -369,7 +369,7 @@ extension ResilientGenericOutsideParent {
369369
// CHECK: [[BASE:%.*]] = load [[INT]], [[INT]]* getelementptr inbounds ([[BOUNDS]], [[BOUNDS]]* @"$S16class_resilience14ResilientChildCMo", i32 0, i32 0)
370370
// CHECK: [[OFFSET:%.*]] = add [[INT]] [[BASE]], {{12|24}}
371371

372-
// CHECK: call void @swift_initClassMetadata_UniversalStrategy(%swift.type* [[METADATA]], [[INT]] 1, i8*** {{.*}}, [[INT]]* {{.*}})
372+
// CHECK: call void @swift_initClassMetadata(%swift.type* [[METADATA]], [[INT]] 0, [[INT]] 1, i8*** {{.*}}, [[INT]]* {{.*}})
373373

374374
// Initialize constructor vtable override...
375375
// CHECK: [[BASE:%.*]] = load [[INT]], [[INT]]* getelementptr inbounds ([[BOUNDS]], [[BOUNDS]]* @"$S15resilient_class22ResilientOutsideParentCMo", i32 0, i32 0)
@@ -452,5 +452,5 @@ extension ResilientGenericOutsideParent {
452452
// CHECK: [[SUPER_ADDR:%.*]] = getelementptr inbounds %swift.type*, %swift.type** [[T0]], i32 1
453453
// CHECK: store %swift.type* [[SUPER]], %swift.type** [[SUPER_ADDR]],
454454

455-
// CHECK: call void @swift_initClassMetadata_UniversalStrategy(%swift.type* [[METADATA]],
455+
// CHECK: call void @swift_initClassMetadata(%swift.type* [[METADATA]], [[INT]] 0,
456456
// CHECK: ret %swift.metadata_response zeroinitializer

test/IRGen/concrete_inherits_generic_base.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,6 @@ presentBase(Base(x: 2))
8080
// CHECK: [[TMP:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
8181
// CHECK-NEXT: store %swift.type* [[TMP]], %swift.type** getelementptr inbounds ({{.*}} @"$S3foo12SuperDerivedCMf{{.*}}, i32 1), align
8282
// CHECK: [[METADATA:%.*]] = call %swift.type* @swift_relocateClassMetadata({{.*}}, [[INT]] {{60|96}}, [[INT]] 0)
83-
// CHECK: call void @swift_initClassMetadata_UniversalStrategy(%swift.type* [[METADATA]], [[INT]] 0, {{.*}})
83+
// CHECK: call void @swift_initClassMetadata(%swift.type* [[METADATA]], [[INT]] 0, {{.*}})
8484
// CHECK: store atomic %swift.type* [[METADATA]], %swift.type** @"$S3foo12SuperDerivedCML" release,
8585
// CHECK: ret void

test/IRGen/generic_classes.sil

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -345,15 +345,15 @@ entry(%c : $RootGeneric<Int32>):
345345
// CHECK-LABEL: define{{( protected)?}} internal swiftcc %swift.metadata_response @"$S15generic_classes11RootGenericCMr"
346346
// CHECK-SAME: (%swift.type* [[METADATA:%.*]], i8*, i8**) {{.*}} {
347347
// -- initialize the dependent field offsets
348-
// CHECK: call void @swift_initClassMetadata_UniversalStrategy(%swift.type* [[METADATA]], i64 3, i8*** {{%.*}}, i64* {{%.*}})
348+
// CHECK: call void @swift_initClassMetadata(%swift.type* [[METADATA]], i64 0, i64 3, i8*** {{%.*}}, i64* {{%.*}})
349349
// CHECK: }
350350

351351
// CHECK-LABEL: define{{( protected)?}} internal %swift.type* @"$S15generic_classes22RootGenericFixedLayoutCMi"(%swift.type_descriptor*, i8**, i8**) {{.*}} {
352352
// CHECK: [[METADATA:%.*]] ={{( tail)?}} call %swift.type* @swift_allocateGenericClassMetadata(%swift.type_descriptor* %0, i8** %1, i8** %2)
353353

354354
// CHECK-LABEL: define{{( protected)?}} internal swiftcc %swift.metadata_response @"$S15generic_classes22RootGenericFixedLayoutCMr"
355355
// CHECK-SAME: (%swift.type* [[METADATA:%.*]], i8*, i8**) {{.*}} {
356-
// CHECK: call void @swift_initClassMetadata_UniversalStrategy(%swift.type* [[METADATA]], i64 3, i8*** {{%.*}}, i64* {{%.*}})
356+
// CHECK: call void @swift_initClassMetadata(%swift.type* [[METADATA]], i64 0, i64 3, i8*** {{%.*}}, i64* {{%.*}})
357357
// CHECK: }
358358

359359
// CHECK-LABEL: define{{( protected)?}} internal %swift.type* @"$S15generic_classes015GenericInheritsC0CMi"(%swift.type_descriptor*, i8**, i8**) {{.*}} {
@@ -383,7 +383,7 @@ entry(%c : $RootGeneric<Int32>):
383383
// CHECK: [[T0:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32 9
384384
// CHECK: [[T1:%.*]] = getelementptr inbounds i8**, i8*** [[FIELDS_ADDR]], i32 0
385385
// CHECK: store i8** [[T0]], i8*** [[T1]], align 8
386-
// CHECK: call void @swift_initClassMetadata_UniversalStrategy(%swift.type* [[METADATA]], i64 1, i8*** [[FIELDS_ADDR]], i64* [[OFFSETS]])
386+
// CHECK: call void @swift_initClassMetadata(%swift.type* [[METADATA]], i64 0, i64 1, i8*** [[FIELDS_ADDR]], i64* [[OFFSETS]])
387387
// CHECK: ret %swift.metadata_response zeroinitializer
388388
// CHECK: }
389389

test/IRGen/generic_vtable.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public class Concrete : Derived<Int> {
108108

109109
// CHECK-LABEL: define internal swiftcc %swift.metadata_response @"$S14generic_vtable7DerivedCMr"
110110
// CHECK-SAME: (%swift.type* [[METADATA:%.*]], i8*, i8**) {{.*}} {
111-
// CHECK: call void @swift_initClassMetadata_UniversalStrategy(%swift.type* [[METADATA]], i64 0, {{.*}})
111+
// CHECK: call void @swift_initClassMetadata(%swift.type* [[METADATA]], i64 0, {{.*}})
112112

113113
// -- method override for 'm2()'
114114
// CHECK: [[WORDS:%.*]] = bitcast %swift.type* [[METADATA]] to i8**
@@ -131,7 +131,7 @@ public class Concrete : Derived<Int> {
131131
// CHECK: [[SUPERCLASS:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
132132
// CHECK: store %swift.type* [[SUPERCLASS]], %swift.type** getelementptr inbounds {{.*}} @"$S14generic_vtable8ConcreteCMf"
133133
// CHECK: [[METADATA:%.*]] = call %swift.type* @swift_relocateClassMetadata({{.*}}, i64 96, i64 1)
134-
// CHECK: call void @swift_initClassMetadata_UniversalStrategy(%swift.type* [[METADATA]], i64 0, {{.*}})
134+
// CHECK: call void @swift_initClassMetadata(%swift.type* [[METADATA]], i64 0, {{.*}})
135135

136136
// -- method override for 'init()'
137137
// CHECK: store i8* bitcast (%T14generic_vtable8ConcreteC* (%T14generic_vtable8ConcreteC*)* @"$S14generic_vtable8ConcreteCACycfc" to i8*), i8**

test/IRGen/mixed_mode_class_with_unimportable_fields.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ public func invokeMethod(on holder: SubButtHolder) {
6767
}
6868

6969
// CHECK-V3-LABEL: define private void @initialize_metadata_SubButtHolder
70-
// CHECK-V3: call void @swift_initClassMetadata_UniversalStrategy
70+
// CHECK-V3: call void @swift_initClassMetadata(
7171

7272
// CHECK-V3-LABEL: define private void @initialize_metadata_SubSubButtHolder
73-
// CHECK-V3: call void @swift_initClassMetadata_UniversalStrategy
73+
// CHECK-V3: call void @swift_initClassMetadata(
7474

0 commit comments

Comments
 (0)