diff options
| author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2017-03-14 19:31:27 +0000 | 
|---|---|---|
| committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2017-03-14 19:31:27 +0000 | 
| commit | 3cb183b1216636570b38f8189b43db7d11fc39af (patch) | |
| tree | dad959e70c802a38537b8b5667c8f480bd17c939 | |
| parent | 43dcf4d330452605faf895f00732f5414127fd61 (diff) | |
| download | bcm5719-llvm-3cb183b1216636570b38f8189b43db7d11fc39af.tar.gz bcm5719-llvm-3cb183b1216636570b38f8189b43db7d11fc39af.zip  | |
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.
llvm-svn: 297770
| -rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 8 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 8 | 
2 files changed, 10 insertions, 6 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index be0cc9ab1a8..e4eddaef989 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -5463,16 +5463,16 @@ void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {        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;      }; diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index b13a4e1ff4b..e9e64c2a66f 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -2871,14 +2871,18 @@ void ASTWriter::WritePragmaDiagnosticMappings(const DiagnosticsEngine &Diag,      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;      }    };  | 

