Author: Jan Svoboda
Date: 2026-05-15T07:59:08-07:00
New Revision: f7b575ba0630098bedb43c4755feb42e38c4493a

URL: 
https://github.com/llvm/llvm-project/commit/f7b575ba0630098bedb43c4755feb42e38c4493a
DIFF: 
https://github.com/llvm/llvm-project/commit/f7b575ba0630098bedb43c4755feb42e38c4493a.diff

LOG: [clang][deps] Move logic out of the PP callback (#197270)

This PR moves the main scanner logic from
`ModuleDepCollectorPP::EndOfMainFile()` to the new
`ModuleDepCollector::run()`. In a follow-up PR, this will allow invoking
the main logic with different `DependencyConsumer` objects and reusing
the `ModuleDepCollector` state, skipping some work on subsequent calls.

Added: 
    

Modified: 
    clang/include/clang/DependencyScanning/ModuleDepCollector.h
    clang/lib/DependencyScanning/DependencyScannerImpl.cpp
    clang/lib/DependencyScanning/ModuleDepCollector.cpp
    clang/lib/Tooling/DependencyScanningTool.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/DependencyScanning/ModuleDepCollector.h 
b/clang/include/clang/DependencyScanning/ModuleDepCollector.h
index 6c9b89f3feabc..dd1c57abfecff 100644
--- a/clang/include/clang/DependencyScanning/ModuleDepCollector.h
+++ b/clang/include/clang/DependencyScanning/ModuleDepCollector.h
@@ -102,20 +102,9 @@ class ModuleDepCollectorPP final : public PPCallbacks {
   void moduleImport(SourceLocation ImportLoc, ModuleIdPath Path,
                     const Module *Imported) override;
 
-  void EndOfMainFile() override;
-
 private:
   /// The parent dependency collector.
   ModuleDepCollector &MDC;
-
-  void handleImport(const Module *Imported);
-
-  /// Returns the ID or nothing if the dependency is spurious and is ignored.
-  std::optional<ModuleID> handleTopLevelModule(serialization::ModuleFile *MF);
-
-  /// Adds direct module dependencies to the ModuleDeps instance. This includes
-  /// prebuilt module and implicitly-built modules.
-  void addAllModuleDeps(serialization::ModuleFile &MF, ModuleDeps &MD);
 };
 
 /// Collects modular and non-modular dependencies of the main file by attaching
@@ -130,6 +119,10 @@ class ModuleDepCollector final : public 
DependencyCollector {
                      const PrebuiltModulesAttrsMap PrebuiltModulesASTMap,
                      const ArrayRef<StringRef> StableDirs);
 
+  /// Processes the accumulated dependency information and reports it to the
+  /// \c DependencyConsumer.
+  void run();
+
   void attachToPreprocessor(Preprocessor &PP) override;
   void attachToASTReader(ASTReader &R) override;
 
@@ -193,6 +186,15 @@ class ModuleDepCollector final : public 
DependencyCollector {
   /// attachToPreprocessor and the Preprocessor instance owns it.
   ModuleDepCollectorPP *CollectorPPPtr = nullptr;
 
+  void handleImport(const Module *Imported);
+
+  /// Returns the ID or nothing if the dependency is spurious and is ignored.
+  std::optional<ModuleID> handleTopLevelModule(serialization::ModuleFile *MF);
+
+  /// Adds direct module dependencies to the ModuleDeps instance. This includes
+  /// prebuilt module and implicitly-built modules.
+  void addAllModuleDeps(serialization::ModuleFile &MF, ModuleDeps &MD);
+
   /// Checks whether the module is known as being prebuilt.
   bool isPrebuiltModule(const serialization::ModuleFile *MF);
 

diff  --git a/clang/lib/DependencyScanning/DependencyScannerImpl.cpp 
b/clang/lib/DependencyScanning/DependencyScannerImpl.cpp
index dff8cd087c4dd..09694f094662f 100644
--- a/clang/lib/DependencyScanning/DependencyScannerImpl.cpp
+++ b/clang/lib/DependencyScanning/DependencyScannerImpl.cpp
@@ -782,8 +782,10 @@ bool DependencyScanningAction::runInvocation(
   const bool Result = ScanInstance.ExecuteAction(Action);
 
   if (Result) {
-    if (MDC)
+    if (MDC) {
+      MDC->run();
       MDC->applyDiscoveredDependencies(*OriginalInvocation);
+    }
 
     if (!Controller.finalize(ScanInstance, *OriginalInvocation))
       return false;

diff  --git a/clang/lib/DependencyScanning/ModuleDepCollector.cpp 
b/clang/lib/DependencyScanning/ModuleDepCollector.cpp
index 4c37a091996a7..6a2bf7f68803f 100644
--- a/clang/lib/DependencyScanning/ModuleDepCollector.cpp
+++ b/clang/lib/DependencyScanning/ModuleDepCollector.cpp
@@ -559,7 +559,7 @@ void ModuleDepCollectorPP::InclusionDirective(
     // here as `FileChanged` will never see it.
     MDC.addFileDep(FileName);
   }
-  handleImport(SuggestedModule);
+  MDC.handleImport(SuggestedModule);
 }
 
 void ModuleDepCollectorPP::moduleImport(SourceLocation ImportLoc,
@@ -574,10 +574,12 @@ void ModuleDepCollectorPP::moduleImport(SourceLocation 
ImportLoc,
     return;
   }
 
-  handleImport(Imported);
+  MDC.handleImport(Imported);
 }
 
-void ModuleDepCollectorPP::handleImport(const Module *Imported) {
+void ModuleDepCollector::handleImport(const Module *Imported) {
+  auto &MDC = *this;
+
   if (!Imported)
     return;
 
@@ -596,7 +598,9 @@ void ModuleDepCollectorPP::handleImport(const Module 
*Imported) {
   }
 }
 
-void ModuleDepCollectorPP::EndOfMainFile() {
+void ModuleDepCollector::run() {
+  auto &MDC = *this;
+
   FileID MainFileID = MDC.ScanInstance.getSourceManager().getMainFileID();
   MDC.MainFile = std::string(MDC.ScanInstance.getSourceManager()
                                  .getFileEntryRefForID(MainFileID)
@@ -684,7 +688,9 @@ static StringRef 
makeAbsoluteAndCanonicalize(CompilerInstance &CI,
 }
 
 std::optional<ModuleID>
-ModuleDepCollectorPP::handleTopLevelModule(serialization::ModuleFile *MF) {
+ModuleDepCollector::handleTopLevelModule(serialization::ModuleFile *MF) {
+  auto &MDC = *this;
+
   // If this module has been handled already, just return its ID.
   if (auto ModI = MDC.ModularDeps.find(MF); ModI != MDC.ModularDeps.end())
     return ModI->second->ID;
@@ -813,8 +819,10 @@ 
ModuleDepCollectorPP::handleTopLevelModule(serialization::ModuleFile *MF) {
   return MD.ID;
 }
 
-void ModuleDepCollectorPP::addAllModuleDeps(serialization::ModuleFile &MF,
-                                            ModuleDeps &MD) {
+void ModuleDepCollector::addAllModuleDeps(serialization::ModuleFile &MF,
+                                          ModuleDeps &MD) {
+  auto &MDC = *this;
+
   llvm::DenseSet<const Module *> Seen;
   for (serialization::ModuleFile *Import : MF.Imports) {
     if (MDC.isPrebuiltModule(Import)) {

diff  --git a/clang/lib/Tooling/DependencyScanningTool.cpp 
b/clang/lib/Tooling/DependencyScanningTool.cpp
index 45e517f95aa18..fb0d39c2288e6 100644
--- a/clang/lib/Tooling/DependencyScanningTool.cpp
+++ b/clang/lib/Tooling/DependencyScanningTool.cpp
@@ -603,10 +603,6 @@ bool CompilerInstanceWithContext::computeDependencies(
 
   assert(CB && "Must have PPCallbacks after module loading");
   CB->moduleImport(SourceLocation(), Path, ModResult);
-  // Note that we are calling the CB's EndOfMainFile function, which
-  // forwards the results to the dependency consumer.
-  // It does not indicate the end of processing the fake file.
-  CB->EndOfMainFile();
 
   if (!ModResult)
     return false;
@@ -614,6 +610,7 @@ bool CompilerInstanceWithContext::computeDependencies(
   if (CI.getDiagnostics().hasErrorOccurred())
     return false;
 
+  MDC->run();
   MDC->applyDiscoveredDependencies(ModuleInvocation);
 
   if (!Controller.finalize(CI, ModuleInvocation))


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

Reply via email to