[PATCH] D121533: [clang][deps] Fix traversal of precompiled dependencies

Jan Svoboda via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sat Mar 12 12:17:26 PST 2022


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

The code for traversing precompiled dependencies is somewhat complicated and contains a dangling iterator bug.

This patch uses simpler, recursive implementation.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D121533

Files:
  clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp


Index: clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp
===================================================================
--- clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp
+++ clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp
@@ -84,33 +84,18 @@
                                 PrebuiltModuleFilesT &ModuleFiles,
                                 llvm::StringSet<> &InputFiles,
                                 bool VisitInputFiles) {
-  // Maps the names of modules that weren't yet visited to their PCM path.
-  llvm::StringMap<std::string> ModuleFilesWorklist;
-  // Contains PCM paths of all visited modules.
-  llvm::StringSet<> VisitedModuleFiles;
-
-  PrebuiltModuleListener Listener(ModuleFilesWorklist, InputFiles,
-                                  VisitInputFiles);
-
-  auto GatherModuleFileInfo = [&](StringRef ASTFile) {
-    ASTReader::readASTFileControlBlock(
-        ASTFile, CI.getFileManager(), CI.getPCHContainerReader(),
-        /*FindModuleFileExtensions=*/false, Listener,
-        /*ValidateDiagnosticOptions=*/false);
-  };
-
-  GatherModuleFileInfo(PrebuiltModuleFilename);
-  while (!ModuleFilesWorklist.empty()) {
-    auto WorklistItemIt = ModuleFilesWorklist.begin();
-
-    if (!VisitedModuleFiles.contains(WorklistItemIt->getValue())) {
-      VisitedModuleFiles.insert(WorklistItemIt->getValue());
-      GatherModuleFileInfo(WorklistItemIt->getValue());
-      ModuleFiles[WorklistItemIt->getKey().str()] = WorklistItemIt->getValue();
-    }
-
-    ModuleFilesWorklist.erase(WorklistItemIt);
-  }
+  // Maps the names of imported modules to their PCM paths.
+  llvm::StringMap<std::string> Imports;
+  PrebuiltModuleListener Listener(Imports, InputFiles, VisitInputFiles);
+  ASTReader::readASTFileControlBlock(
+      PrebuiltModuleFilename, CI.getFileManager(), CI.getPCHContainerReader(),
+      /*FindModuleFileExtensions=*/false, Listener,
+      /*ValidateDiagnosticOptions=*/false);
+
+  for (const auto &Import : Imports)
+    if (ModuleFiles.insert({Import.getKey().str(), Import.getValue()}).second)
+      visitPrebuiltModule(Import.getValue(), CI, ModuleFiles, InputFiles,
+                          VisitInputFiles);
 }
 
 /// Transform arbitrary file name into an object-like file name.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D121533.414871.patch
Type: text/x-patch
Size: 2292 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220312/02293cbb/attachment.bin>


More information about the cfe-commits mailing list