Skip to content

Commit b628710

Browse files
Merge pull request #29345 from nate-chandler/generic-metadata-prespecialization-components/enums
Generic metadata prespecialization: enums
2 parents 0976e39 + 40e17d9 commit b628710

File tree

40 files changed

+5931
-70
lines changed

40 files changed

+5931
-70
lines changed

include/swift/ABI/Metadata.h

Lines changed: 26 additions & 0 deletions
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

Lines changed: 9 additions & 0 deletions
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)