diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -2196,6 +2196,18 @@ return ReadSourceLocation(ModuleFile, Record[Idx++], Seq); } + /// Read a FileID. + FileID ReadFileID(ModuleFile &F, const RecordDataImpl &Record, + unsigned &Idx) const { + return TranslateFileID(F, FileID::get(Record[Idx++])); + } + + /// Translate a FileID from another module file's FileID space into ours. + FileID TranslateFileID(ModuleFile &F, FileID FID) const { + assert(FID.ID >= 0 && "Reading non-local FileID."); + return FileID::get(F.SLocEntryBaseID + FID.ID - 1); + } + /// Read a source range. SourceRange ReadSourceRange(ModuleFile &F, const RecordData &Record, unsigned &Idx, LocSeq *Seq = nullptr); diff --git a/clang/include/clang/Serialization/ASTWriter.h b/clang/include/clang/Serialization/ASTWriter.h --- a/clang/include/clang/Serialization/ASTWriter.h +++ b/clang/include/clang/Serialization/ASTWriter.h @@ -582,6 +582,9 @@ void AddAlignPackInfo(const Sema::AlignPackInfo &Info, RecordDataImpl &Record); + /// Emit a FileID. + void AddFileID(FileID FID, RecordDataImpl &Record); + /// Emit a source location. void AddSourceLocation(SourceLocation Loc, RecordDataImpl &Record, LocSeq *Seq = nullptr); diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -1338,10 +1338,7 @@ // Parse the line entries std::vector Entries; while (Idx < Record.size()) { - int FID = Record[Idx++]; - assert(FID >= 0 && "Serialized line entries for non-local file."); - // Remap FileID from 1-based old view. - FID += F.SLocEntryBaseID - 1; + FileID FID = ReadFileID(F, Record, Idx); // Extract the line entries unsigned NumEntries = Record[Idx++]; @@ -1358,7 +1355,7 @@ Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID, FileKind, IncludeOffset)); } - LineTable.AddEntry(FileID::get(FID), Entries); + LineTable.AddEntry(FID, Entries); } } @@ -4294,10 +4291,8 @@ // Map the original source file ID into the ID space of the current // compilation. - if (F.OriginalSourceFileID.isValid()) { - F.OriginalSourceFileID = FileID::get( - F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1); - } + if (F.OriginalSourceFileID.isValid()) + F.OriginalSourceFileID = TranslateFileID(F, F.OriginalSourceFileID); // Preload all the pending interesting identifiers by marking them out of // date. diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -1469,12 +1469,12 @@ Record.clear(); Record.push_back(ORIGINAL_FILE); - Record.push_back(SM.getMainFileID().getOpaqueValue()); + AddFileID(SM.getMainFileID(), Record); EmitRecordWithPath(FileAbbrevCode, Record, MainFile->getName()); } Record.clear(); - Record.push_back(SM.getMainFileID().getOpaqueValue()); + AddFileID(SM.getMainFileID(), Record); Stream.EmitRecord(ORIGINAL_FILE_ID, Record); std::set AffectingClangModuleMaps; @@ -2206,8 +2206,7 @@ if (L.first.ID < 0) continue; - // Emit the file ID - Record.push_back(L.first.ID); + AddFileID(L.first, Record); // Emit the line entries Record.push_back(L.second.size()); @@ -5228,6 +5227,10 @@ Record.push_back(Raw); } +void ASTWriter::AddFileID(FileID FID, RecordDataImpl &Record) { + Record.push_back(FID.getOpaqueValue()); +} + void ASTWriter::AddSourceLocation(SourceLocation Loc, RecordDataImpl &Record, SourceLocationSequence *Seq) { Record.push_back(SourceLocationEncoding::encode(Loc, Seq));