forked from OSchip/llvm-project
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:
parent
acb089e12a
commit
a351c10df3
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue