Skip to content

Commit 9f3267b

Browse files
committed
IRGen: Refactor NominalMetadataVisitor.h
1 parent e5e4e26 commit 9f3267b

6 files changed

+36
-68
lines changed

lib/IRGen/ClassMetadataVisitor.h

+1-5
Original file line numberDiff line numberDiff line change
@@ -252,11 +252,7 @@ class ClassMetadataScanner : public ClassMetadataVisitor<Impl> {
252252
addPointer();
253253
}
254254
}
255-
void addGenericArgument(GenericRequirement requirement, ClassDecl *forClass) {
256-
addPointer();
257-
}
258-
void addGenericWitnessTable(GenericRequirement requirement,
259-
ClassDecl *forClass) {
255+
void addGenericRequirement(GenericRequirement requirement, ClassDecl *forClass) {
260256
addPointer();
261257
}
262258
void addPlaceholder(MissingMemberDecl *MMD) {

lib/IRGen/EnumMetadataVisitor.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,7 @@ class EnumMetadataScanner : public EnumMetadataVisitor<Impl> {
9393
void addMetadataFlags() { addPointer(); }
9494
void addValueWitnessTable() { addPointer(); }
9595
void addNominalTypeDescriptor() { addPointer(); }
96-
void addGenericArgument(GenericRequirement requirement) { addPointer(); }
97-
void addGenericWitnessTable(GenericRequirement requirement) { addPointer(); }
96+
void addGenericRequirement(GenericRequirement requirement) { addPointer(); }
9897
void addPayloadSize() { addPointer(); }
9998
void noteStartOfTypeSpecificMembers() {}
10099
void addTrailingFlags() { addInt64(); }

lib/IRGen/GenMeta.cpp

+29-42
Original file line numberDiff line numberDiff line change
@@ -3851,13 +3851,8 @@ namespace {
38513851
llvm_unreachable("Fixed class metadata cannot have missing members");
38523852
}
38533853

3854-
void addGenericArgument(GenericRequirement requirement,
3855-
ClassDecl *forClass) {
3856-
llvm_unreachable("Fixed class metadata cannot have generic parameters");
3857-
}
3858-
3859-
void addGenericWitnessTable(GenericRequirement requirement,
3860-
ClassDecl *forClass) {
3854+
void addGenericRequirement(GenericRequirement requirement,
3855+
ClassDecl *forClass) {
38613856
llvm_unreachable("Fixed class metadata cannot have generic requirements");
38623857
}
38633858
};
@@ -3899,16 +3894,19 @@ namespace {
38993894
}
39003895
}
39013896

3902-
void addGenericArgument(GenericRequirement requirement,
3903-
ClassDecl *forClass) {
3904-
// Filled in at runtime.
3905-
B.addNullPointer(IGM.TypeMetadataPtrTy);
3906-
}
3907-
3908-
void addGenericWitnessTable(GenericRequirement requirement,
3909-
ClassDecl *forClass) {
3910-
// Filled in at runtime.
3911-
B.addNullPointer(IGM.WitnessTablePtrTy);
3897+
void addGenericRequirement(GenericRequirement requirement,
3898+
ClassDecl *forClass) {
3899+
switch (requirement.getKind()) {
3900+
case GenericRequirement::Kind::Shape:
3901+
B.addInt(IGM.SizeTy, 0);
3902+
break;
3903+
case GenericRequirement::Kind::Metadata:
3904+
B.addNullPointer(IGM.TypeMetadataPtrTy);
3905+
break;
3906+
case GenericRequirement::Kind::WitnessTable:
3907+
B.addNullPointer(IGM.WitnessTablePtrTy);
3908+
break;
3909+
}
39123910
}
39133911
};
39143912

@@ -4249,14 +4247,16 @@ namespace {
42494247
return emitValueWitnessTable(relativeReference);
42504248
}
42514249

4252-
void addGenericArgument(GenericRequirement requirement) {
4253-
auto t = requirement.getTypeParameter().subst(genericSubstitutions());
4254-
ConstantReference ref = IGM.getAddrOfTypeMetadata(
4255-
CanType(t), SymbolReferenceKind::Relative_Direct);
4256-
this->B.add(ref.getDirectValue());
4257-
}
4250+
void addGenericRequirement(GenericRequirement requirement) {
4251+
if (requirement.isMetadata()) {
4252+
auto t = requirement.getTypeParameter().subst(genericSubstitutions());
4253+
ConstantReference ref = IGM.getAddrOfTypeMetadata(
4254+
CanType(t), SymbolReferenceKind::Relative_Direct);
4255+
this->B.add(ref.getDirectValue());
4256+
return;
4257+
}
42584258

4259-
void addGenericWitnessTable(GenericRequirement requirement) {
4259+
assert(requirement.isWitnessTable());
42604260
auto conformance = genericSubstitutions().lookupConformance(
42614261
requirement.getTypeParameter()->getCanonicalType(),
42624262
requirement.getProtocol());
@@ -4334,14 +4334,9 @@ namespace {
43344334
const ClassLayout &fieldLayout)
43354335
: super(IGM, type, decl, B, fieldLayout), FieldLayout(fieldLayout) {}
43364336

4337-
void addGenericArgument(GenericRequirement requirement,
4338-
ClassDecl *theClass) {
4339-
super::addGenericArgument(requirement);
4340-
}
4341-
4342-
void addGenericWitnessTable(GenericRequirement requirement,
4343-
ClassDecl *theClass) {
4344-
super::addGenericWitnessTable(requirement);
4337+
void addGenericRequirement(GenericRequirement requirement,
4338+
ClassDecl *theClass) {
4339+
super::addGenericRequirement(requirement);
43454340
}
43464341

43474342
void addFieldOffsetPlaceholders(MissingMemberDecl *placeholder) {
@@ -4800,11 +4795,7 @@ namespace {
48004795
B.addAlignmentPadding(super::IGM.getPointerAlignment());
48014796
}
48024797

4803-
void addGenericArgument(GenericRequirement requirement) {
4804-
llvm_unreachable("Concrete type metadata cannot have generic parameters");
4805-
}
4806-
4807-
void addGenericWitnessTable(GenericRequirement requirement) {
4798+
void addGenericRequirement(GenericRequirement requirement) {
48084799
llvm_unreachable("Concrete type metadata cannot have generic requirements");
48094800
}
48104801

@@ -5169,11 +5160,7 @@ namespace {
51695160
PointerAuthEntity::Special::TypeDescriptor);
51705161
}
51715162

5172-
void addGenericArgument(GenericRequirement requirement) {
5173-
llvm_unreachable("Concrete type metadata cannot have generic parameters");
5174-
}
5175-
5176-
void addGenericWitnessTable(GenericRequirement requirement) {
5163+
void addGenericRequirement(GenericRequirement requirement) {
51775164
llvm_unreachable("Concrete type metadata cannot have generic requirements");
51785165
}
51795166

lib/IRGen/MetadataLayout.cpp

+3-11
Original file line numberDiff line numberDiff line change
@@ -317,20 +317,12 @@ ClassMetadataLayout::ClassMetadataLayout(IRGenModule &IGM, ClassDecl *decl)
317317
super::noteStartOfGenericRequirements(forClass);
318318
}
319319

320-
void addGenericWitnessTable(GenericRequirement requirement,
321-
ClassDecl *forClass) {
320+
void addGenericRequirement(GenericRequirement requirement,
321+
ClassDecl *forClass) {
322322
if (forClass == Target) {
323323
++Layout.NumImmediateMembers;
324324
}
325-
super::addGenericWitnessTable(requirement, forClass);
326-
}
327-
328-
void addGenericArgument(GenericRequirement requirement,
329-
ClassDecl *forClass) {
330-
if (forClass == Target) {
331-
++Layout.NumImmediateMembers;
332-
}
333-
super::addGenericArgument(requirement, forClass);
325+
super::addGenericRequirement(requirement, forClass);
334326
}
335327

336328
void addReifiedVTableEntry(SILDeclRef fn) {

lib/IRGen/NominalMetadataVisitor.h

+1-6
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,7 @@ template <class Impl> class NominalMetadataVisitor
5353

5454
GenericTypeRequirements requirements(super::IGM, typeDecl);
5555
for (auto reqt : requirements.getRequirements()) {
56-
if (reqt.isWitnessTable()) {
57-
asImpl().addGenericWitnessTable(reqt, args...);
58-
} else {
59-
assert(reqt.isMetadata());
60-
asImpl().addGenericArgument(reqt, args...);
61-
}
56+
asImpl().addGenericRequirement(reqt, args...);
6257
}
6358

6459
asImpl().noteEndOfGenericRequirements(args...);

lib/IRGen/StructMetadataVisitor.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,7 @@ class StructMetadataScanner : public StructMetadataVisitor<Impl> {
9999
void addValueWitnessTable() { addPointer(); }
100100
void addNominalTypeDescriptor() { addPointer(); }
101101
void addFieldOffset(VarDecl *) { addInt32(); }
102-
void addGenericArgument(GenericRequirement requirement) { addPointer(); }
103-
void addGenericWitnessTable(GenericRequirement requirement) { addPointer(); }
102+
void addGenericRequirement(GenericRequirement requirement) { addPointer(); }
104103
void noteStartOfTypeSpecificMembers() {}
105104

106105
void noteEndOfFieldOffsets() {

0 commit comments

Comments
 (0)