From 91f051ff9b155afaf2eedfb2f66050af526d7bf5 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" <dexonsmith@apple.com> Date: Wed, 12 Apr 2017 03:45:32 +0000 Subject: [PATCH] Serialization: Emit the final diagnostic state last, almost NFC Emit the final diagnostic state last to match source order. This also prepares for a follow-up commit for implicit modules. There's no real functionaliy change, just a slightly different AST file format. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@300024 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Serialization/ASTReader.cpp | 43 ++++++++++++++++++++------------- lib/Serialization/ASTWriter.cpp | 16 ++++++++++-- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index da29f69c7a1..e09af28059b 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -5533,27 +5533,16 @@ void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { return NewState; }; + // Read the first state. auto *FirstState = ReadDiagState( F.isModule() ? DiagState() : *Diag.DiagStatesByLoc.CurDiagState, SourceLocation(), F.isModule()); - SourceLocation CurStateLoc = - ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); - auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false); - if (!F.isModule()) { - Diag.DiagStatesByLoc.CurDiagState = CurState; - Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc; - - // Preserve the property that the imaginary root file describes the - // current state. - auto &T = Diag.DiagStatesByLoc.Files[FileID()].StateTransitions; - if (T.empty()) - T.push_back({CurState, 0}); - else - T[0].State = CurState; - } - - while (Idx < Record.size()) { + // Read the state transitions. + unsigned NumLocations = Record[Idx++]; + while (NumLocations--) { + assert(Idx < Record.size() && + "Invalid data, missing pragma diagnostic states"); SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]); auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc); assert(IDAndOffset.second == 0 && "not a start location for a FileID"); @@ -5573,6 +5562,26 @@ void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { } } + // Read the final state. + assert(Idx < Record.size() && + "Invalid data, missing final pragma diagnostic state"); + SourceLocation CurStateLoc = + ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); + auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false); + + if (!F.isModule()) { + Diag.DiagStatesByLoc.CurDiagState = CurState; + Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc; + + // Preserve the property that the imaginary root file describes the + // current state. + auto &T = Diag.DiagStatesByLoc.Files[FileID()].StateTransitions; + if (T.empty()) + T.push_back({CurState, 0}); + else + T[0].State = CurState; + } + // Don't try to read these mappings again. Record.clear(); } diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index be1945d5715..ffcad78f295 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -2888,13 +2888,18 @@ void ASTWriter::WritePragmaDiagnosticMappings(const DiagnosticsEngine &Diag, }; AddDiagState(Diag.DiagStatesByLoc.FirstDiagState, isModule); - AddSourceLocation(Diag.DiagStatesByLoc.CurDiagStateLoc, Record); - AddDiagState(Diag.DiagStatesByLoc.CurDiagState, false); + // Reserve a spot for the number of locations with state transitions. + auto NumLocationsIdx = Record.size(); + Record.emplace_back(); + + // Emit the state transitions. + unsigned NumLocations = 0; for (auto &FileIDAndFile : Diag.DiagStatesByLoc.Files) { if (!FileIDAndFile.first.isValid() || !FileIDAndFile.second.HasLocalTransitions) continue; + ++NumLocations; AddSourceLocation(Diag.SourceMgr->getLocForStartOfFile(FileIDAndFile.first), Record); Record.push_back(FileIDAndFile.second.StateTransitions.size()); @@ -2904,6 +2909,13 @@ void ASTWriter::WritePragmaDiagnosticMappings(const DiagnosticsEngine &Diag, } } + // Backpatch the number of locations. + Record[NumLocationsIdx] = NumLocations; + + // Emit CurDiagStateLoc. Do it last in order to match source order. + AddSourceLocation(Diag.DiagStatesByLoc.CurDiagStateLoc, Record); + AddDiagState(Diag.DiagStatesByLoc.CurDiagState, false); + Stream.EmitRecord(DIAG_PRAGMA_MAPPINGS, Record); } -- GitLab