Skip to content

Commit a9a044c

Browse files
committed
[Serialization] Serialize fingerprint, mtime, size of the source files
1 parent 09121f7 commit a9a044c

File tree

12 files changed

+119
-26
lines changed

12 files changed

+119
-26
lines changed

include/swift/AST/FileUnit.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,8 +402,8 @@ class LoadedFile : public FileUnit {
402402
return false;
403403
}
404404

405-
virtual void
406-
collectSourceFileNames(llvm::function_ref<void(StringRef)> callback) const {}
405+
virtual void collectBasicSourceFileInfo(
406+
llvm::function_ref<void(const BasicSourceFileInfo &)> callback) const {}
407407

408408
static bool classof(const FileUnit *file) {
409409
return file->getKind() == FileUnitKind::SerializedAST ||

include/swift/AST/Module.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,8 @@ class ModuleDecl : public DeclContext, public TypeDecl {
728728
return ReverseFullNameIterator(this);
729729
}
730730

731-
void collectSourceFileNames(llvm::function_ref<void(StringRef)> callback);
731+
void collectBasicSourceFileInfo(
732+
llvm::function_ref<void(const BasicSourceFileInfo &)> callback);
732733

733734
SourceRange getSourceRange() const { return SourceRange(); }
734735

include/swift/AST/RawComment.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,15 @@
1313
#ifndef SWIFT_AST_RAW_COMMENT_H
1414
#define SWIFT_AST_RAW_COMMENT_H
1515

16+
#include "swift/Basic/Fingerprint.h"
1617
#include "swift/Basic/LLVM.h"
1718
#include "swift/Basic/SourceLoc.h"
1819
#include "swift/Basic/SourceManager.h"
1920

2021
namespace swift {
22+
23+
class SourceFile;
24+
2125
struct SingleRawComment {
2226
enum class CommentKind {
2327
OrdinaryLine, ///< Any normal // comments
@@ -92,6 +96,17 @@ struct BasicDeclLocs {
9296
LineColumn EndLoc;
9397
};
9498

99+
struct BasicSourceFileInfo {
100+
StringRef FilePath;
101+
Fingerprint InterfaceHash = Fingerprint::ZERO();
102+
llvm::sys::TimePoint<> LastModified = {};
103+
uint64_t FileSize = 0;
104+
105+
BasicSourceFileInfo() {}
106+
107+
bool populate(SourceFile *SF);
108+
};
109+
95110
} // namespace swift
96111

97112
#endif // LLVM_SWIFT_AST_RAW_COMMENT_H

include/swift/Serialization/SerializedModuleLoader.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -446,8 +446,8 @@ class SerializedASTFile final : public LoadedFile {
446446

447447
StringRef getTargetTriple() const;
448448

449-
virtual void collectSourceFileNames(
450-
llvm::function_ref<void(StringRef)>) const override;
449+
virtual void collectBasicSourceFileInfo(
450+
llvm::function_ref<void(const BasicSourceFileInfo &)>) const override;
451451

452452
static bool classof(const FileUnit *file) {
453453
return file->getKind() == FileUnitKind::SerializedAST;

lib/AST/Module.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1538,13 +1538,16 @@ const clang::Module *ModuleDecl::findUnderlyingClangModule() const {
15381538
return nullptr;
15391539
}
15401540

1541-
void ModuleDecl::collectSourceFileNames(
1542-
llvm::function_ref<void(StringRef)> callback) {
1541+
void ModuleDecl::collectBasicSourceFileInfo(
1542+
llvm::function_ref<void(const BasicSourceFileInfo &)> callback) {
15431543
for (FileUnit *fileUnit : getFiles()) {
15441544
if (SourceFile *SF = dyn_cast<SourceFile>(fileUnit)) {
1545-
callback(SF->getFilename());
1545+
BasicSourceFileInfo info;
1546+
if (info.populate(SF))
1547+
continue;
1548+
callback(info);
15461549
} else if (auto *serialized = dyn_cast<LoadedFile>(fileUnit)) {
1547-
serialized->collectSourceFileNames(callback);
1550+
serialized->collectBasicSourceFileInfo(callback);
15481551
}
15491552
}
15501553
}

lib/AST/RawComment.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "swift/AST/FileUnit.h"
2323
#include "swift/AST/Module.h"
2424
#include "swift/AST/PrettyStackTrace.h"
25+
#include "swift/AST/SourceFile.h"
2526
#include "swift/AST/Types.h"
2627
#include "swift/Basic/PrimitiveParsing.h"
2728
#include "swift/Basic/SourceManager.h"
@@ -238,3 +239,27 @@ CharSourceRange RawComment::getCharSourceRange() {
238239
static_cast<const char *>(Start.getOpaquePointerValue());
239240
return CharSourceRange(Start, Length);
240241
}
242+
243+
bool BasicSourceFileInfo::populate(SourceFile *SF) {
244+
SourceManager &SM = SF->getASTContext().SourceMgr;
245+
246+
auto filename = SF->getFilename();
247+
if (filename.empty())
248+
return true;
249+
auto stat = SM.getFileSystem()->status(filename);
250+
if (!stat)
251+
return true;
252+
253+
FilePath = filename;
254+
LastModified = stat->getLastModificationTime();
255+
FileSize = stat->getSize();
256+
257+
if (SF->hasInterfaceHash()) {
258+
InterfaceHash = SF->getInterfaceHashIncludingTypeMembers();
259+
} else {
260+
// FIXME: Parse the file with EnableInterfaceHash option.
261+
InterfaceHash = Fingerprint::ZERO();
262+
}
263+
264+
return false;
265+
}

lib/Serialization/ModuleFile.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -959,8 +959,8 @@ Optional<CommentInfo> ModuleFile::getCommentForDecl(const Decl *D) const {
959959
return getCommentForDeclByUSR(USRBuffer.str());
960960
}
961961

962-
void ModuleFile::collectSourceFileNames(
963-
llvm::function_ref<void(StringRef)> callback) const {
962+
void ModuleFile::collectBasicSourceFileInfo(
963+
llvm::function_ref<void(const BasicSourceFileInfo &)> callback) const {
964964
if (Core->SourceFileListData.empty())
965965
return;
966966
assert(!Core->SourceLocsTextData.empty());
@@ -969,11 +969,23 @@ void ModuleFile::collectSourceFileNames(
969969
auto *End = Core->SourceFileListData.bytes_end();
970970
while (Cursor < End) {
971971
auto fileID = endian::readNext<uint32_t, little, unaligned>(Cursor);
972+
auto fpStr = StringRef{reinterpret_cast<const char *>(Cursor),
973+
Fingerprint::DIGEST_LENGTH};
974+
Cursor += Fingerprint::DIGEST_LENGTH;
975+
auto timestamp = endian::readNext<uint64_t, little, unaligned>(Cursor);
976+
auto fileSize = endian::readNext<uint64_t, little, unaligned>(Cursor);
977+
972978
assert(fileID < Core->SourceLocsTextData.size());
973979
auto filePath = Core->SourceLocsTextData.substr(fileID);
974980
size_t terminatorOffset = filePath.find('\0');
975981
filePath = filePath.slice(0, terminatorOffset);
976-
callback(filePath);
982+
983+
BasicSourceFileInfo info;
984+
info.FilePath = filePath;
985+
info.InterfaceHash = Fingerprint::fromString(fpStr);
986+
info.LastModified = llvm::sys::TimePoint<>(std::chrono::seconds(timestamp));
987+
info.FileSize = fileSize;
988+
callback(info);
977989
}
978990
}
979991

lib/Serialization/ModuleFile.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,8 @@ class ModuleFile
694694
Optional<BasicDeclLocs> getBasicDeclLocsForDecl(const Decl *D) const;
695695
Identifier getDiscriminatorForPrivateValue(const ValueDecl *D);
696696
Optional<Fingerprint> loadFingerprint(const IterableDeclContext *IDC) const;
697-
void collectSourceFileNames(llvm::function_ref<void(StringRef)> callback) const;
697+
void collectBasicSourceFileInfo(
698+
llvm::function_ref<void(const BasicSourceFileInfo &)> callback) const;
698699

699700

700701
// MARK: Deserialization interface

lib/Serialization/SerializeDoc.cpp

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -793,29 +793,39 @@ static void emitFileListRecord(llvm::BitstreamWriter &Out,
793793
llvm::SmallString<1024> Buffer;
794794
llvm::StringSet<> seenFilenames;
795795

796-
void emitFilename(StringRef filename) {
797-
if (filename.empty())
798-
return;
799-
llvm::SmallString<128> absolutePath = filename;
796+
void emitSourceFileInfo(const BasicSourceFileInfo &info) {
797+
// Make 'FilePath' absolute for serialization;
798+
SmallString<128> absolutePath = info.FilePath;
800799
llvm::sys::fs::make_absolute(absolutePath);
801-
if (!seenFilenames.insert(absolutePath).second)
800+
801+
// Don't emit duplicated files.
802+
if (!seenFilenames.insert(info.FilePath).second)
802803
return;
803804

804805
auto fileID = FWriter.getTextOffset(absolutePath);
806+
auto timestamp = std::chrono::duration_cast<std::chrono::seconds>(info.LastModified.time_since_epoch()).count();
807+
805808
llvm::raw_svector_ostream out(Buffer);
806809
endian::Writer writer(out, little);
807810
writer.write<uint32_t>(fileID);
811+
out << info.InterfaceHash.getRawValue();
812+
writer.write<uint64_t>(timestamp);
813+
writer.write<uint64_t>(info.FileSize);
808814
}
809815

810816
SourceFileListWriter(StringWriter &FWriter) : FWriter(FWriter) {}
811817
} writer(FWriter);
812818

813819
if (SourceFile *SF = MSF.dyn_cast<SourceFile *>()) {
814-
writer.emitFilename(SF->getFilename());
820+
BasicSourceFileInfo info;
821+
SmallString<128> stash;
822+
if (info.populate(SF))
823+
return;
824+
writer.emitSourceFileInfo(info);
815825
} else {
816826
auto *M = MSF.get<ModuleDecl *>();
817-
M->collectSourceFileNames(
818-
[&](StringRef filename) { writer.emitFilename(filename); });
827+
M->collectBasicSourceFileInfo(
828+
[&](const BasicSourceFileInfo &info) { writer.emitSourceFileInfo(info); });
819829
}
820830

821831
const decl_locs_block::SourceFileListLayout FileList(Out);

lib/Serialization/SerializedModuleLoader.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1328,7 +1328,7 @@ SerializedASTFile::getDiscriminatorForPrivateValue(const ValueDecl *D) const {
13281328
return discriminator;
13291329
}
13301330

1331-
void SerializedASTFile::collectSourceFileNames(
1332-
llvm::function_ref<void(StringRef)> callback) const {
1333-
File.collectSourceFileNames(callback);
1331+
void SerializedASTFile::collectBasicSourceFileInfo(
1332+
llvm::function_ref<void(const BasicSourceFileInfo &)> callback) const {
1333+
File.collectBasicSourceFileInfo(callback);
13341334
}

0 commit comments

Comments
 (0)