Skip to content

Commit a3ba936

Browse files
committed
[DefaultOverrides] SIL de/serialization.
1 parent 317a379 commit a3ba936

File tree

12 files changed

+401
-11
lines changed

12 files changed

+401
-11
lines changed

include/swift/SIL/Notifications.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class SILNode;
2727
class ModuleDecl;
2828
class SILFunction;
2929
class SILWitnessTable;
30+
class SILDefaultOverrideTable;
3031
class SILDefaultWitnessTable;
3132
class SILGlobalVariable;
3233
class SILVTable;
@@ -50,6 +51,12 @@ class DeserializationNotificationHandlerBase {
5051
virtual void didDeserializeWitnessTableEntries(ModuleDecl *mod,
5152
SILWitnessTable *wt) = 0;
5253

54+
/// Observe that we successfully deserialized a default override table's
55+
/// entries.
56+
virtual void
57+
didDeserializeDefaultOverrideTableEntries(ModuleDecl *mod,
58+
SILDefaultOverrideTable *ot) = 0;
59+
5360
/// Observe that we successfully deserialized a default witness table's
5461
/// entries.
5562
virtual void
@@ -69,6 +76,10 @@ class DeserializationNotificationHandlerBase {
6976
virtual void didDeserialize(ModuleDecl *mod,
7077
SILDefaultWitnessTable *wtable) = 0;
7178

79+
/// Observe that we deserialized a default override table declaration.
80+
virtual void didDeserialize(ModuleDecl *mod,
81+
SILDefaultOverrideTable *otable) = 0;
82+
7283
/// Observe that we deserialized a move only deinit declaration.
7384
virtual void didDeserialize(ModuleDecl *mod, SILMoveOnlyDeinit *deinit) = 0;
7485

@@ -93,6 +104,10 @@ class DeserializationNotificationHandler
93104
SILWitnessTable *wt) override {
94105
}
95106

107+
/// Observe that we successfully deserialized a override table's entries.
108+
virtual void didDeserializeDefaultOverrideTableEntries(
109+
ModuleDecl *mod, SILDefaultOverrideTable *ot) override {}
110+
96111
/// Observe that we successfully deserialized a default witness table's
97112
/// entries.
98113
virtual void didDeserializeDefaultWitnessTableEntries(
@@ -113,6 +128,10 @@ class DeserializationNotificationHandler
113128
virtual void didDeserialize(ModuleDecl *mod,
114129
SILDefaultWitnessTable *wtable) override {}
115130

131+
/// Observe that we deserialized a default override table declaration.
132+
virtual void didDeserialize(ModuleDecl *mod,
133+
SILDefaultOverrideTable *otable) override {}
134+
116135
/// Observe that we deserialized a move only deinit declaration.
117136
virtual void didDeserialize(ModuleDecl *mod,
118137
SILMoveOnlyDeinit *deinit) override {}
@@ -242,11 +261,15 @@ class DeserializationNotificationHandlerSet final
242261
void
243262
didDeserializeDefaultWitnessTableEntries(ModuleDecl *mod,
244263
SILDefaultWitnessTable *wt) override;
264+
void didDeserializeDefaultOverrideTableEntries(
265+
ModuleDecl *mod, SILDefaultOverrideTable *ot) override;
245266
void didDeserialize(ModuleDecl *mod, SILGlobalVariable *var) override;
246267
void didDeserialize(ModuleDecl *mod, SILVTable *vtable) override;
247268
void didDeserialize(ModuleDecl *mod, SILWitnessTable *wtable) override;
248269
void didDeserialize(ModuleDecl *mod,
249270
SILDefaultWitnessTable *wtable) override;
271+
void didDeserialize(ModuleDecl *mod,
272+
SILDefaultOverrideTable *otable) override;
250273
void didDeserialize(ModuleDecl *mod, SILMoveOnlyDeinit *deinit) override;
251274
};
252275
} // namespace swift

include/swift/Serialization/SerializedSILLoader.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ class SerializedSILLoader {
7070
SILMoveOnlyDeinit *lookupMoveOnlyDeinit(const NominalTypeDecl *nomDecl);
7171
SILWitnessTable *lookupWitnessTable(SILWitnessTable *C);
7272
SILDefaultWitnessTable *lookupDefaultWitnessTable(SILDefaultWitnessTable *C);
73+
SILDefaultOverrideTable *
74+
lookupDefaultOverrideTable(SILDefaultOverrideTable *);
7375
SILDifferentiabilityWitness *
7476
lookupDifferentiabilityWitness(SILDifferentiabilityWitnessKey key);
7577

@@ -106,6 +108,9 @@ class SerializedSILLoader {
106108
/// Deserialize all DefaultWitnessTables in all SILModules.
107109
void getAllDefaultWitnessTables();
108110

111+
/// Deserialize all DefaultOverrideTables in all SILModules.
112+
void getAllDefaultOverrideTables();
113+
109114
/// Deserialize all Properties in all SILModules.
110115
void getAllProperties();
111116

lib/SIL/IR/Notifications.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#define DEBUG_TYPE "sil-notifications"
1414

1515
#include "swift/SIL/Notifications.h"
16+
#include "swift/SIL/SILDefaultOverrideTable.h"
1617
#include "swift/SIL/SILMoveOnlyDeinit.h"
1718
#include "llvm/Support/Debug.h"
1819
#include "llvm/Support/raw_ostream.h"
@@ -49,9 +50,12 @@ DNS_CHAIN_METHOD(DeserializeWitnessTableEntries, ModuleDecl *,
4950
SILWitnessTable *)
5051
DNS_CHAIN_METHOD(DeserializeDefaultWitnessTableEntries, ModuleDecl *,
5152
SILDefaultWitnessTable *)
53+
DNS_CHAIN_METHOD(DeserializeDefaultOverrideTableEntries, ModuleDecl *,
54+
SILDefaultOverrideTable *)
5255
DNS_CHAIN_METHOD(Deserialize, ModuleDecl *, SILGlobalVariable *)
5356
DNS_CHAIN_METHOD(Deserialize, ModuleDecl *, SILVTable *)
5457
DNS_CHAIN_METHOD(Deserialize, ModuleDecl *, SILMoveOnlyDeinit *)
5558
DNS_CHAIN_METHOD(Deserialize, ModuleDecl *, SILWitnessTable *)
5659
DNS_CHAIN_METHOD(Deserialize, ModuleDecl *, SILDefaultWitnessTable *)
60+
DNS_CHAIN_METHOD(Deserialize, ModuleDecl *, SILDefaultOverrideTable *)
5761
#undef DNS_CHAIN_METHOD

lib/SIL/IR/SILModule.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,13 @@ SILModule::lookUpDefaultOverrideTable(const ClassDecl *decl,
308308
auto found = DefaultOverrideTableMap.find(decl);
309309
if (found == DefaultOverrideTableMap.end()) {
310310
if (deserializeLazily) {
311+
SILLinkage linkage = getSILLinkage(getDeclLinkage(decl), ForDefinition);
312+
SILDefaultOverrideTable *otable =
313+
SILDefaultOverrideTable::declare(*this, linkage, decl);
314+
otable = getSILLoader()->lookupDefaultOverrideTable(otable);
315+
if (otable)
316+
DefaultOverrideTableMap[decl] = otable;
317+
return otable;
311318
}
312319

313320
return nullptr;

lib/Serialization/DeserializeSIL.cpp

Lines changed: 190 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ SILDeserializer::SILDeserializer(
193193
kind == sil_index_block::SIL_GLOBALVAR_NAMES ||
194194
kind == sil_index_block::SIL_WITNESS_TABLE_NAMES ||
195195
kind == sil_index_block::SIL_DEFAULT_WITNESS_TABLE_NAMES ||
196+
kind == sil_index_block::SIL_DEFAULT_OVERRIDE_TABLE_NAMES ||
196197
kind == sil_index_block::SIL_PROPERTY_OFFSETS ||
197198
kind == sil_index_block::SIL_DIFFERENTIABILITY_WITNESS_NAMES)) &&
198199
"Expect SIL_FUNC_NAMES, SIL_VTABLE_NAMES, SIL_GLOBALVAR_NAMES, \
@@ -212,6 +213,8 @@ SILDeserializer::SILDeserializer(
212213
WitnessTableList = readFuncTable(scratch, blobData);
213214
else if (kind == sil_index_block::SIL_DEFAULT_WITNESS_TABLE_NAMES)
214215
DefaultWitnessTableList = readFuncTable(scratch, blobData);
216+
else if (kind == sil_index_block::SIL_DEFAULT_OVERRIDE_TABLE_NAMES)
217+
DefaultOverrideTableList = readFuncTable(scratch, blobData);
215218
else if (kind == sil_index_block::SIL_DIFFERENTIABILITY_WITNESS_NAMES)
216219
DifferentiabilityWitnessList = readFuncTable(scratch, blobData);
217220
else if (kind == sil_index_block::SIL_PROPERTY_OFFSETS) {
@@ -256,6 +259,11 @@ SILDeserializer::SILDeserializer(
256259
offKind == sil_index_block::SIL_DEFAULT_WITNESS_TABLE_OFFSETS) &&
257260
"Expect a SIL_DEFAULT_WITNESS_TABLE_OFFSETS record.");
258261
MF->allocateBuffer(DefaultWitnessTables, scratch);
262+
} else if (kind == sil_index_block::SIL_DEFAULT_OVERRIDE_TABLE_NAMES) {
263+
assert((next.Kind == llvm::BitstreamEntry::Record &&
264+
offKind == sil_index_block::SIL_DEFAULT_OVERRIDE_TABLE_OFFSETS) &&
265+
"Expect a SIL_DEFAULT_OVERRIDE_TABLE_OFFSETS record.");
266+
MF->allocateBuffer(DefaultOverrideTables, scratch);
259267
} else if (kind == sil_index_block::SIL_DIFFERENTIABILITY_WITNESS_NAMES) {
260268
assert((next.Kind == llvm::BitstreamEntry::Record &&
261269
offKind ==
@@ -1121,6 +1129,7 @@ llvm::Expected<SILFunction *> SILDeserializer::readSILFunctionChecked(
11211129
Builder.setCurrentDebugScope(fn->getDebugScope());
11221130
while (kind != SIL_FUNCTION && kind != SIL_VTABLE && kind != SIL_GLOBALVAR &&
11231131
kind != SIL_MOVEONLY_DEINIT && kind != SIL_WITNESS_TABLE &&
1132+
kind != SIL_DEFAULT_OVERRIDE_TABLE &&
11241133
kind != SIL_DIFFERENTIABILITY_WITNESS) {
11251134
if (kind == SIL_BASIC_BLOCK)
11261135
// Handle a SILBasicBlock record.
@@ -4091,6 +4100,7 @@ SILGlobalVariable *SILDeserializer::readGlobalVar(StringRef Name) {
40914100

40924101
while (kind != SIL_FUNCTION && kind != SIL_VTABLE && kind != SIL_GLOBALVAR &&
40934102
kind != SIL_MOVEONLY_DEINIT && kind != SIL_WITNESS_TABLE &&
4103+
kind != SIL_DEFAULT_OVERRIDE_TABLE &&
40944104
kind != SIL_DIFFERENTIABILITY_WITNESS) {
40954105
if (readSILInstruction(nullptr, Builder, kind, scratch))
40964106
MF->fatal("readSILInstruction returns error");
@@ -4219,7 +4229,8 @@ SILVTable *SILDeserializer::readVTable(DeclID VId) {
42194229
std::vector<SILVTable::Entry> vtableEntries;
42204230
// Another SIL_VTABLE record means the end of this VTable.
42214231
while (kind != SIL_VTABLE && kind != SIL_WITNESS_TABLE &&
4222-
kind != SIL_DEFAULT_WITNESS_TABLE && kind != SIL_FUNCTION &&
4232+
kind != SIL_DEFAULT_WITNESS_TABLE &&
4233+
kind != SIL_DEFAULT_OVERRIDE_TABLE && kind != SIL_FUNCTION &&
42234234
kind != SIL_PROPERTY && kind != SIL_MOVEONLY_DEINIT) {
42244235
assert(kind == SIL_VTABLE_ENTRY &&
42254236
"Content of Vtable should be in SIL_VTABLE_ENTRY.");
@@ -4434,10 +4445,9 @@ void SILDeserializer::readWitnessTableEntries(
44344445
unsigned kind = maybeKind.get();
44354446

44364447
// Another record means the end of this WitnessTable.
4437-
while (kind != SIL_WITNESS_TABLE &&
4438-
kind != SIL_DEFAULT_WITNESS_TABLE &&
4439-
kind != SIL_DIFFERENTIABILITY_WITNESS &&
4440-
kind != SIL_FUNCTION) {
4448+
while (kind != SIL_WITNESS_TABLE && kind != SIL_DEFAULT_WITNESS_TABLE &&
4449+
kind != SIL_DEFAULT_OVERRIDE_TABLE &&
4450+
kind != SIL_DIFFERENTIABILITY_WITNESS && kind != SIL_FUNCTION) {
44414451
if (kind == SIL_DEFAULT_WITNESS_TABLE_NO_ENTRY) {
44424452
witnessEntries.push_back(SILDefaultWitnessTable::Entry());
44434453
} else if (kind == SIL_WITNESS_BASE_ENTRY) {
@@ -4825,6 +4835,181 @@ SILDeserializer::lookupDefaultWitnessTable(SILDefaultWitnessTable *existingWt) {
48254835
return Wt;
48264836
}
48274837

4838+
void SILDeserializer::readDefaultOverrideTableEntries(
4839+
llvm::BitstreamEntry &entry,
4840+
std::vector<SILDefaultOverrideTable::Entry> &entries) {
4841+
SmallVector<uint64_t, 64> scratch;
4842+
llvm::Expected<unsigned> maybeKind = SILCursor.readRecord(entry.ID, scratch);
4843+
if (!maybeKind)
4844+
MF->fatal(maybeKind.takeError());
4845+
unsigned kind = maybeKind.get();
4846+
4847+
// Another record means the end of this DefaultOverrideTable.
4848+
while (kind == SIL_DEFAULT_OVERRIDE_TABLE_ENTRY) {
4849+
ArrayRef<uint64_t> ListOfValues;
4850+
DeclID NameID;
4851+
DefaultOverrideTableEntryLayout::readRecord(scratch, NameID, ListOfValues);
4852+
SILFunction *impl = nullptr;
4853+
if (NameID != 0) {
4854+
impl = getFuncForReference(MF->getIdentifierText(NameID));
4855+
}
4856+
if (impl || NameID == 0) {
4857+
unsigned NextValueIndex = 0;
4858+
auto method = getSILDeclRef(MF, ListOfValues, NextValueIndex);
4859+
auto original = getSILDeclRef(MF, ListOfValues, NextValueIndex);
4860+
entries.push_back(SILDefaultOverrideTable::Entry{method, original, impl});
4861+
}
4862+
4863+
// Fetch the next record.
4864+
scratch.clear();
4865+
llvm::Expected<llvm::BitstreamEntry> maybeEntry =
4866+
SILCursor.advance(AF_DontPopBlockAtEnd);
4867+
if (!maybeEntry)
4868+
MF->fatal(maybeEntry.takeError());
4869+
entry = maybeEntry.get();
4870+
if (entry.Kind == llvm::BitstreamEntry::EndBlock)
4871+
// EndBlock means the end of this DefaultOverrideTable.
4872+
break;
4873+
maybeKind = SILCursor.readRecord(entry.ID, scratch);
4874+
if (!maybeKind)
4875+
MF->fatal(maybeKind.takeError());
4876+
kind = maybeKind.get();
4877+
}
4878+
}
4879+
4880+
SILDefaultOverrideTable *
4881+
SILDeserializer::readDefaultOverrideTable(DeclID tableID,
4882+
SILDefaultOverrideTable *existingOt) {
4883+
if (tableID == 0)
4884+
return nullptr;
4885+
assert(tableID <= DefaultOverrideTables.size() &&
4886+
"invalid DefaultOverrideTable ID");
4887+
4888+
auto &oTableOrOffset = DefaultOverrideTables[tableID - 1];
4889+
4890+
if (oTableOrOffset.isFullyDeserialized())
4891+
return oTableOrOffset.get();
4892+
4893+
BCOffsetRAII restoreOffset(SILCursor);
4894+
if (llvm::Error Err = SILCursor.JumpToBit(oTableOrOffset.getOffset()))
4895+
MF->fatal(std::move(Err));
4896+
llvm::Expected<llvm::BitstreamEntry> maybeEntry =
4897+
SILCursor.advance(AF_DontPopBlockAtEnd);
4898+
if (!maybeEntry)
4899+
MF->fatal(maybeEntry.takeError());
4900+
llvm::BitstreamEntry entry = maybeEntry.get();
4901+
if (entry.Kind == llvm::BitstreamEntry::Error) {
4902+
LLVM_DEBUG(llvm::dbgs() << "Cursor advance error in "
4903+
"readDefaultOverrideTable.\n");
4904+
return nullptr;
4905+
}
4906+
4907+
SmallVector<uint64_t, 64> scratch;
4908+
StringRef blobData;
4909+
llvm::Expected<unsigned> maybeKind =
4910+
SILCursor.readRecord(entry.ID, scratch, &blobData);
4911+
if (!maybeKind)
4912+
MF->fatal(maybeKind.takeError());
4913+
unsigned kind = maybeKind.get();
4914+
assert(kind == SIL_DEFAULT_OVERRIDE_TABLE &&
4915+
"expect a sil default override table");
4916+
(void)kind;
4917+
4918+
unsigned rawLinkage;
4919+
DeclID classID;
4920+
DefaultOverrideTableLayout::readRecord(scratch, classID, rawLinkage);
4921+
4922+
auto Linkage = fromStableSILLinkage(rawLinkage);
4923+
if (!Linkage) {
4924+
LLVM_DEBUG(llvm::dbgs() << "invalid linkage code " << rawLinkage
4925+
<< " for SILFunction\n");
4926+
MF->fatal("invalid linkage code");
4927+
}
4928+
4929+
ClassDecl *decl = cast<ClassDecl>(MF->getDecl(classID));
4930+
if (decl == nullptr) {
4931+
LLVM_DEBUG(llvm::dbgs() << "invalid class code " << classID << "\n");
4932+
MF->fatal("invalid class code");
4933+
}
4934+
4935+
PrettyStackTraceDecl trace("deserializing default override table for", decl);
4936+
4937+
if (!existingOt)
4938+
existingOt =
4939+
SILMod.lookUpDefaultOverrideTable(decl, /*deserializeLazily=*/false);
4940+
auto oT = existingOt;
4941+
4942+
// If we have an existing default override table, verify that the class
4943+
// matches up.
4944+
if (oT) {
4945+
if (oT->getClass() != decl) {
4946+
MF->fatal("Protocol mismatch");
4947+
}
4948+
4949+
// Don't override the linkage of a default override table with an existing
4950+
// declaration.
4951+
4952+
} else {
4953+
// Otherwise, create a new override table declaration.
4954+
oT = SILDefaultOverrideTable::declare(SILMod, *Linkage, decl);
4955+
if (Callback)
4956+
Callback->didDeserialize(MF->getAssociatedModule(), oT);
4957+
}
4958+
4959+
// Fetch the next record.
4960+
scratch.clear();
4961+
maybeEntry = SILCursor.advance(AF_DontPopBlockAtEnd);
4962+
if (!maybeEntry)
4963+
MF->fatal(maybeEntry.takeError());
4964+
entry = maybeEntry.get();
4965+
if (entry.Kind == llvm::BitstreamEntry::EndBlock)
4966+
return nullptr;
4967+
4968+
std::vector<SILDefaultOverrideTable::Entry> entries;
4969+
readDefaultOverrideTableEntries(entry, entries);
4970+
4971+
oT->define(entries);
4972+
oTableOrOffset.set(oT, /*fully deserialized*/ true);
4973+
if (Callback)
4974+
Callback->didDeserializeDefaultOverrideTableEntries(
4975+
MF->getAssociatedModule(), oT);
4976+
return oT;
4977+
}
4978+
4979+
SILDefaultOverrideTable *SILDeserializer::lookupDefaultOverrideTable(
4980+
SILDefaultOverrideTable *existingOt) {
4981+
assert(existingOt &&
4982+
"Cannot deserialize a null default override table declaration.");
4983+
assert(existingOt->isDeclaration() &&
4984+
"Cannot deserialize a default override table "
4985+
"definition.");
4986+
4987+
// If we don't have a default override table list, we can't look anything up.
4988+
if (!DefaultOverrideTableList)
4989+
return nullptr;
4990+
4991+
// Use the mangled name of the class to lookup the partially deserialized
4992+
// value from the default override table list.
4993+
auto iter = DefaultOverrideTableList->find(existingOt->getUniqueName());
4994+
if (iter == DefaultOverrideTableList->end())
4995+
return nullptr;
4996+
4997+
// Attempt to read the default override table.
4998+
auto Ot = readDefaultOverrideTable(*iter, existingOt);
4999+
if (Ot)
5000+
LLVM_DEBUG(llvm::dbgs() << "Deserialize SIL:\n"; Ot->dump());
5001+
5002+
return Ot;
5003+
}
5004+
5005+
void SILDeserializer::getAllDefaultOverrideTables() {
5006+
if (!DefaultOverrideTableList)
5007+
return;
5008+
for (unsigned index = 0, size = DefaultOverrideTables.size(); index < size;
5009+
++index)
5010+
readDefaultOverrideTable(index + 1, nullptr);
5011+
}
5012+
48285013
SILDifferentiabilityWitness *
48295014
SILDeserializer::readDifferentiabilityWitness(DeclID DId) {
48305015
if (DId == 0)

0 commit comments

Comments
 (0)