jansvoboda11 created this revision.
jansvoboda11 added reviewers: Bigcheese, dexonsmith, vsapsai.
Herald added a subscriber: mgrang.
jansvoboda11 requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

This patch stops tracking the number of includes of a file. The information is 
not used anywhere except for stat printing. Only tracking the fact whether a 
file was included or not simplifies the code and should be more efficient.

Depends on D114095 <https://reviews.llvm.org/D114095>.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D114096

Files:
  clang/include/clang/Lex/Preprocessor.h
  clang/lib/Lex/Preprocessor.cpp
  clang/lib/Serialization/ASTReader.cpp
  clang/lib/Serialization/ASTWriter.cpp

Index: clang/lib/Serialization/ASTWriter.cpp
===================================================================
--- clang/lib/Serialization/ASTWriter.cpp
+++ clang/lib/Serialization/ASTWriter.cpp
@@ -2173,22 +2173,20 @@
 void ASTWriter::writeIncludedFiles(raw_ostream &Out, const Preprocessor &PP) {
   using namespace llvm::support;
 
-  std::vector<std::pair<uint32_t, unsigned short>> IncludedInputFiles;
+  std::vector<bool> IncludedInputFiles;
   for (const auto &File : PP.getIncludedFiles()) {
-    auto InputFileIt = InputFileIDs.find(File.first);
-    if (InputFileIt != InputFileIDs.end())
-      IncludedInputFiles.emplace_back(InputFileIt->second, File.second);
+    auto InputFileIt = InputFileIDs.find(File);
+    if (InputFileIt == InputFileIDs.end())
+      continue;
+    auto InputFileID = InputFileIt->second;
+    if (IncludedInputFiles.size() <= InputFileID)
+      IncludedInputFiles.resize(InputFileID + 1);
+    IncludedInputFiles[InputFileIt->second] = true;
   }
 
-  llvm::sort(IncludedInputFiles);
-
   endian::Writer LE(Out, little);
   LE.write<uint32_t>(IncludedInputFiles.size());
-
-  for (const auto &IncludedInputFile : IncludedInputFiles) {
-    LE.write<uint32_t>(IncludedInputFile.first);
-    LE.write<uint16_t>(IncludedInputFile.second);
-  }
+  Out << bytes(IncludedInputFiles);
 }
 
 /// Writes the block containing the serialized form of the
Index: clang/lib/Serialization/ASTReader.cpp
===================================================================
--- clang/lib/Serialization/ASTReader.cpp
+++ clang/lib/Serialization/ASTReader.cpp
@@ -2966,16 +2966,13 @@
   const unsigned char *D = (const unsigned char *)Blob.data();
   unsigned FileCount = endian::readNext<uint32_t, little, unaligned>(D);
 
-  for (unsigned I = 0; I < FileCount; ++I) {
-    auto InputFileID = endian::readNext<uint32_t, little, unaligned>(D);
-    auto NumIncludes = endian::readNext<uint16_t, little, unaligned>(D);
-
-    auto InputFileInfo = readInputFileInfo(F, InputFileID);
-    if (auto File = PP.getFileManager().getFile(InputFileInfo.Filename)) {
-      unsigned short &PPNumIncludes = PP.getIncludedFiles()[*File];
-      PPNumIncludes = std::max(PPNumIncludes, NumIncludes);
-    }
-  }
+  for (unsigned I = 0; I < FileCount; ++D)
+    for (unsigned Bit = 0; Bit < 8 && I < FileCount; ++Bit, ++I)
+      if (*D & (1 << Bit)) {
+        auto InputFileInfo = readInputFileInfo(F, I);
+        if (auto File = PP.getFileManager().getFile(InputFileInfo.Filename))
+          PP.getIncludedFiles().insert(*File);
+      }
 }
 
 llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
Index: clang/lib/Lex/Preprocessor.cpp
===================================================================
--- clang/lib/Lex/Preprocessor.cpp
+++ clang/lib/Lex/Preprocessor.cpp
@@ -286,15 +286,6 @@
              << " token paste (##) operations performed, "
              << NumFastTokenPaste << " on the fast path.\n";
 
-  unsigned MaxNumIncludes = 0, NumSingleIncludedFiles = 0;
-  for (const auto &IncludedFile : IncludedFiles) {
-    if (MaxNumIncludes < IncludedFile.second)
-      MaxNumIncludes = IncludedFile.second;
-    NumSingleIncludedFiles += IncludedFile.second == 1;
-  }
-  llvm::errs() << NumSingleIncludedFiles << " included exactly once.\n"
-               << MaxNumIncludes << " max times a file is included.\n";
-
   llvm::errs() << "\nPreprocessor Memory: " << getTotalMemory() << "B total";
 
   llvm::errs() << "\n  BumpPtr: " << BP.getTotalMemory();
Index: clang/include/clang/Lex/Preprocessor.h
===================================================================
--- clang/include/clang/Lex/Preprocessor.h
+++ clang/include/clang/Lex/Preprocessor.h
@@ -765,8 +765,8 @@
   /// in a submodule.
   SubmoduleState *CurSubmoduleState;
 
-  /// The number of times each file was included.
-  llvm::DenseMap<const FileEntry *, unsigned short> IncludedFiles;
+  /// The files that have been included.
+  llvm::DenseSet<const FileEntry *> IncludedFiles;
 
   /// The set of known macros exported from modules.
   llvm::FoldingSet<ModuleMacro> ModuleMacros;
@@ -1230,9 +1230,7 @@
   /// Increment the count for the number of times the specified FileEntry has
   /// been entered. Returns true if this is the first time it file was included.
   bool incrementIncludeCount(const FileEntry *File) {
-    auto It = IncludedFiles.insert({File, 0});
-    ++It.first->second;
-    return It.second;
+    return IncludedFiles.insert(File).second;
   }
 
   /// Return true if this header has already been included.
@@ -1240,12 +1238,11 @@
     return IncludedFiles.count(File);
   }
 
-  /// Get the included files along with the include count.
-  llvm::DenseMap<const FileEntry *, unsigned short> &getIncludedFiles() {
+  /// Get the included files.
+  llvm::DenseSet<const FileEntry *> &getIncludedFiles() {
     return IncludedFiles;
   }
-  const llvm::DenseMap<const FileEntry *, unsigned short> &
-  getIncludedFiles() const {
+  const llvm::DenseSet<const FileEntry *> &getIncludedFiles() const {
     return IncludedFiles;
   }
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D114096: [... Jan Svoboda via Phabricator via cfe-commits

Reply via email to