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.


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.
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to