[clang] f7b575b - [clang][deps] Move logic out of the PP callback (#197270)
via cfe-commits
cfe-commits at lists.llvm.org
Fri May 15 07:59:12 PDT 2026
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))
More information about the cfe-commits
mailing list