https://github.com/jansvoboda11 updated 
https://github.com/llvm/llvm-project/pull/197961

>From ab4971fc941c02b4c3de8e122b5bf6f80f58540f Mon Sep 17 00:00:00 2001
From: Jan Svoboda <[email protected]>
Date: Mon, 11 May 2026 16:00:37 -0700
Subject: [PATCH] [clang][deps] Reuse `ModuleDepCollector`

---
 .../DependencyScannerImpl.h                   | 11 --------
 .../DependencyScanning/ModuleDepCollector.h   |  4 ++-
 .../clang/Tooling/DependencyScanningTool.h    |  2 ++
 .../DependencyScannerImpl.cpp                 | 22 +++------------
 .../DependencyScanning/ModuleDepCollector.cpp | 27 +++++++++++++++++--
 clang/lib/Tooling/DependencyScanningTool.cpp  | 13 +++++----
 6 files changed, 40 insertions(+), 39 deletions(-)

diff --git a/clang/include/clang/DependencyScanning/DependencyScannerImpl.h 
b/clang/include/clang/DependencyScanning/DependencyScannerImpl.h
index 893017e68233b..333ea76c9b17e 100644
--- a/clang/include/clang/DependencyScanning/DependencyScannerImpl.h
+++ b/clang/include/clang/DependencyScanning/DependencyScannerImpl.h
@@ -113,17 +113,6 @@ getInitialStableDirs(const CompilerInstance &ScanInstance);
 std::optional<PrebuiltModulesAttrsMap>
 computePrebuiltModulesASTMap(CompilerInstance &ScanInstance,
                              SmallVector<StringRef> &StableDirs);
-
-/// Create the dependency collector that will collect the produced
-/// dependencies. May return the created ModuleDepCollector depending
-/// on the scanning format.
-std::shared_ptr<ModuleDepCollector> initializeScanInstanceDependencyCollector(
-    CompilerInstance &ScanInstance,
-    std::unique_ptr<DependencyOutputOptions> DepOutputOpts,
-    DependencyScanningService &Service, CompilerInvocation &Inv,
-    DependencyActionController &Controller,
-    PrebuiltModulesAttrsMap PrebuiltModulesASTMap,
-    SmallVector<StringRef> &StableDirs);
 } // namespace dependencies
 } // namespace clang
 
diff --git a/clang/include/clang/DependencyScanning/ModuleDepCollector.h 
b/clang/include/clang/DependencyScanning/ModuleDepCollector.h
index c3a13ba48ca84..88332640c8e43 100644
--- a/clang/include/clang/DependencyScanning/ModuleDepCollector.h
+++ b/clang/include/clang/DependencyScanning/ModuleDepCollector.h
@@ -132,6 +132,8 @@ class ModuleDepCollector final : public DependencyCollector 
{
   /// invocation, (e.g. disable implicit modules, add explicit module paths).
   void applyDiscoveredDependencies(CompilerInvocation &CI);
 
+  void clearLocalState();
+
 private:
   friend ModuleDepCollectorPP;
 
@@ -146,7 +148,7 @@ class ModuleDepCollector final : public DependencyCollector 
{
   const PrebuiltModulesAttrsMap PrebuiltModulesASTMap;
   /// Directory paths known to be stable through an active development and 
build
   /// cycle.
-  const ArrayRef<StringRef> StableDirs;
+  const SmallVector<StringRef> StableDirs;
   /// Path to the main source file.
   std::string MainFile;
   /// Non-modular file dependencies. This includes the main source file and
diff --git a/clang/include/clang/Tooling/DependencyScanningTool.h 
b/clang/include/clang/Tooling/DependencyScanningTool.h
index 88a0eb0674458..26ebfff64135e 100644
--- a/clang/include/clang/Tooling/DependencyScanningTool.h
+++ b/clang/include/clang/Tooling/DependencyScanningTool.h
@@ -168,6 +168,8 @@ class CompilerInstanceWithContext {
   // Compiler Instance
   std::unique_ptr<CompilerInstance> CIPtr;
 
+  std::shared_ptr<dependencies::ModuleDepCollector> MDC;
+
   // Source location offset.
   int32_t SrcLocOffset = 0;
 
diff --git a/clang/lib/DependencyScanning/DependencyScannerImpl.cpp 
b/clang/lib/DependencyScanning/DependencyScannerImpl.cpp
index 42f87adba84c9..83190942a0142 100644
--- a/clang/lib/DependencyScanning/DependencyScannerImpl.cpp
+++ b/clang/lib/DependencyScanning/DependencyScannerImpl.cpp
@@ -505,21 +505,6 @@ dependencies::createDependencyOutputOptions(
   return Opts;
 }
 
-std::shared_ptr<ModuleDepCollector>
-dependencies::initializeScanInstanceDependencyCollector(
-    CompilerInstance &ScanInstance,
-    std::unique_ptr<DependencyOutputOptions> DepOutputOpts,
-    DependencyScanningService &Service, CompilerInvocation &Inv,
-    DependencyActionController &Controller,
-    PrebuiltModulesAttrsMap PrebuiltModulesASTMap,
-    SmallVector<StringRef> &StableDirs) {
-  auto MDC = std::make_shared<ModuleDepCollector>(
-      Service, std::move(DepOutputOpts), ScanInstance, Controller, Inv,
-      std::move(PrebuiltModulesASTMap), StableDirs);
-  ScanInstance.addDependencyCollector(MDC);
-  return MDC;
-}
-
 /// Manages (and terminates) the asynchronous compilation of modules.
 class AsyncModuleCompiles {
   std::mutex Mutex;
@@ -768,9 +753,10 @@ bool DependencyScanningAction::runInvocation(
 
   auto DepOutputOpts = createDependencyOutputOptions(*OriginalInvocation);
 
-  MDC = initializeScanInstanceDependencyCollector(
-      ScanInstance, std::move(DepOutputOpts), Service, *OriginalInvocation,
-      Controller, *MaybePrebuiltModulesASTMap, StableDirs);
+  MDC = std::make_shared<ModuleDepCollector>(
+      Service, std::move(DepOutputOpts), ScanInstance, Controller,
+      *OriginalInvocation, *MaybePrebuiltModulesASTMap, StableDirs);
+  ScanInstance.addDependencyCollector(MDC);
 
   if (ScanInstance.getDiagnostics().hasErrorOccurred())
     return false;
diff --git a/clang/lib/DependencyScanning/ModuleDepCollector.cpp 
b/clang/lib/DependencyScanning/ModuleDepCollector.cpp
index 5be29ccf36dcc..4e81726190972 100644
--- a/clang/lib/DependencyScanning/ModuleDepCollector.cpp
+++ b/clang/lib/DependencyScanning/ModuleDepCollector.cpp
@@ -459,6 +459,17 @@ void 
ModuleDepCollector::applyDiscoveredDependencies(CompilerInvocation &CI) {
   }
 }
 
+void ModuleDepCollector::clearLocalState() {
+  MainFile.clear();
+  FileDeps.clear();
+  DirectPrebuiltModularDeps.clear();
+  DirectModularDeps.clear();
+  DirectImports.clear();
+  VisibleModules.clear();
+  ProvidedStdCXXModule.reset();
+  RequiredStdCXXModules.clear();
+}
+
 static bool isSafeToIgnoreCWD(const CowCompilerInvocation &CI) {
   // Check if the command line input uses relative paths.
   // It is not safe to ignore the current working directory if any of the
@@ -657,8 +668,20 @@ void ModuleDepCollector::run(DependencyConsumer &Consumer) 
{
   Consumer.handleProvidedAndRequiredStdCXXModules(MDC.ProvidedStdCXXModule,
                                                   MDC.RequiredStdCXXModules);
 
-  for (auto &&I : MDC.ModularDeps)
-    Consumer.handleModuleDependency(*I.second);
+  llvm::DenseSet<serialization::ModuleFile *> HandledModuleDependencies;
+  std::function<void(serialization::ModuleFile *)> HandleModuleDependency =
+      [&](serialization::ModuleFile *MF) {
+        if (HandledModuleDependencies.insert(MF).second) {
+          for (serialization::ModuleFile *MFI : MF->Imports)
+            HandleModuleDependency(MFI);
+          auto It = MDC.ModularDeps.find(MF);
+          if (It != MDC.ModularDeps.end())
+            Consumer.handleModuleDependency(*It->second);
+        }
+      };
+
+  for (serialization::ModuleFile *MF : MDC.DirectModularDeps)
+    HandleModuleDependency(MF);
 
   for (serialization::ModuleFile *MF : MDC.DirectModularDeps) {
     auto It = MDC.ModularDeps.find(MF);
diff --git a/clang/lib/Tooling/DependencyScanningTool.cpp 
b/clang/lib/Tooling/DependencyScanningTool.cpp
index 831cb0ea9bc1d..b59fcb70bbeaa 100644
--- a/clang/lib/Tooling/DependencyScanningTool.cpp
+++ b/clang/lib/Tooling/DependencyScanningTool.cpp
@@ -516,6 +516,10 @@ bool CompilerInstanceWithContext::initialize(
   // CompilerInstance::ExecuteAction to perform scanning.
   CI.createTarget();
 
+  MDC = std::make_shared<ModuleDepCollector>(
+      Worker.Service, std::make_unique<DependencyOutputOptions>(*OutputOpts),
+      CI, Controller, *OriginalInvocation, PrebuiltModuleASTMap, StableDirs);
+
   return true;
 }
 
@@ -543,13 +547,7 @@ bool CompilerInstanceWithContext::computeDependencies(
     CI.getPreprocessor().removePPCallbacks();
   });
 
-  auto MDC = initializeScanInstanceDependencyCollector(
-      CI, std::make_unique<DependencyOutputOptions>(*OutputOpts),
-      Worker.Service,
-      /* The MDC's constructor makes a copy of the OriginalInvocation, so
-      we can pass it in without worrying that it might be changed across
-      invocations of computeDependencies. */
-      *OriginalInvocation, Controller, PrebuiltModuleASTMap, StableDirs);
+  CI.addDependencyCollector(MDC);
 
   CompilerInvocation ModuleInvocation(*OriginalInvocation);
   if (!Controller.initialize(CI, ModuleInvocation))
@@ -612,6 +610,7 @@ bool CompilerInstanceWithContext::computeDependencies(
 
   MDC->run(Consumer);
   MDC->applyDiscoveredDependencies(ModuleInvocation);
+  MDC->clearLocalState();
 
   if (!Controller.finalize(CI, ModuleInvocation))
     return false;

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to