Skip to content

Commit 8184952

Browse files
authored
Merge pull request #36188 from davidungar/module-print-2-rintaro
2 parents 836a81e + d5ef9a0 commit 8184952

File tree

10 files changed

+97
-23
lines changed

10 files changed

+97
-23
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).
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
public func fromC(parameter: Int = 0) {}
22

3+
struct S {
4+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
public func fromC(parameter: Int = 0) {}
2+
3+
struct S {
4+
public func member() {}
5+
}
6+
public func other() {}

test/Incremental/CrossModule/module-fingerprint.swift

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
// RUN: %target-swift-ide-test -print-module-metadata -module-to-print B -enable-swiftsourceinfo -I %t -source-filename %s | %FileCheck %s --check-prefix=CHECK-CLEAN-B
1414
// RUN: %target-swift-ide-test -print-module-metadata -module-to-print A -enable-swiftsourceinfo -I %t -source-filename %s | %FileCheck %s --check-prefix=CHECK-CLEAN-A
1515

16-
// CHECK-CLEAN-C: fingerprint=6e60fd224d614a59568a348e0ac9b55a
17-
// CHECK-CLEAN-B: fingerprint=bfa14052e1df9253b7bf7e0eb7cfc505
18-
// CHECK-CLEAN-A: fingerprint=a939d89f07c766a4607c5fe1a1715cf5
16+
// CHECK-CLEAN-C: fingerprint=7957733a8ee9bc44f726a516108786eb
17+
// CHECK-CLEAN-B: fingerprint=17bb71bdc7972a93446d524f47044156
18+
// CHECK-CLEAN-A: fingerprint=048332944f6e149f2e8bed309d47283d
1919

2020
//
2121
// Now change C and ensure that B rebuilds but A does not
@@ -32,6 +32,25 @@
3232
// RUN: %target-swift-ide-test -print-module-metadata -module-to-print B -enable-swiftsourceinfo -I %t -source-filename %s | %FileCheck %s --check-prefix=CHECK-INCREMENTAL-B
3333
// RUN: %target-swift-ide-test -print-module-metadata -module-to-print A -enable-swiftsourceinfo -I %t -source-filename %s | %FileCheck %s --check-prefix=CHECK-INCREMENTAL-A
3434

35-
// CHECK-INCREMENTAL-C: fingerprint=3e68d59b74032e18401ec978cdb11cf3
36-
// CHECK-INCREMENTAL-B: fingerprint=bfa14052e1df9253b7bf7e0eb7cfc505
37-
// CHECK-INCREMENTAL-A: fingerprint=a939d89f07c766a4607c5fe1a1715cf5
35+
// CHECK-INCREMENTAL-C: fingerprint=263f083edcaaf08536f657d10082dacc
36+
// CHECK-INCREMENTAL-B: fingerprint=17bb71bdc7972a93446d524f47044156
37+
// CHECK-INCREMENTAL-A: fingerprint=048332944f6e149f2e8bed309d47283d
38+
39+
//
40+
// Now change a top-level type of C and ensure that C's fingerprint does not change
41+
//
42+
43+
// RUN: cp %S/Inputs/module-fingerprint/C2.swift %t/C.swift
44+
45+
// RUN: cd %t && %target-swiftc_driver -c -incremental -emit-dependencies -emit-module -emit-module-path %t/C.swiftmodule -enable-experimental-cross-module-incremental-build -module-name C -I %t -output-file-map %t/C.json -working-directory %t -driver-show-incremental -driver-show-job-lifecycle C.swift
46+
// RUN: touch %t/C.swiftmodule
47+
// RUN: cd %t && %target-swiftc_driver -c -incremental -emit-dependencies -emit-module -emit-module-path %t/B.swiftmodule -enable-experimental-cross-module-incremental-build -module-name B -I %t -output-file-map %t/B.json -working-directory %t -driver-show-incremental -driver-show-job-lifecycle B.swift
48+
// RUN: cd %t && %target-swiftc_driver -c -incremental -emit-dependencies -emit-module -emit-module-path %t/A.swiftmodule -enable-experimental-cross-module-incremental-build -module-name A -I %t -output-file-map %t/A.json -working-directory %t -driver-show-incremental -driver-show-job-lifecycle A.swift
49+
50+
// RUN: %target-swift-ide-test -print-module-metadata -module-to-print C -enable-swiftsourceinfo -I %t -source-filename %s | %FileCheck %s --check-prefix=CHECK-INCREMENTAL2-C
51+
// RUN: %target-swift-ide-test -print-module-metadata -module-to-print B -enable-swiftsourceinfo -I %t -source-filename %s | %FileCheck %s --check-prefix=CHECK-INCREMENTAL2-B
52+
// RUN: %target-swift-ide-test -print-module-metadata -module-to-print A -enable-swiftsourceinfo -I %t -source-filename %s | %FileCheck %s --check-prefix=CHECK-INCREMENTAL2-A
53+
54+
// CHECK-INCREMENTAL2-C: fingerprint=263f083edcaaf08536f657d10082dacc
55+
// CHECK-INCREMENTAL2-B: fingerprint=17bb71bdc7972a93446d524f47044156
56+
// CHECK-INCREMENTAL2-A: fingerprint=048332944f6e149f2e8bed309d47283d

test/Serialization/sourceinfo.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ import MyModule
66
// RUN: %target-swiftc_driver -emit-module -module-name MyModule -o %t/Modules/MyModule.swiftmodule %S/Inputs/SourceInfo/File1.swift %S/Inputs/SourceInfo/File2.swift
77
// RUN: %target-swift-ide-test -print-module-metadata -module-to-print MyModule -enable-swiftsourceinfo -I %t/Modules -source-filename %s | %FileCheck %s
88

9-
// CHECK: filepath=SOURCE_DIR{{[/\\]}}test{{[/\\]}}Serialization{{[/\\]}}Inputs{{[/\\]}}SourceInfo{{[/\\]}}File1.swift; hash=9da710e9b2de1fff2915639236b8929c; mtime={{[0-9]{4}-[0-9]{2}-[0-9]{2} .*}}; size=35
10-
// CHECK: filepath=SOURCE_DIR{{[/\\]}}test{{[/\\]}}Serialization{{[/\\]}}Inputs{{[/\\]}}SourceInfo{{[/\\]}}File2.swift; hash=22b75a7717318d48f7a979906f35195e; mtime={{[0-9]{4}-[0-9]{2}-[0-9]{2} .*}}; size=57
9+
// CHECK: filepath=SOURCE_DIR{{[/\\]}}test{{[/\\]}}Serialization{{[/\\]}}Inputs{{[/\\]}}SourceInfo{{[/\\]}}File1.swift; hash=9da710e9b2de1fff2915639236b8929c; hashExcludingTypeMembers=bef81a9bfc04156da679d8d579125d39; mtime={{[0-9]{4}-[0-9]{2}-[0-9]{2} .*}}; size=35
10+
// CHECK: filepath=SOURCE_DIR{{[/\\]}}test{{[/\\]}}Serialization{{[/\\]}}Inputs{{[/\\]}}SourceInfo{{[/\\]}}File2.swift; hash=22b75a7717318d48f7a979906f35195e; hashExcludingTypeMembers=7a22dbe5fc611122201f7d6b53094531; mtime={{[0-9]{4}-[0-9]{2}-[0-9]{2} .*}}; size=57

tools/swift-ide-test/swift-ide-test.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2519,6 +2519,8 @@ static void printModuleMetadata(ModuleDecl *MD) {
25192519
MD->collectBasicSourceFileInfo([&](const BasicSourceFileInfo &info) {
25202520
OS << "filepath=" << info.getFilePath() << "; ";
25212521
OS << "hash=" << info.getInterfaceHashIncludingTypeMembers().getRawValue() << "; ";
2522+
OS << "hashExcludingTypeMembers="
2523+
<< info.getInterfaceHashExcludingTypeMembers().getRawValue() << "; ";
25222524
OS << "mtime=" << info.getLastModified() << "; ";
25232525
OS << "size=" << info.getFileSize();
25242526
OS << "\n";

0 commit comments

Comments
 (0)