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