Author: Jan Svoboda Date: 2022-11-01T19:06:55-07:00 New Revision: 0bfc97e4f4eb352f8e080872df8fdca51147683c
URL: https://github.com/llvm/llvm-project/commit/0bfc97e4f4eb352f8e080872df8fdca51147683c DIFF: https://github.com/llvm/llvm-project/commit/0bfc97e4f4eb352f8e080872df8fdca51147683c.diff LOG: [clang][modules] NFCI: Scaffolding for serialization of adjusted SourceManager offsets This patch is a NFC prep for D136624, where we start adjusting offsets into `SourceManager`. Depends on D137213. Reviewed By: dexonsmith Differential Revision: https://reviews.llvm.org/D137214 Added: Modified: clang/include/clang/Serialization/ASTWriter.h clang/lib/Serialization/ASTWriter.cpp clang/lib/Serialization/ASTWriterDecl.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Serialization/ASTWriter.h b/clang/include/clang/Serialization/ASTWriter.h index b0e8306b3a8e..c5ad007dac33 100644 --- a/clang/include/clang/Serialization/ASTWriter.h +++ b/clang/include/clang/Serialization/ASTWriter.h @@ -447,6 +447,22 @@ class ASTWriter : public ASTDeserializationListener, /// User ModuleMaps skipped when writing control block. std::set<const FileEntry *> SkippedModuleMaps; + /// Returns an adjusted \c FileID, accounting for any non-affecting input + /// files. + FileID getAdjustedFileID(FileID FID) const; + /// Returns an adjusted number of \c FileIDs created within the specified \c + /// FileID, accounting for any non-affecting input files. + unsigned getAdjustedNumCreatedFIDs(FileID FID) const; + /// Returns an adjusted \c SourceLocation, accounting for any non-affecting + /// input files. + SourceLocation getAdjustedLocation(SourceLocation Loc) const; + /// Returns an adjusted \c SourceRange, accounting for any non-affecting input + /// files. + SourceRange getAdjustedRange(SourceRange Range) const; + /// Returns an adjusted \c SourceLocation offset, accounting for any + /// non-affecting input files. + SourceLocation::UIntTy getAdjustedOffset(SourceLocation::UIntTy Offset) const; + /// Retrieve or create a submodule ID for this module. unsigned getSubmoduleID(Module *Mod); diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index e1dbe5063395..c4f314879962 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -2063,7 +2063,7 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr, Record.push_back(Code); // Starting offset of this entry within this module, so skip the dummy. - Record.push_back(SLoc->getOffset() - 2); + Record.push_back(getAdjustedOffset(SLoc->getOffset()) - 2); if (SLoc->isFile()) { const SrcMgr::FileInfo &File = SLoc->getFile(); const SrcMgr::ContentCache *Content = &File.getContentCache(); @@ -2086,7 +2086,7 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr, assert(InputFileIDs[Content->OrigEntry] != 0 && "Missed file entry"); Record.push_back(InputFileIDs[Content->OrigEntry]); - Record.push_back(File.NumCreatedFIDs); + Record.push_back(getAdjustedNumCreatedFIDs(FID)); FileDeclIDsTy::iterator FDI = FileDeclIDs.find(FID); if (FDI != FileDeclIDs.end()) { @@ -2146,7 +2146,7 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr, SourceLocation::UIntTy NextOffset = SourceMgr.getNextLocalOffset(); if (I + 1 != N) NextOffset = SourceMgr.getLocalSLocEntry(I + 1).getOffset(); - Record.push_back(NextOffset - SLoc->getOffset() - 1); + Record.push_back(getAdjustedOffset(NextOffset - SLoc->getOffset()) - 1); Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv, Record); } } @@ -2170,7 +2170,7 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr, { RecordData::value_type Record[] = { SOURCE_LOCATION_OFFSETS, SLocEntryOffsets.size(), - SourceMgr.getNextLocalOffset() - 1 /* skip dummy */, + getAdjustedOffset(SourceMgr.getNextLocalOffset()) - 1 /* skip dummy */, SLocEntryOffsetsBase - SourceManagerBlockOffset}; Stream.EmitRecordWithBlob(SLocOffsetsAbbrev, Record, bytes(SLocEntryOffsets)); @@ -2569,7 +2569,7 @@ void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec, uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase; assert((Offset >> 32) == 0 && "Preprocessed entity offset too large"); PreprocessedEntityOffsets.push_back( - PPEntityOffset((*E)->getSourceRange(), Offset)); + PPEntityOffset(getAdjustedRange((*E)->getSourceRange()), Offset)); if (auto *MD = dyn_cast<MacroDefinitionRecord>(*E)) { // Record this macro definition's ID. @@ -3014,7 +3014,7 @@ void ASTWriter::WritePragmaDiagnosticMappings(const DiagnosticsEngine &Diag, Record.push_back(FileIDAndFile.second.StateTransitions.size()); for (auto &StatePoint : FileIDAndFile.second.StateTransitions) { - Record.push_back(StatePoint.Offset); + Record.push_back(getAdjustedOffset(StatePoint.Offset)); AddDiagState(StatePoint.State, false); } } @@ -5225,12 +5225,42 @@ void ASTWriter::AddAlignPackInfo(const Sema::AlignPackInfo &Info, Record.push_back(Raw); } +FileID ASTWriter::getAdjustedFileID(FileID FID) const { + // TODO: Actually adjust this. + return FID; +} + +unsigned ASTWriter::getAdjustedNumCreatedFIDs(FileID FID) const { + // TODO: Actually adjust this. + return PP->getSourceManager() + .getLocalSLocEntry(FID.ID) + .getFile() + .NumCreatedFIDs; +} + +SourceLocation ASTWriter::getAdjustedLocation(SourceLocation Loc) const { + // TODO: Actually adjust this. + return Loc; +} + +SourceRange ASTWriter::getAdjustedRange(SourceRange Range) const { + // TODO: Actually adjust this. + return Range; +} + +SourceLocation::UIntTy +ASTWriter::getAdjustedOffset(SourceLocation::UIntTy Offset) const { + // TODO: Actually adjust this. + return Offset; +} + void ASTWriter::AddFileID(FileID FID, RecordDataImpl &Record) { - Record.push_back(FID.getOpaqueValue()); + Record.push_back(getAdjustedFileID(FID).getOpaqueValue()); } void ASTWriter::AddSourceLocation(SourceLocation Loc, RecordDataImpl &Record, SourceLocationSequence *Seq) { + Loc = getAdjustedLocation(Loc); Record.push_back(SourceLocationEncoding::encode(Loc, Seq)); } diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index e6c09cf5d7f4..edce7e18cdbb 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -2457,11 +2457,12 @@ void ASTWriter::WriteDecl(ASTContext &Context, Decl *D) { SourceLocation Loc = D->getLocation(); unsigned Index = ID - FirstDeclID; if (DeclOffsets.size() == Index) - DeclOffsets.emplace_back(Loc, Offset, DeclTypesBlockStartOffset); + DeclOffsets.emplace_back(getAdjustedLocation(Loc), Offset, + DeclTypesBlockStartOffset); else if (DeclOffsets.size() < Index) { // FIXME: Can/should this happen? DeclOffsets.resize(Index+1); - DeclOffsets[Index].setLocation(Loc); + DeclOffsets[Index].setLocation(getAdjustedLocation(Loc)); DeclOffsets[Index].setBitOffset(Offset, DeclTypesBlockStartOffset); } else { llvm_unreachable("declarations should be emitted in ID order"); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits