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
