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.

llvm-svn: 300024
This commit is contained in:
Duncan P. N. Exon Smith 2017-04-12 03:45:32 +00:00
parent acb089e12a
commit a351c10df3
2 changed files with 40 additions and 19 deletions

View File

@ -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();
}

View File

@ -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);
}