Skip to content

Commit f2bb319

Browse files
committed
Change the pattern of generic class metadata instantiation.
Minimize the generic class metadata template by removing the class header and base-class members. Add back the set of information that's really required for instantiation. Teach swift_allocateGenericClass how to allocate classes without superclass metadata. Reorder generic initialization to establish a stronger phase-ordering between allocation (the part that doesn't really care about the generic arguments) and initialization (the part that really does care about the generic arguments and therefore might need to be delayed to handle metadata cycles). A similar thing needs to happen for resilient class relocation.
1 parent 6729f2f commit f2bb319

23 files changed

+932
-547
lines changed

Diff for: include/swift/ABI/MetadataValues.h

+7
Original file line numberDiff line numberDiff line change
@@ -1021,6 +1021,10 @@ class TypeContextDescriptorFlags : public FlagSet<uint16_t> {
10211021
/// Only meaningful for class descriptors.
10221022
Class_SuperclassReferenceKind = 12,
10231023
Class_SuperclassReferenceKind_width = 2,
1024+
1025+
/// Whether the immediate class members in this metadata are allocated
1026+
/// at negative offsets. For now, we don't use this.
1027+
Class_AreImmediateMembersNegative = 11,
10241028
};
10251029

10261030
public:
@@ -1037,6 +1041,9 @@ class TypeContextDescriptorFlags : public FlagSet<uint16_t> {
10371041
FLAGSET_DEFINE_FLAG_ACCESSORS(Class_HasResilientSuperclass,
10381042
class_hasResilientSuperclass,
10391043
class_setHasResilientSuperclass)
1044+
FLAGSET_DEFINE_FLAG_ACCESSORS(Class_AreImmediateMembersNegative,
1045+
class_areImmediateMembersNegative,
1046+
class_setAreImmediateMembersNegative)
10401047

10411048
FLAGSET_DEFINE_FIELD_ACCESSORS(Class_SuperclassReferenceKind,
10421049
Class_SuperclassReferenceKind_width,

Diff for: include/swift/Remote/MetadataReader.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ class MetadataReader {
233233
return StoredPointer();
234234

235235
auto classMeta = cast<TargetClassMetadata<Runtime>>(meta);
236-
return classMeta->SuperClass;
236+
return classMeta->Superclass;
237237
}
238238

239239
/// Given a remote pointer to class metadata, attempt to discover its class
@@ -548,10 +548,10 @@ class MetadataReader {
548548
if (!classMetadata)
549549
return llvm::None;
550550

551-
if (!classMetadata->SuperClass)
551+
if (!classMetadata->Superclass)
552552
return type->getGenericArgumentOffset(nullptr, nullptr);
553553

554-
auto superMetadata = readMetadata(classMetadata->SuperClass);
554+
auto superMetadata = readMetadata(classMetadata->Superclass);
555555
if (!superMetadata)
556556
return llvm::None;
557557

@@ -921,7 +921,7 @@ class MetadataReader {
921921
if (descriptorAddress || !skipArtificialSubclasses)
922922
return static_cast<StoredPointer>(descriptorAddress);
923923

924-
auto superclassMetadataAddress = classMeta->SuperClass;
924+
auto superclassMetadataAddress = classMeta->Superclass;
925925
if (!superclassMetadataAddress)
926926
return 0;
927927

0 commit comments

Comments
 (0)