Skip to content

Commit 1b6e785

Browse files
committed
[Serialization] Serialize/deserialize source file list
1 parent 9f6d351 commit 1b6e785

File tree

12 files changed

+101
-1
lines changed

12 files changed

+101
-1
lines changed

include/swift/AST/FileUnit.h

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

405+
virtual void
406+
collectSourceFileNames(llvm::function_ref<void(StringRef)> callback) const {}
407+
405408
static bool classof(const FileUnit *file) {
406409
return file->getKind() == FileUnitKind::SerializedAST ||
407410
file->getKind() == FileUnitKind::ClangModule ||

include/swift/AST/Module.h

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

731+
void collectSourceFileNames(llvm::function_ref<void(StringRef)> callback);
732+
731733
SourceRange getSourceRange() const { return SourceRange(); }
732734

733735
static bool classof(const DeclContext *DC) {

include/swift/Serialization/SerializedModuleLoader.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,9 @@ class SerializedASTFile final : public LoadedFile {
446446

447447
StringRef getTargetTriple() const;
448448

449+
virtual void collectSourceFileNames(
450+
llvm::function_ref<void(StringRef)>) const override;
451+
449452
static bool classof(const FileUnit *file) {
450453
return file->getKind() == FileUnitKind::SerializedAST;
451454
}

lib/AST/Module.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,6 +1514,17 @@ const clang::Module *ModuleDecl::findUnderlyingClangModule() const {
15141514
return nullptr;
15151515
}
15161516

1517+
void ModuleDecl::collectSourceFileNames(
1518+
llvm::function_ref<void(StringRef)> callback) {
1519+
for (FileUnit *fileUnit : getFiles()) {
1520+
if (SourceFile *SF = dyn_cast<SourceFile>(fileUnit)) {
1521+
callback(SF->getFilename());
1522+
} else if (auto *serialized = dyn_cast<LoadedFile>(fileUnit)) {
1523+
serialized->collectSourceFileNames(callback);
1524+
}
1525+
}
1526+
}
1527+
15171528
//===----------------------------------------------------------------------===//
15181529
// Cross-Import Overlays
15191530
//===----------------------------------------------------------------------===//

lib/Serialization/ModuleFile.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -959,6 +959,24 @@ 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 {
964+
if (Core->SourceFileListData.empty())
965+
return;
966+
assert(!Core->SourceLocsTextData.empty());
967+
968+
auto *Cursor = Core->SourceFileListData.bytes_begin();
969+
auto *End = Core->SourceFileListData.bytes_end();
970+
while (Cursor < End) {
971+
auto fileID = endian::readNext<uint32_t, little, unaligned>(Cursor);
972+
assert(fileID < Core->SourceLocsTextData.size());
973+
auto filePath = Core->SourceLocsTextData.substr(fileID);
974+
size_t terminatorOffset = filePath.find('\0');
975+
filePath = filePath.slice(0, terminatorOffset);
976+
callback(filePath);
977+
}
978+
}
979+
962980
Optional<BasicDeclLocs>
963981
ModuleFile::getBasicDeclLocsForDecl(const Decl *D) const {
964982
assert(D);

lib/Serialization/ModuleFile.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,7 @@ 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;
697698

698699

699700
// MARK: Deserialization interface

lib/Serialization/ModuleFileSharedCore.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -974,6 +974,9 @@ bool ModuleFileSharedCore::readDeclLocsBlock(llvm::BitstreamCursor &cursor) {
974974
return false;
975975
}
976976
switch (*kind) {
977+
case decl_locs_block::SOURCE_FILE_LIST:
978+
SourceFileListData = blobData;
979+
break;
977980
case decl_locs_block::BASIC_DECL_LOCS:
978981
BasicDeclLocsData = blobData;
979982
break;

lib/Serialization/ModuleFileSharedCore.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,9 @@ class ModuleFileSharedCore {
289289
/// A blob of 0 terminated string segments referenced in \c SourceLocsTextData
290290
StringRef SourceLocsTextData;
291291

292+
/// A blob of source file list.
293+
StringRef SourceFileListData;
294+
292295
/// An array of fixed size source location data for each USR appearing in
293296
/// \c DeclUSRsTable.
294297
StringRef BasicDeclLocsData;

lib/Serialization/SerializeDoc.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,46 @@ static void emitBasicLocsRecord(llvm::BitstreamWriter &Out,
783783
DeclLocsList.emit(scratch, Writer.Buffer);
784784
}
785785

786+
static void emitFileListRecord(llvm::BitstreamWriter &Out,
787+
ModuleOrSourceFile MSF, StringWriter &FWriter) {
788+
assert(MSF);
789+
790+
struct SourceFileListWriter {
791+
StringWriter &FWriter;
792+
793+
llvm::SmallString<1024> Buffer;
794+
llvm::StringSet<> seenFilenames;
795+
796+
void emitFilename(StringRef filename) {
797+
if (filename.empty())
798+
return;
799+
llvm::SmallString<128> absolutePath = filename;
800+
llvm::sys::fs::make_absolute(absolutePath);
801+
if (!seenFilenames.insert(absolutePath).second)
802+
return;
803+
804+
auto fileID = FWriter.getTextOffset(absolutePath);
805+
llvm::raw_svector_ostream out(Buffer);
806+
endian::Writer writer(out, little);
807+
writer.write<uint32_t>(fileID);
808+
}
809+
810+
SourceFileListWriter(StringWriter &FWriter) : FWriter(FWriter) {}
811+
} writer(FWriter);
812+
813+
if (SourceFile *SF = MSF.dyn_cast<SourceFile *>()) {
814+
writer.emitFilename(SF->getFilename());
815+
} else {
816+
auto *M = MSF.get<ModuleDecl *>();
817+
M->collectSourceFileNames(
818+
[&](StringRef filename) { writer.emitFilename(filename); });
819+
}
820+
821+
const decl_locs_block::SourceFileListLayout FileList(Out);
822+
SmallVector<uint64_t, 8> scratch;
823+
FileList.emit(scratch, writer.Buffer);
824+
}
825+
786826
class SourceInfoSerializer : public SerializerBase {
787827
public:
788828
using SerializerBase::SerializerBase;
@@ -807,6 +847,7 @@ class SourceInfoSerializer : public SerializerBase {
807847
BLOCK_RECORD(control_block, TARGET);
808848

809849
BLOCK(DECL_LOCS_BLOCK);
850+
BLOCK_RECORD(decl_locs_block, SOURCE_FILE_LIST);
810851
BLOCK_RECORD(decl_locs_block, BASIC_DECL_LOCS);
811852
BLOCK_RECORD(decl_locs_block, DECL_USRS);
812853
BLOCK_RECORD(decl_locs_block, TEXT_DATA);
@@ -849,6 +890,7 @@ void serialization::writeSourceInfoToStream(raw_ostream &os,
849890
DeclUSRsTableWriter USRWriter;
850891
StringWriter FPWriter;
851892
DocRangeWriter DocWriter;
893+
emitFileListRecord(S.Out, DC, FPWriter);
852894
emitBasicLocsRecord(S.Out, DC, USRWriter, FPWriter, DocWriter);
853895
// Emit USR table mapping from a USR to USR Id.
854896
// The basic locs record uses USR Id instead of actual USR, so that we

lib/Serialization/SerializedModuleLoader.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,3 +1327,8 @@ SerializedASTFile::getDiscriminatorForPrivateValue(const ValueDecl *D) const {
13271327
assert(!discriminator.empty() && "no discriminator found for value");
13281328
return discriminator;
13291329
}
1330+
1331+
void SerializedASTFile::collectSourceFileNames(
1332+
llvm::function_ref<void(StringRef)> callback) const {
1333+
File.collectSourceFileNames(callback);
1334+
}

0 commit comments

Comments
 (0)