Skip to content

Commit 949029a

Browse files
committed
[metadata prespecialization] Create enum records.
Extracted implementation of SpecializedGenericStructMetadataBuilder into SpecializedGenericNominalMetadataBuilderBase, a CRTP with a template template argument for the CRTP superclass and a template argument for the implementation. That new type is now subclassed by SpecializedGenericStructMetadataBuilder. Additionally, this new type is also subclassed by the newly added SpecializedGenericEnumMetadataBuilder which is responsible for build the prespecialization of generic enum metadata. rdar://problem/56960887
1 parent 518509d commit 949029a

File tree

5 files changed

+233
-45
lines changed

5 files changed

+233
-45
lines changed

include/swift/ABI/Metadata.h

+26
Original file line numberDiff line numberDiff line change
@@ -1426,6 +1426,32 @@ struct TargetEnumMetadata : public TargetValueMetadata<Runtime> {
14261426
return *asWords;
14271427
}
14281428

1429+
bool isCanonicalStaticallySpecializedGenericMetadata() const {
1430+
auto *description = getDescription();
1431+
if (!description->isGeneric())
1432+
return false;
1433+
1434+
auto *trailingFlags = getTrailingFlags();
1435+
if (trailingFlags == nullptr)
1436+
return false;
1437+
1438+
return trailingFlags->isCanonicalStaticSpecialization();
1439+
}
1440+
1441+
const MetadataTrailingFlags *getTrailingFlags() const {
1442+
auto description = getDescription();
1443+
auto flags = description->getFullGenericContextHeader()
1444+
.DefaultInstantiationPattern->PatternFlags;
1445+
if (!flags.hasTrailingFlags())
1446+
return nullptr;
1447+
auto offset =
1448+
getGenericArgumentOffset() +
1449+
description->getFullGenericContextHeader().Base.getNumArguments() +
1450+
(hasPayloadSize() ? 1 : 0);
1451+
auto asWords = reinterpret_cast<const void *const *>(this);
1452+
return reinterpret_cast<const MetadataTrailingFlags *>(asWords + offset);
1453+
}
1454+
14291455
static constexpr int32_t getGenericArgumentOffset() {
14301456
return sizeof(TargetEnumMetadata<Runtime>) / sizeof(StoredPointer);
14311457
}

lib/IRGen/EnumMetadataVisitor.h

+9
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ template <class Impl> class EnumMetadataVisitor
6262
Target->getDeclaredTypeInContext()->getCanonicalType());
6363
if (strategy.needsPayloadSizeInMetadata())
6464
asImpl().addPayloadSize();
65+
66+
if (asImpl().hasTrailingFlags())
67+
asImpl().addTrailingFlags();
68+
}
69+
70+
bool hasTrailingFlags() {
71+
return Target->isGenericContext() &&
72+
IGM.shouldPrespecializeGenericMetadata();
6573
}
6674
};
6775

@@ -86,6 +94,7 @@ class EnumMetadataScanner : public EnumMetadataVisitor<Impl> {
8694
void addGenericWitnessTable(GenericRequirement requirement) { addPointer(); }
8795
void addPayloadSize() { addPointer(); }
8896
void noteStartOfTypeSpecificMembers() {}
97+
void addTrailingFlags() { addPointer(); }
8998

9099
private:
91100
void addPointer() {

0 commit comments

Comments
 (0)