diff --git a/include/swift/SIL/SILVTable.h b/include/swift/SIL/SILVTable.h index c266b762cf810..54dc2aec4cb5b 100644 --- a/include/swift/SIL/SILVTable.h +++ b/include/swift/SIL/SILVTable.h @@ -53,6 +53,9 @@ class SILVTable : public llvm::ilist_node, enum Kind : uint8_t { /// The vtable entry is for a method defined directly in this class. Normal, + /// The vtable entry is for a method defined directly in this class, and is never overridden + /// by subclasses. + NormalNonOverridden, /// The vtable entry is inherited from the superclass. Inherited, /// The vtable entry is inherited from the superclass, and overridden diff --git a/lib/SIL/IR/SILPrinter.cpp b/lib/SIL/IR/SILPrinter.cpp index dd9c3b93b1110..7207fd6795ae5 100644 --- a/lib/SIL/IR/SILPrinter.cpp +++ b/lib/SIL/IR/SILPrinter.cpp @@ -3127,6 +3127,9 @@ void SILVTable::print(llvm::raw_ostream &OS, bool Verbose) const { switch (entry.TheKind) { case SILVTable::Entry::Kind::Normal: break; + case SILVTable::Entry::Kind::NormalNonOverridden: + OS << " [nonoverridden]"; + break; case SILVTable::Entry::Kind::Inherited: OS << " [inherited]"; break; diff --git a/lib/SIL/Parser/ParseSIL.cpp b/lib/SIL/Parser/ParseSIL.cpp index 94521a73a4d69..761bcf9e9b875 100644 --- a/lib/SIL/Parser/ParseSIL.cpp +++ b/lib/SIL/Parser/ParseSIL.cpp @@ -6090,6 +6090,9 @@ bool SILParserState::parseSILVTable(Parser &P) { } else if (P.Tok.getText() == "inherited") { P.consumeToken(); Kind = SILVTable::Entry::Kind::Inherited; + } else if (P.Tok.getText() == "nonoverridden") { + P.consumeToken(); + Kind = SILVTable::Entry::Kind::NormalNonOverridden; } else { P.diagnose(P.Tok.getLoc(), diag::sil_vtable_bad_entry_kind); return true; diff --git a/lib/Serialization/DeserializeSIL.cpp b/lib/Serialization/DeserializeSIL.cpp index 5fbd28c55672b..5709a1b267298 100644 --- a/lib/Serialization/DeserializeSIL.cpp +++ b/lib/Serialization/DeserializeSIL.cpp @@ -79,6 +79,8 @@ static Optional fromStableVTableEntryKind(unsigned value) { switch (value) { case SIL_VTABLE_ENTRY_NORMAL: return SILVTable::Entry::Kind::Normal; + case SIL_VTABLE_ENTRY_NORMAL_NON_OVERRIDDEN: + return SILVTable::Entry::Kind::NormalNonOverridden; case SIL_VTABLE_ENTRY_INHERITED: return SILVTable::Entry::Kind::Inherited; case SIL_VTABLE_ENTRY_OVERRIDE: return SILVTable::Entry::Kind::Override; default: return None; diff --git a/lib/Serialization/ModuleFormat.h b/lib/Serialization/ModuleFormat.h index 09f53e1658124..c5ac6129a8889 100644 --- a/lib/Serialization/ModuleFormat.h +++ b/lib/Serialization/ModuleFormat.h @@ -55,7 +55,7 @@ const uint16_t SWIFTMODULE_VERSION_MAJOR = 0; /// describe what change you made. The content of this comment isn't important; /// it just ensures a conflict if two people change the module format. /// Don't worry about adhering to the 80-column limit for this line. -const uint16_t SWIFTMODULE_VERSION_MINOR = 557; // COW instructions +const uint16_t SWIFTMODULE_VERSION_MINOR = 558; // SILVTable entry kind for non-overridden entries /// A standard hash seed used for all string hashes in a serialized module. /// diff --git a/lib/Serialization/SILFormat.h b/lib/Serialization/SILFormat.h index a0e0ab5a41937..154e50886fb63 100644 --- a/lib/Serialization/SILFormat.h +++ b/lib/Serialization/SILFormat.h @@ -51,6 +51,7 @@ using SILLinkageField = BCFixed<4>; enum SILVTableEntryKindEncoding : uint8_t { SIL_VTABLE_ENTRY_NORMAL, + SIL_VTABLE_ENTRY_NORMAL_NON_OVERRIDDEN, SIL_VTABLE_ENTRY_INHERITED, SIL_VTABLE_ENTRY_OVERRIDE, }; diff --git a/lib/Serialization/SerializeSIL.cpp b/lib/Serialization/SerializeSIL.cpp index 0ba068798906f..5c2da231e1263 100644 --- a/lib/Serialization/SerializeSIL.cpp +++ b/lib/Serialization/SerializeSIL.cpp @@ -73,6 +73,8 @@ static unsigned toStableSILLinkage(SILLinkage linkage) { static unsigned toStableVTableEntryKind(SILVTable::Entry::Kind kind) { switch (kind) { case SILVTable::Entry::Kind::Normal: return SIL_VTABLE_ENTRY_NORMAL; + case SILVTable::Entry::Kind::NormalNonOverridden: + return SIL_VTABLE_ENTRY_NORMAL_NON_OVERRIDDEN; case SILVTable::Entry::Kind::Inherited: return SIL_VTABLE_ENTRY_INHERITED; case SILVTable::Entry::Kind::Override: return SIL_VTABLE_ENTRY_OVERRIDE; }