diff --git a/clang/include/clang/Serialization/ModuleFile.h b/clang/include/clang/Serialization/ModuleFile.h index 8c4067853d664..0af5cae6aebc3 100644 --- a/clang/include/clang/Serialization/ModuleFile.h +++ b/clang/include/clang/Serialization/ModuleFile.h @@ -245,7 +245,10 @@ class ModuleFile { /// The cursor to the start of the input-files block. llvm::BitstreamCursor InputFilesCursor; - /// Offsets for all of the input file entries in the AST file. + /// Absolute offset of the start of the input-files block. + uint64_t InputFilesOffsetBase = 0; + + /// Relative offsets for all of the input file entries in the AST file. const llvm::support::unaligned_uint64_t *InputFileOffsets = nullptr; /// The input files that have been loaded from this AST file. diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 9491733d47df3..82dac5fbfc888 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -2326,7 +2326,8 @@ InputFileInfo ASTReader::getInputFileInfo(ModuleFile &F, unsigned ID) { // Go find this input file. BitstreamCursor &Cursor = F.InputFilesCursor; SavedStreamPosition SavedPosition(Cursor); - if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { + if (llvm::Error Err = Cursor.JumpToBit(F.InputFilesOffsetBase + + F.InputFileOffsets[ID - 1])) { // FIXME this drops errors on the floor. consumeError(std::move(Err)); } @@ -2410,7 +2411,8 @@ InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { // Go find this input file. BitstreamCursor &Cursor = F.InputFilesCursor; SavedStreamPosition SavedPosition(Cursor); - if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { + if (llvm::Error Err = Cursor.JumpToBit(F.InputFilesOffsetBase + + F.InputFileOffsets[ID - 1])) { // FIXME this drops errors on the floor. consumeError(std::move(Err)); } @@ -2788,6 +2790,7 @@ ASTReader::ReadControlBlock(ModuleFile &F, Error("malformed block record in AST file"); return Failure; } + F.InputFilesOffsetBase = F.InputFilesCursor.GetCurrentBitNo(); continue; case OPTIONS_BLOCK_ID: @@ -5328,6 +5331,7 @@ bool ASTReader::readASTFileControlBlock( bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); bool NeedsImports = Listener.needsImportVisitation(); BitstreamCursor InputFilesCursor; + uint64_t InputFilesOffsetBase = 0; RecordData Record; std::string ModuleDir; @@ -5363,6 +5367,7 @@ bool ASTReader::readASTFileControlBlock( if (NeedsInputFiles && ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)) return true; + InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo(); break; default: @@ -5435,7 +5440,8 @@ bool ASTReader::readASTFileControlBlock( BitstreamCursor &Cursor = InputFilesCursor; SavedStreamPosition SavedPosition(Cursor); - if (llvm::Error Err = Cursor.JumpToBit(InputFileOffs[I])) { + if (llvm::Error Err = + Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) { // FIXME this drops errors on the floor. consumeError(std::move(Err)); } diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 22420aab9ca08..2a12779b0d7d1 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -1570,6 +1570,8 @@ void ASTWriter::WriteInputFiles(SourceManager &SourceMgr, IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); unsigned IFHAbbrevCode = Stream.EmitAbbrev(std::move(IFHAbbrev)); + uint64_t InputFilesOffsetBase = Stream.GetCurrentBitNo(); + // Get all ContentCache objects for files. std::vector UserFiles; std::vector SystemFiles; @@ -1633,7 +1635,7 @@ void ASTWriter::WriteInputFiles(SourceManager &SourceMgr, continue; // already recorded this file. // Record this entry's offset. - InputFileOffsets.push_back(Stream.GetCurrentBitNo()); + InputFileOffsets.push_back(Stream.GetCurrentBitNo() - InputFilesOffsetBase); InputFileID = InputFileOffsets.size();