Skip to content

Commit 3eb9b15

Browse files
committed
IRGen: Split up WitnessTableBuilder into {Fragile,Resilient}WitnessTableBuilder
This eliminates the need to 'abandon' the initializer for the fragile witness table, which resilient conformances do not need or use.
1 parent 305af04 commit 3eb9b15

File tree

1 file changed

+19
-39
lines changed

1 file changed

+19
-39
lines changed

lib/IRGen/GenProto.cpp

Lines changed: 19 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1251,26 +1251,21 @@ class AccessorConformanceInfo : public ConformanceInfo {
12511251
};
12521252

12531253
/// A class which lays out a specific conformance to a protocol.
1254-
class WitnessTableBuilder : public WitnessTableBuilderBase,
1255-
public SILWitnessVisitor<WitnessTableBuilder> {
1254+
class FragileWitnessTableBuilder : public WitnessTableBuilderBase,
1255+
public SILWitnessVisitor<FragileWitnessTableBuilder> {
12561256
ConstantArrayBuilder &Table;
12571257
unsigned TableSize = ~0U; // will get overwritten unconditionally
12581258
SmallVector<std::pair<size_t, const ConformanceInfo *>, 4>
12591259
SpecializedBaseConformances;
12601260

1261-
bool ResilientConformance;
1262-
12631261
const ProtocolInfo &PI;
12641262

12651263
public:
1266-
WitnessTableBuilder(IRGenModule &IGM, ConstantArrayBuilder &table,
1267-
SILWitnessTable *SILWT)
1264+
FragileWitnessTableBuilder(IRGenModule &IGM, ConstantArrayBuilder &table,
1265+
SILWitnessTable *SILWT)
12681266
: WitnessTableBuilderBase(IGM, SILWT), Table(table),
1269-
ResilientConformance(IGM.isResilientConformance(&Conformance)),
12701267
PI(IGM.getProtocolInfo(SILWT->getConformance()->getProtocol(),
1271-
(ResilientConformance
1272-
? ProtocolInfoKind::RequirementSignature
1273-
: ProtocolInfoKind::Full))) {}
1268+
ProtocolInfoKind::Full)) {}
12741269

12751270
/// The number of entries in the witness table.
12761271
unsigned getTableSize() const { return TableSize; }
@@ -1294,10 +1289,6 @@ class AccessorConformanceInfo : public ConformanceInfo {
12941289
#endif
12951290
SILEntries = SILEntries.slice(1);
12961291

1297-
// Resilient conformances get a resilient witness table.
1298-
if (ResilientConformance)
1299-
return;
1300-
13011292
#ifndef NDEBUG
13021293
assert(entry.getKind() == SILWitnessTable::BaseProtocol
13031294
&& "sil witness table does not match protocol");
@@ -1332,10 +1323,6 @@ class AccessorConformanceInfo : public ConformanceInfo {
13321323
auto &entry = SILEntries.front();
13331324
SILEntries = SILEntries.slice(1);
13341325

1335-
// Resilient conformances get a resilient witness table.
1336-
if (ResilientConformance)
1337-
return;
1338-
13391326
#ifndef NDEBUG
13401327
assert(entry.getKind() == SILWitnessTable::Method
13411328
&& "sil witness table does not match protocol");
@@ -1372,10 +1359,6 @@ class AccessorConformanceInfo : public ConformanceInfo {
13721359
auto &entry = SILEntries.front();
13731360
SILEntries = SILEntries.slice(1);
13741361

1375-
// Resilient conformances get a resilient witness table.
1376-
if (ResilientConformance)
1377-
return;
1378-
13791362
#ifndef NDEBUG
13801363
assert(entry.getKind() == SILWitnessTable::AssociatedType
13811364
&& "sil witness table does not match protocol");
@@ -1411,9 +1394,6 @@ class AccessorConformanceInfo : public ConformanceInfo {
14111394
(void)entry;
14121395
SILEntries = SILEntries.slice(1);
14131396

1414-
if (ResilientConformance)
1415-
return;
1416-
14171397
auto associate =
14181398
ConformanceInContext.getAssociatedType(
14191399
requirement.getAssociation())->getCanonicalType();
@@ -1450,8 +1430,17 @@ class AccessorConformanceInfo : public ConformanceInfo {
14501430
/// Build the instantiation function that runs at the end of witness
14511431
/// table specialization.
14521432
llvm::Constant *buildInstantiationFunction();
1433+
};
14531434

1435+
class ResilientWitnessTableBuilder : public WitnessTableBuilderBase {
14541436
public:
1437+
ResilientWitnessTableBuilder(IRGenModule &IGM, SILWitnessTable *SILWT)
1438+
: WitnessTableBuilderBase(IGM, SILWT) {}
1439+
1440+
void build() {
1441+
WitnessTableBuilderBase::build();
1442+
}
1443+
14551444
/// Collect the set of resilient witnesses, which will become part of the
14561445
/// protocol conformance descriptor.
14571446
void collectResilientWitnesses(
@@ -1460,7 +1449,7 @@ class AccessorConformanceInfo : public ConformanceInfo {
14601449
} // end anonymous namespace
14611450

14621451
/// Build the witness table.
1463-
void WitnessTableBuilder::build() {
1452+
void FragileWitnessTableBuilder::build() {
14641453
WitnessTableBuilderBase::build();
14651454
visitProtocolDecl(Conformance.getProtocol());
14661455
TableSize = Table.size();
@@ -1627,11 +1616,8 @@ void WitnessTableBuilderBase::defineAssociatedTypeWitnessTableAccessFunction(
16271616
IGF.Builder.CreateRet(wtable);
16281617
}
16291618

1630-
void WitnessTableBuilder::collectResilientWitnesses(
1619+
void ResilientWitnessTableBuilder::collectResilientWitnesses(
16311620
SmallVectorImpl<llvm::Constant *> &resilientWitnesses) {
1632-
if (!ResilientConformance)
1633-
return;
1634-
16351621
assert(isa<NormalProtocolConformance>(Conformance) &&
16361622
"resilient conformance should always be normal");
16371623
auto &conformance = cast<NormalProtocolConformance>(Conformance);
@@ -1707,7 +1693,7 @@ void WitnessTableBuilder::collectResilientWitnesses(
17071693
}
17081694
}
17091695

1710-
llvm::Constant *WitnessTableBuilder::buildInstantiationFunction() {
1696+
llvm::Constant *FragileWitnessTableBuilder::buildInstantiationFunction() {
17111697
// We need an instantiation function if any base conformance
17121698
// is non-dependent.
17131699
if (SpecializedBaseConformances.empty())
@@ -2172,7 +2158,7 @@ void IRGenModule::emitSILWitnessTable(SILWitnessTable *wt) {
21722158
// Build the witness table.
21732159
ConstantInitBuilder builder(*this);
21742160
auto wtableContents = builder.beginArray(Int8PtrTy);
2175-
WitnessTableBuilder wtableBuilder(*this, wtableContents, wt);
2161+
FragileWitnessTableBuilder wtableBuilder(*this, wtableContents, wt);
21762162
wtableBuilder.build();
21772163

21782164
// Produce the initializer value.
@@ -2193,18 +2179,12 @@ void IRGenModule::emitSILWitnessTable(SILWitnessTable *wt) {
21932179
instantiationFunction = wtableBuilder.buildInstantiationFunction();
21942180
} else {
21952181
// Build the witness table.
2196-
ConstantInitBuilder builder(*this);
2197-
auto wtableContents = builder.beginArray(Int8PtrTy);
2198-
WitnessTableBuilder wtableBuilder(*this, wtableContents, wt);
2182+
ResilientWitnessTableBuilder wtableBuilder(*this, wt);
21992183
wtableBuilder.build();
22002184

22012185
// Collect the resilient witnesses to go into the conformance descriptor.
22022186
wtableBuilder.collectResilientWitnesses(resilientWitnesses);
22032187

2204-
// Produce the initializer value.
2205-
auto initializer = wtableContents.finishAndCreateFuture();
2206-
initializer.abandon();
2207-
22082188
tableSize = 0;
22092189
tablePrivateSize = wtableBuilder.getTablePrivateSize();
22102190
}

0 commit comments

Comments
 (0)