Skip to content

Commit 84890b6

Browse files
committed
IRGen: Move a few things from WitnessTableBuilderBase to FragileWitnessTableBuilder
1 parent 3eb9b15 commit 84890b6

File tree

1 file changed

+32
-58
lines changed

1 file changed

+32
-58
lines changed

lib/IRGen/GenProto.cpp

Lines changed: 32 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,25 +1148,18 @@ class AccessorConformanceInfo : public ConformanceInfo {
11481148
}
11491149
};
11501150

1151+
/// A base class for some code shared between fragile and resilient witness
1152+
/// table layout.
11511153
class WitnessTableBuilderBase {
11521154
protected:
11531155
IRGenModule &IGM;
11541156
SILWitnessTable *SILWT;
11551157
CanType ConcreteType;
11561158
const RootProtocolConformance &Conformance;
11571159
const ProtocolConformance &ConformanceInContext;
1158-
ArrayRef<SILWitnessTable::Entry> SILEntries;
1159-
ArrayRef<SILWitnessTable::ConditionalConformance>
1160-
SILConditionalConformances;
11611160

11621161
Optional<FulfillmentMap> Fulfillments;
11631162

1164-
SmallVector<size_t, 4> ConditionalRequirementPrivateDataIndices;
1165-
1166-
// Conditional conformances and metadata caches are stored at negative
1167-
// offsets, with conditional conformances closest to 0.
1168-
unsigned NextPrivateDataIndex = 0;
1169-
11701163
WitnessTableBuilderBase(IRGenModule &IGM, SILWitnessTable *SILWT)
11711164
: IGM(IGM), SILWT(SILWT),
11721165
ConcreteType(SILWT->getConformance()->getDeclContext()
@@ -1176,21 +1169,7 @@ class AccessorConformanceInfo : public ConformanceInfo {
11761169
Conformance(*SILWT->getConformance()),
11771170
ConformanceInContext(
11781171
mapConformanceIntoContext(IGM, Conformance,
1179-
Conformance.getDeclContext())),
1180-
SILEntries(SILWT->getEntries()),
1181-
SILConditionalConformances(SILWT->getConditionalConformances()) {}
1182-
1183-
void addConditionalConformances() {
1184-
assert(NextPrivateDataIndex == 0);
1185-
for (auto conditional : SILConditionalConformances) {
1186-
// We don't actually need to know anything about the specific
1187-
// conformances here, just make sure we get right private data slots.
1188-
(void)conditional;
1189-
1190-
auto reqtIndex = getNextPrivateDataIndex();
1191-
ConditionalRequirementPrivateDataIndices.push_back(reqtIndex);
1192-
}
1193-
}
1172+
Conformance.getDeclContext())) {}
11941173

11951174
void defineAssociatedTypeWitnessTableAccessFunction(
11961175
AssociatedConformance requirement,
@@ -1202,11 +1181,6 @@ class AccessorConformanceInfo : public ConformanceInfo {
12021181
CanType associatedType,
12031182
ProtocolConformanceRef conformance);
12041183

1205-
/// Allocate another word of private data storage in the conformance table.
1206-
unsigned getNextPrivateDataIndex() {
1207-
return NextPrivateDataIndex++;
1208-
}
1209-
12101184
const FulfillmentMap &getFulfillmentMap() {
12111185
if (Fulfillments) return *Fulfillments;
12121186

@@ -1239,39 +1213,52 @@ class AccessorConformanceInfo : public ConformanceInfo {
12391213
}
12401214
return *Fulfillments;
12411215
}
1242-
1243-
/// The top-level entry point.
1244-
void build() {
1245-
addConditionalConformances();
1246-
}
1247-
1248-
public:
1249-
/// The number of private entries in the witness table.
1250-
unsigned getTablePrivateSize() const { return NextPrivateDataIndex; }
12511216
};
12521217

1253-
/// A class which lays out a specific conformance to a protocol.
1218+
/// A fragile witness table is emitted to look like one in memory, except
1219+
/// possibly with some blank slots which are filled in by an instantiation
1220+
/// function.
12541221
class FragileWitnessTableBuilder : public WitnessTableBuilderBase,
12551222
public SILWitnessVisitor<FragileWitnessTableBuilder> {
12561223
ConstantArrayBuilder &Table;
12571224
unsigned TableSize = ~0U; // will get overwritten unconditionally
12581225
SmallVector<std::pair<size_t, const ConformanceInfo *>, 4>
12591226
SpecializedBaseConformances;
12601227

1228+
ArrayRef<SILWitnessTable::Entry> SILEntries;
1229+
ArrayRef<SILWitnessTable::ConditionalConformance>
1230+
SILConditionalConformances;
1231+
12611232
const ProtocolInfo &PI;
12621233

1234+
SmallVector<size_t, 4> ConditionalRequirementPrivateDataIndices;
1235+
1236+
void addConditionalConformances() {
1237+
for (auto reqtIndex : indices(SILConditionalConformances)) {
1238+
// We don't actually need to know anything about the specific
1239+
// conformances here, just make sure we get right private data slots.
1240+
ConditionalRequirementPrivateDataIndices.push_back(reqtIndex);
1241+
}
1242+
}
1243+
12631244
public:
12641245
FragileWitnessTableBuilder(IRGenModule &IGM, ConstantArrayBuilder &table,
12651246
SILWitnessTable *SILWT)
12661247
: WitnessTableBuilderBase(IGM, SILWT), Table(table),
1248+
SILEntries(SILWT->getEntries()),
1249+
SILConditionalConformances(SILWT->getConditionalConformances()),
12671250
PI(IGM.getProtocolInfo(SILWT->getConformance()->getProtocol(),
12681251
ProtocolInfoKind::Full)) {}
12691252

12701253
/// The number of entries in the witness table.
12711254
unsigned getTableSize() const { return TableSize; }
12721255

12731256
/// The top-level entry point.
1274-
void build();
1257+
void build() {
1258+
addConditionalConformances();
1259+
visitProtocolDecl(Conformance.getProtocol());
1260+
TableSize = Table.size();
1261+
}
12751262

12761263
/// Add reference to the protocol conformance descriptor that generated
12771264
/// this table.
@@ -1432,29 +1419,22 @@ class AccessorConformanceInfo : public ConformanceInfo {
14321419
llvm::Constant *buildInstantiationFunction();
14331420
};
14341421

1422+
/// A resilient witness table consists of a list of descriptor/witness pairs,
1423+
/// and a runtime function builds the actual witness table in memory, placing
1424+
/// entries in the correct oder and filling in default implementations as
1425+
/// needed.
14351426
class ResilientWitnessTableBuilder : public WitnessTableBuilderBase {
14361427
public:
14371428
ResilientWitnessTableBuilder(IRGenModule &IGM, SILWitnessTable *SILWT)
14381429
: WitnessTableBuilderBase(IGM, SILWT) {}
14391430

1440-
void build() {
1441-
WitnessTableBuilderBase::build();
1442-
}
1443-
14441431
/// Collect the set of resilient witnesses, which will become part of the
14451432
/// protocol conformance descriptor.
14461433
void collectResilientWitnesses(
14471434
SmallVectorImpl<llvm::Constant *> &resilientWitnesses);
14481435
};
14491436
} // end anonymous namespace
14501437

1451-
/// Build the witness table.
1452-
void FragileWitnessTableBuilder::build() {
1453-
WitnessTableBuilderBase::build();
1454-
visitProtocolDecl(Conformance.getProtocol());
1455-
TableSize = Table.size();
1456-
}
1457-
14581438
llvm::Constant *IRGenModule::getAssociatedTypeWitness(Type type,
14591439
GenericSignature sig,
14601440
bool inProtocolContext) {
@@ -2148,7 +2128,6 @@ void IRGenModule::emitSILWitnessTable(SILWitnessTable *wt) {
21482128
PrettyStackTraceConformance _st(Context, "emitting witness table for", conf);
21492129

21502130
unsigned tableSize = 0;
2151-
unsigned tablePrivateSize = 0;
21522131
llvm::GlobalVariable *global = nullptr;
21532132
llvm::Constant *instantiationFunction = nullptr;
21542133
bool isDependent = isDependentConformance(conf);
@@ -2174,23 +2153,18 @@ void IRGenModule::emitSILWitnessTable(SILWitnessTable *wt) {
21742153
llvm::MaybeAlign(getWitnessTableAlignment().getValue()));
21752154

21762155
tableSize = wtableBuilder.getTableSize();
2177-
tablePrivateSize = wtableBuilder.getTablePrivateSize();
2178-
21792156
instantiationFunction = wtableBuilder.buildInstantiationFunction();
21802157
} else {
21812158
// Build the witness table.
21822159
ResilientWitnessTableBuilder wtableBuilder(*this, wt);
2183-
wtableBuilder.build();
21842160

21852161
// Collect the resilient witnesses to go into the conformance descriptor.
21862162
wtableBuilder.collectResilientWitnesses(resilientWitnesses);
2187-
2188-
tableSize = 0;
2189-
tablePrivateSize = wtableBuilder.getTablePrivateSize();
21902163
}
21912164

21922165
// Collect the information that will go into the protocol conformance
21932166
// descriptor.
2167+
unsigned tablePrivateSize = wt->getConditionalConformances().size();
21942168
ConformanceDescription description(conf, wt, global, tableSize,
21952169
tablePrivateSize, isDependent);
21962170

0 commit comments

Comments
 (0)