Skip to content

Commit 9807442

Browse files
committed
SIL: Remove SILWitnessTable::ConditionalConformance
1 parent 66e5910 commit 9807442

File tree

12 files changed

+37
-55
lines changed

12 files changed

+37
-55
lines changed

include/swift/SIL/SILWitnessTable.h

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,6 @@ class SILWitnessTable : public llvm::ilist_node<SILWitnessTable>,
154154
const PrintOptions &options) const;
155155
};
156156

157-
/// An entry for a conformance requirement that makes the requirement
158-
/// conditional. These aren't public, but any witness thunks need to feed them
159-
/// into the true witness functions.
160-
struct ConditionalConformance {
161-
/// FIXME: Temporary.
162-
CanType Requirement;
163-
ProtocolConformanceRef Conformance;
164-
};
165-
166157
private:
167158
/// The module which contains the SILWitnessTable.
168159
SILModule &Mod;
@@ -186,7 +177,7 @@ class SILWitnessTable : public llvm::ilist_node<SILWitnessTable>,
186177
///
187178
/// (If other private entities are introduced this could/should be switched
188179
/// into a private version of Entries.)
189-
MutableArrayRef<ConditionalConformance> ConditionalConformances;
180+
MutableArrayRef<ProtocolConformanceRef> ConditionalConformances;
190181

191182
/// Whether or not this witness table is a declaration. This is separate from
192183
/// whether or not entries is empty since you can have an empty witness table
@@ -201,7 +192,7 @@ class SILWitnessTable : public llvm::ilist_node<SILWitnessTable>,
201192
SILWitnessTable(SILModule &M, SILLinkage Linkage, SerializedKind_t Serialized,
202193
StringRef name, ProtocolConformance *conformance,
203194
ArrayRef<Entry> entries,
204-
ArrayRef<ConditionalConformance> conditionalConformances);
195+
ArrayRef<ProtocolConformanceRef> conditionalConformances);
205196

206197
/// Private constructor for making SILWitnessTable declarations.
207198
SILWitnessTable(SILModule &M, SILLinkage Linkage, StringRef Name,
@@ -214,7 +205,7 @@ class SILWitnessTable : public llvm::ilist_node<SILWitnessTable>,
214205
static SILWitnessTable *
215206
create(SILModule &M, SILLinkage Linkage, SerializedKind_t SerializedKind,
216207
ProtocolConformance *conformance, ArrayRef<Entry> entries,
217-
ArrayRef<ConditionalConformance> conditionalConformances);
208+
ArrayRef<ProtocolConformanceRef> conditionalConformances);
218209

219210
/// Create a new SILWitnessTable declaration.
220211
static SILWitnessTable *create(SILModule &M, SILLinkage Linkage,
@@ -271,7 +262,7 @@ class SILWitnessTable : public llvm::ilist_node<SILWitnessTable>,
271262
ArrayRef<Entry> getEntries() const { return Entries; }
272263

273264
/// Return all of the conditional conformances.
274-
ArrayRef<ConditionalConformance> getConditionalConformances() const {
265+
ArrayRef<ProtocolConformanceRef> getConditionalConformances() const {
275266
return ConditionalConformances;
276267
}
277268

@@ -300,7 +291,7 @@ class SILWitnessTable : public llvm::ilist_node<SILWitnessTable>,
300291
/// Change a SILWitnessTable declaration into a SILWitnessTable definition.
301292
void
302293
convertToDefinition(ArrayRef<Entry> newEntries,
303-
ArrayRef<ConditionalConformance> conditionalConformances,
294+
ArrayRef<ProtocolConformanceRef> conditionalConformances,
304295
SerializedKind_t serializedKind);
305296

306297
// Gets conformance serialized kind.

lib/IRGen/GenProto.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1522,8 +1522,7 @@ class AccessorConformanceInfo : public ConformanceInfo {
15221522
SpecializedBaseConformances;
15231523

15241524
ArrayRef<SILWitnessTable::Entry> SILEntries;
1525-
ArrayRef<SILWitnessTable::ConditionalConformance>
1526-
SILConditionalConformances;
1525+
ArrayRef<ProtocolConformanceRef> SILConditionalConformances;
15271526

15281527
const ProtocolInfo &PI;
15291528

@@ -2107,10 +2106,10 @@ llvm::Function *FragileWitnessTableBuilder::buildInstantiationFunction() {
21072106
const auto &condConformance = SILConditionalConformances[idx];
21082107
CanType reqTypeInContext =
21092108
Conformance.getDeclContext()
2110-
->mapTypeIntoContext(condConformance.Requirement)
2109+
->mapTypeIntoContext(condConformance.getType())
21112110
->getCanonicalType();
21122111
if (auto archetype = dyn_cast<ArchetypeType>(reqTypeInContext)) {
2113-
auto condProto = condConformance.Conformance.getProtocol();
2112+
auto condProto = condConformance.getProtocol();
21142113
IGF.setUnscopedLocalTypeData(
21152114
archetype,
21162115
LocalTypeDataKind::forAbstractProtocolWitnessTable(condProto),

lib/SIL/IR/SILPrinter.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4392,18 +4392,21 @@ void SILWitnessTable::print(llvm::raw_ostream &OS, bool Verbose) const {
43924392
for (auto conditionalConformance : getConditionalConformances()) {
43934393
// conditional_conformance (TypeName: Protocol):
43944394
// <conformance>
4395-
if (conditionalConformance.Conformance.isInvalid())
4395+
if (conditionalConformance.isInvalid()) {
4396+
OS << " conditional_conformance invalid";
43964397
continue;
4398+
}
43974399

43984400
OS << " conditional_conformance (";
4399-
conditionalConformance.Requirement.print(OS, Options);
4400-
OS << ": " << conditionalConformance.Conformance.getProtocol()->getName()
4401+
conditionalConformance.getType().print(OS, Options);
4402+
OS << ": " << conditionalConformance.getProtocol()->getName()
44014403
<< "): ";
4402-
if (conditionalConformance.Conformance.isConcrete())
4403-
conditionalConformance.Conformance.getConcrete()->printName(OS, Options);
4404+
if (conditionalConformance.isConcrete())
4405+
conditionalConformance.getConcrete()->printName(OS, Options);
44044406
else {
4407+
ASSERT(conditionalConformance.isAbstract() && "Handle pack conformance here");
44054408
OS << "dependent ";
4406-
conditionalConformance.Requirement->print(OS, Options);
4409+
conditionalConformance.getType()->print(OS, Options);
44074410
}
44084411

44094412
OS << '\n';

lib/SIL/IR/SILWitnessTable.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ SILWitnessTable *SILWitnessTable::create(
6161
SILModule &M, SILLinkage Linkage, SerializedKind_t SerializedKind,
6262
ProtocolConformance *Conformance,
6363
ArrayRef<SILWitnessTable::Entry> entries,
64-
ArrayRef<ConditionalConformance> conditionalConformances) {
64+
ArrayRef<ProtocolConformanceRef> conditionalConformances) {
6565
assert(Conformance && "Cannot create a witness table for a null "
6666
"conformance.");
6767

@@ -106,7 +106,7 @@ SILWitnessTable::create(SILModule &M, SILLinkage Linkage,
106106
SILWitnessTable::SILWitnessTable(
107107
SILModule &M, SILLinkage Linkage, SerializedKind_t SerializedKind, StringRef N,
108108
ProtocolConformance *Conformance, ArrayRef<Entry> entries,
109-
ArrayRef<ConditionalConformance> conditionalConformances)
109+
ArrayRef<ProtocolConformanceRef> conditionalConformances)
110110
: Mod(M), Name(N), Linkage(Linkage), Conformance(Conformance), Entries(),
111111
ConditionalConformances(), IsDeclaration(true),
112112
SerializedKind(SerializedKind) {
@@ -142,7 +142,7 @@ SILWitnessTable::~SILWitnessTable() {
142142

143143
void SILWitnessTable::convertToDefinition(
144144
ArrayRef<Entry> entries,
145-
ArrayRef<ConditionalConformance> conditionalConformances,
145+
ArrayRef<ProtocolConformanceRef> conditionalConformances,
146146
SerializedKind_t serializedKind) {
147147
assert(isDeclaration() && "Definitions should never call this method.");
148148
IsDeclaration = false;

lib/SIL/Parser/ParseSIL.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8157,8 +8157,7 @@ static bool parseSILWitnessTableEntry(
81578157
GenericParamList *witnessParams,
81588158
SILParser &witnessState,
81598159
std::vector<SILWitnessTable::Entry> &witnessEntries,
8160-
std::vector<SILWitnessTable::ConditionalConformance>
8161-
&conditionalConformances) {
8160+
std::vector<ProtocolConformanceRef> &conditionalConformances) {
81628161
Identifier EntryKeyword;
81638162
SourceLoc KeywordLoc;
81648163
if (P.parseIdentifier(EntryKeyword, KeywordLoc,
@@ -8273,9 +8272,7 @@ static bool parseSILWitnessTableEntry(
82738272
substType,
82748273
conformance});
82758274
else
8276-
conditionalConformances.push_back(
8277-
SILWitnessTable::ConditionalConformance{assocOrSubject,
8278-
conformance});
8275+
conditionalConformances.push_back(conformance);
82798276

82808277
return false;
82818278
}
@@ -8420,7 +8417,7 @@ bool SILParserState::parseSILWitnessTable(Parser &P) {
84208417
Lexer::SILBodyRAII Tmp(*P.L);
84218418
// Parse the entry list.
84228419
std::vector<SILWitnessTable::Entry> witnessEntries;
8423-
std::vector<SILWitnessTable::ConditionalConformance> conditionalConformances;
8420+
std::vector<ProtocolConformanceRef> conditionalConformances;
84248421

84258422
if (P.Tok.isNot(tok::r_brace)) {
84268423
do {
@@ -8481,7 +8478,7 @@ bool SILParserState::parseSILDefaultWitnessTable(Parser &P) {
84818478

84828479
// Parse the entry list.
84838480
std::vector<SILWitnessTable::Entry> witnessEntries;
8484-
std::vector<SILWitnessTable::ConditionalConformance> conditionalConformances;
8481+
std::vector<ProtocolConformanceRef> conditionalConformances;
84858482

84868483
if (P.Tok.isNot(tok::r_brace)) {
84878484
do {

lib/SILGen/SILGenType.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -540,7 +540,7 @@ class SILGenConformance : public SILGenWitnessTable<SILGenConformance> {
540540
SILGenModule &SGM;
541541
NormalProtocolConformance *Conformance;
542542
std::vector<SILWitnessTable::Entry> Entries;
543-
std::vector<SILWitnessTable::ConditionalConformance> ConditionalConformances;
543+
std::vector<ProtocolConformanceRef> ConditionalConformances;
544544
SILLinkage Linkage;
545545
SerializedKind_t SerializedKind;
546546

@@ -708,8 +708,7 @@ class SILGenConformance : public SILGenWitnessTable<SILGenConformance> {
708708
assert(conformance &&
709709
"unable to find conformance that should be known");
710710

711-
ConditionalConformances.push_back(
712-
SILWitnessTable::ConditionalConformance{type, conformance});
711+
ConditionalConformances.push_back(conformance);
713712

714713
return /*finished?*/ false;
715714
});

lib/SILOptimizer/IPO/DeadFunctionElimination.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,8 @@ class DeadFunctionAndGlobalElimination {
219219
}
220220

221221
for (const auto &conf : WT->getConditionalConformances()) {
222-
if (conf.Conformance.isConcrete())
223-
ensureAliveConformance(conf.Conformance.getConcrete());
222+
if (conf.isConcrete())
223+
ensureAliveConformance(conf.getConcrete());
224224
}
225225
}
226226

lib/Serialization/DeserializeSIL.cpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4464,8 +4464,7 @@ void SILDeserializer::getAllProperties() {
44644464
void SILDeserializer::readWitnessTableEntries(
44654465
llvm::BitstreamEntry &entry,
44664466
std::vector<SILWitnessTable::Entry> &witnessEntries,
4467-
std::vector<SILWitnessTable::ConditionalConformance>
4468-
&conditionalConformances) {
4467+
std::vector<ProtocolConformanceRef> &conditionalConformances) {
44694468
SmallVector<uint64_t, 64> scratch;
44704469
llvm::Expected<unsigned> maybeKind = SILCursor.readRecord(entry.ID, scratch);
44714470
if (!maybeKind)
@@ -4525,14 +4524,11 @@ void SILDeserializer::readWitnessTableEntries(
45254524
assert(kind == SIL_WITNESS_CONDITIONAL_CONFORMANCE &&
45264525
"Content of WitnessTable should be in "
45274526
"SIL_WITNESS_CONDITIONAL_CONFORMANCE.");
4528-
TypeID assocId;
45294527
ProtocolConformanceID conformanceId;
4530-
WitnessConditionalConformanceLayout::readRecord(scratch, assocId,
4528+
WitnessConditionalConformanceLayout::readRecord(scratch,
45314529
conformanceId);
4532-
CanType type = MF->getType(assocId)->getCanonicalType();
45334530
auto conformance = MF->getConformance(conformanceId);
4534-
conditionalConformances.push_back(
4535-
SILWitnessTable::ConditionalConformance{type, conformance});
4531+
conditionalConformances.push_back(conformance);
45364532
}
45374533

45384534
// Fetch the next record.
@@ -4676,7 +4672,7 @@ llvm::Expected<SILWitnessTable *>
46764672
return nullptr;
46774673

46784674
std::vector<SILWitnessTable::Entry> witnessEntries;
4679-
std::vector<SILWitnessTable::ConditionalConformance> conditionalConformances;
4675+
std::vector<ProtocolConformanceRef> conditionalConformances;
46804676
readWitnessTableEntries(entry, witnessEntries, conditionalConformances);
46814677

46824678
// If we've already serialized the module, don't mark the witness table
@@ -4821,7 +4817,7 @@ readDefaultWitnessTable(DeclID WId, SILDefaultWitnessTable *existingWt) {
48214817
return nullptr;
48224818

48234819
std::vector<SILWitnessTable::Entry> witnessEntries;
4824-
std::vector<SILWitnessTable::ConditionalConformance> conditionalConformances;
4820+
std::vector<ProtocolConformanceRef> conditionalConformances;
48254821
readWitnessTableEntries(entry, witnessEntries, conditionalConformances);
48264822

48274823
wT->convertToDefinition(witnessEntries);

lib/Serialization/DeserializeSIL.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,7 @@ namespace swift {
179179
void readWitnessTableEntries(
180180
llvm::BitstreamEntry &entry,
181181
std::vector<SILWitnessTable::Entry> &witnessEntries,
182-
std::vector<SILWitnessTable::ConditionalConformance>
183-
&conditionalConformances);
182+
std::vector<ProtocolConformanceRef> &conditionalConformances);
184183
SILProperty *readProperty(serialization::DeclID);
185184
SILDefaultWitnessTable *
186185
readDefaultWitnessTable(serialization::DeclID,

lib/Serialization/ModuleFormat.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const uint16_t SWIFTMODULE_VERSION_MAJOR = 0;
5858
/// describe what change you made. The content of this comment isn't important;
5959
/// it just ensures a conflict if two people change the module format.
6060
/// Don't worry about adhering to the 80-column limit for this line.
61-
const uint16_t SWIFTMODULE_VERSION_MINOR = 935; // remove ExtensibleEnums feature
61+
const uint16_t SWIFTMODULE_VERSION_MINOR = 936; // Remove SILWitnessTable::ConditionalConformance
6262

6363
/// A standard hash seed used for all string hashes in a serialized module.
6464
///

lib/Serialization/SILFormat.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,6 @@ namespace sil_block {
261261

262262
using WitnessConditionalConformanceLayout = BCRecordLayout<
263263
SIL_WITNESS_CONDITIONAL_CONFORMANCE,
264-
TypeIDField, // ID of associated type
265264
ProtocolConformanceIDField // ID of conformance
266265
>;
267266

lib/Serialization/SerializeSIL.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3374,12 +3374,11 @@ void SILSerializer::writeSILWitnessTable(const SILWitnessTable &wt) {
33743374
}
33753375

33763376
for (auto conditional : wt.getConditionalConformances()) {
3377-
auto requirementID = S.addTypeRef(conditional.Requirement);
3378-
auto conformanceID = S.addConformanceRef(conditional.Conformance);
3377+
auto conformanceID = S.addConformanceRef(conditional);
33793378
WitnessConditionalConformanceLayout::emitRecord(
33803379
Out, ScratchRecord,
33813380
SILAbbrCodes[WitnessConditionalConformanceLayout::Code],
3382-
requirementID, conformanceID);
3381+
conformanceID);
33833382
}
33843383
}
33853384

0 commit comments

Comments
 (0)