Skip to content

Commit 90ee114

Browse files
author
David Ungar
committed
add fingerprint excluding to basic source file info
1 parent bc7eb59 commit 90ee114

File tree

5 files changed

+60
-15
lines changed

5 files changed

+60
-15
lines changed

include/swift/AST/RawComment.h

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ class BasicSourceFileInfo {
104104

105105
StringRef FilePath;
106106
Fingerprint InterfaceHashIncludingTypeMembers = Fingerprint::ZERO();
107+
/// Does *not* include the type-body hashes of the top level types.
108+
/// Just the `SourceFile` hashes.
109+
/// Used for incremental imports.
110+
Fingerprint InterfaceHashExcludingTypeMembers = Fingerprint::ZERO();
107111
llvm::sys::TimePoint<> LastModified = {};
108112
uint64_t FileSize = 0;
109113

@@ -113,14 +117,16 @@ class BasicSourceFileInfo {
113117
public:
114118
BasicSourceFileInfo(StringRef FilePath,
115119
Fingerprint InterfaceHashIncludingTypeMembers,
120+
Fingerprint InterfaceHashExcludingTypeMembers,
116121
llvm::sys::TimePoint<> LastModified, uint64_t FileSize)
117122
: FilePath(FilePath),
118123
InterfaceHashIncludingTypeMembers(InterfaceHashIncludingTypeMembers),
124+
InterfaceHashExcludingTypeMembers(InterfaceHashExcludingTypeMembers),
119125
LastModified(LastModified), FileSize(FileSize) {}
120126

121-
/// Construct with a 'SourceFile'. 'getInterfaceHashIncludingTypeMembers()',
122-
/// 'getLastModified()' and 'getFileSize()' are laizily pupulated when
123-
/// accessed.
127+
/// Construct with a `SourceFile`. `getInterfaceHashIncludingTypeMembers()`,
128+
/// `getInterfaceHashExcludingTypeMembers()`, `getLastModified()` and `getFileSize()` are laizily
129+
/// populated when accessed.
124130
BasicSourceFileInfo(const SourceFile *SF);
125131

126132
bool isFromSourceFile() const;
@@ -132,6 +138,11 @@ class BasicSourceFileInfo {
132138
return InterfaceHashIncludingTypeMembers;
133139
}
134140

141+
Fingerprint getInterfaceHashExcludingTypeMembers() const {
142+
const_cast<BasicSourceFileInfo *>(this)->populateWithSourceFileIfNeeded();
143+
return InterfaceHashExcludingTypeMembers;
144+
}
145+
135146
llvm::sys::TimePoint<> getLastModified() const {
136147
const_cast<BasicSourceFileInfo *>(this)->populateWithSourceFileIfNeeded();
137148
return LastModified;

lib/AST/Module.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1550,7 +1550,9 @@ Fingerprint ModuleDecl::getFingerprint() const {
15501550
StableHasher hasher = StableHasher::defaultHasher();
15511551
SmallVector<Fingerprint, 16> FPs;
15521552
collectBasicSourceFileInfo([&](const BasicSourceFileInfo &bsfi) {
1553-
FPs.emplace_back(bsfi.getInterfaceHashIncludingTypeMembers());
1553+
// For incremental imports, the hash must be insensitive to type-body
1554+
// changes, so use the one without type members.
1555+
FPs.emplace_back(bsfi.getInterfaceHashExcludingTypeMembers());
15541556
});
15551557

15561558
// Sort the fingerprints lexicographically so we have a stable hash despite

lib/AST/RawComment.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,9 +278,11 @@ void BasicSourceFileInfo::populateWithSourceFileIfNeeded() {
278278

279279
if (SF->hasInterfaceHash()) {
280280
InterfaceHashIncludingTypeMembers = SF->getInterfaceHashIncludingTypeMembers();
281+
InterfaceHashExcludingTypeMembers = SF->getInterfaceHash();
281282
} else {
282283
// FIXME: Parse the file with EnableInterfaceHash option.
283284
InterfaceHashIncludingTypeMembers = Fingerprint::ZERO();
285+
InterfaceHashExcludingTypeMembers = Fingerprint::ZERO();
284286
}
285287

286288
return;

lib/Serialization/ModuleFile.cpp

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -978,10 +978,17 @@ void ModuleFile::collectBasicSourceFileInfo(
978978
while (Cursor < End) {
979979
// FilePath (byte offset in 'SourceLocsTextData').
980980
auto fileID = endian::readNext<uint32_t, little, unaligned>(Cursor);
981-
// InterfaceHash (fixed length string).
982-
auto fpStr = StringRef{reinterpret_cast<const char *>(Cursor),
981+
982+
// InterfaceHashIncludingTypeMembers (fixed length string).
983+
auto fpStrIncludingTypeMembers = StringRef{reinterpret_cast<const char *>(Cursor),
984+
Fingerprint::DIGEST_LENGTH};
985+
Cursor += Fingerprint::DIGEST_LENGTH;
986+
987+
// InterfaceHashExcludingTypeMembers (fixed length string).
988+
auto fpStrExcludingTypeMembers = StringRef{reinterpret_cast<const char *>(Cursor),
983989
Fingerprint::DIGEST_LENGTH};
984990
Cursor += Fingerprint::DIGEST_LENGTH;
991+
985992
// LastModified (nanoseconds since epoch).
986993
auto timestamp = endian::readNext<uint64_t, little, unaligned>(Cursor);
987994
// FileSize (num of bytes).
@@ -992,13 +999,25 @@ void ModuleFile::collectBasicSourceFileInfo(
992999
size_t terminatorOffset = filePath.find('\0');
9931000
filePath = filePath.slice(0, terminatorOffset);
9941001

995-
auto fingerprint = Fingerprint::fromString(fpStr);
996-
if (!fingerprint) {
997-
llvm::errs() << "Unconvertable fingerprint '" << fpStr << "'\n";
1002+
auto fingerprintIncludingTypeMembers =
1003+
Fingerprint::fromString(fpStrIncludingTypeMembers);
1004+
if (!fingerprintIncludingTypeMembers) {
1005+
llvm::errs() << "Unconvertible fingerprint including type members'"
1006+
<< fpStrIncludingTypeMembers << "'\n";
9981007
abort();
9991008
}
1000-
1001-
callback(BasicSourceFileInfo(filePath, fingerprint.getValue(), llvm::sys::TimePoint<>(std::chrono::nanoseconds(timestamp)), fileSize));
1009+
auto fingerprintExcludingTypeMembers =
1010+
Fingerprint::fromString(fpStrExcludingTypeMembers);
1011+
if (!fingerprintExcludingTypeMembers) {
1012+
llvm::errs() << "Unconvertible fingerprint excluding type members'"
1013+
<< fpStrExcludingTypeMembers << "'\n";
1014+
abort();
1015+
}
1016+
callback(BasicSourceFileInfo(filePath,
1017+
fingerprintIncludingTypeMembers.getValue(),
1018+
fingerprintExcludingTypeMembers.getValue(),
1019+
llvm::sys::TimePoint<>(std::chrono::nanoseconds(timestamp)),
1020+
fileSize));
10021021
}
10031022
}
10041023

lib/Serialization/SerializeDoc.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -805,7 +805,12 @@ static void emitFileListRecord(llvm::BitstreamWriter &Out,
805805
return;
806806

807807
auto fileID = FWriter.getTextOffset(absolutePath);
808-
auto fingerprintStr = info.getInterfaceHashIncludingTypeMembers().getRawValue();
808+
809+
auto fingerprintStrIncludingTypeMembers =
810+
info.getInterfaceHashIncludingTypeMembers().getRawValue();
811+
auto fingerprintStrExcludingTypeMembers =
812+
info.getInterfaceHashExcludingTypeMembers().getRawValue();
813+
809814
auto timestamp = std::chrono::duration_cast<std::chrono::nanoseconds>(
810815
info.getLastModified().time_since_epoch())
811816
.count();
@@ -814,9 +819,15 @@ static void emitFileListRecord(llvm::BitstreamWriter &Out,
814819
endian::Writer writer(out, little);
815820
// FilePath.
816821
writer.write<uint32_t>(fileID);
817-
// InterfaceHash (fixed length string).
818-
assert(fingerprintStr.size() == Fingerprint::DIGEST_LENGTH);
819-
out << fingerprintStr;
822+
823+
// InterfaceHashIncludingTypeMembers (fixed length string).
824+
assert(fingerprintStrIncludingTypeMembers.size() == Fingerprint::DIGEST_LENGTH);
825+
out << fingerprintStrIncludingTypeMembers;
826+
827+
// InterfaceHashExcludingTypeMembers (fixed length string).
828+
assert(fingerprintStrExcludingTypeMembers.size() == Fingerprint::DIGEST_LENGTH);
829+
out << fingerprintStrExcludingTypeMembers;
830+
820831
// LastModified (nanoseconds since epoch).
821832
writer.write<uint64_t>(timestamp);
822833
// FileSize (num of bytes).

0 commit comments

Comments
 (0)