Author: dexonsmith Date: Tue Mar 14 14:31:27 2017 New Revision: 297770 URL: http://llvm.org/viewvc/llvm-project?rev=297770&view=rev Log: Modules: Optimize bitcode encoding of diagnostic state
Since bitcode uses VBR encoding, large numbers are more expensive than small ones. Instead of emitting a UINT_MAX sentinel after each sequence of state-change pairs, emit the size of the sequence as a prefix. This should have no functionality change besides saving bits from the encoding. Modified: cfe/trunk/lib/Serialization/ASTReader.cpp cfe/trunk/lib/Serialization/ASTWriter.cpp Modified: cfe/trunk/lib/Serialization/ASTReader.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=297770&r1=297769&r2=297770&view=diff ============================================================================== --- cfe/trunk/lib/Serialization/ASTReader.cpp (original) +++ cfe/trunk/lib/Serialization/ASTReader.cpp Tue Mar 14 14:31:27 2017 @@ -5463,16 +5463,16 @@ void ASTReader::ReadPragmaDiagnosticMapp Diag.DiagStates.push_back(BasedOn); DiagState *NewState = &Diag.DiagStates.back(); DiagStates.push_back(NewState); - while (Idx + 1 < Record.size() && Record[Idx] != unsigned(-1)) { + unsigned Size = Record[Idx++]; + assert(Idx + Size * 2 <= Record.size() && + "Invalid data, not enough diag/map pairs"); + while (Size--) { unsigned DiagID = Record[Idx++]; diag::Severity Map = (diag::Severity)Record[Idx++]; DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc); if (Mapping.isPragma() || IncludeNonPragmaStates) NewState->setMapping(DiagID, Mapping); } - assert(Idx != Record.size() && Record[Idx] == unsigned(-1) && - "Invalid data, didn't find '-1' marking end of diag/map pairs"); - ++Idx; return NewState; }; Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=297770&r1=297769&r2=297770&view=diff ============================================================================== --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original) +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Tue Mar 14 14:31:27 2017 @@ -2871,14 +2871,18 @@ void ASTWriter::WritePragmaDiagnosticMap if (DiagStateID == 0) { DiagStateID = ++CurrID; + + // Add a placeholder for the number of mappings. + auto SizeIdx = Record.size(); + Record.emplace_back(); for (const auto &I : *State) { if (I.second.isPragma() || IncludeNonPragmaStates) { Record.push_back(I.first); Record.push_back((unsigned)I.second.getSeverity()); } } - // Add a sentinel to mark the end of the diag IDs. - Record.push_back(unsigned(-1)); + // Update the placeholder. + Record[SizeIdx] = (Record.size() - SizeIdx) / 2; } }; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits