From 0dd4655008848bf45cb6881f7d3a9649701470b1 Mon Sep 17 00:00:00 2001 From: Artem Chikin Date: Mon, 8 Dec 2025 14:50:08 -0800 Subject: [PATCH] [Test][Dependency Scanning] Add a compiler statistic for # of dependency module queries and a simple test for it This adds a compiler statistic for # of named lookups the scanner performed. --- .../ModuleDependencyScanner.cpp | 9 +++++ test/ScanDependencies/basic_query_stats.swift | 39 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 test/ScanDependencies/basic_query_stats.swift diff --git a/lib/DependencyScan/ModuleDependencyScanner.cpp b/lib/DependencyScan/ModuleDependencyScanner.cpp index 83c60ed7e0177..f4bee95963859 100644 --- a/lib/DependencyScan/ModuleDependencyScanner.cpp +++ b/lib/DependencyScan/ModuleDependencyScanner.cpp @@ -26,6 +26,7 @@ #include "swift/Basic/Defer.h" #include "swift/Basic/FileTypes.h" #include "swift/Basic/PrettyStackTrace.h" +#include "swift/Basic/Statistic.h" #include "swift/ClangImporter/ClangImporter.h" #include "swift/Frontend/CompileJobCacheKey.h" #include "swift/Frontend/ModuleInterfaceLoader.h" @@ -53,6 +54,12 @@ using namespace swift; +#define DEBUG_TYPE "DependencyScanner" +STATISTIC(DepScanSwiftModuleQueries, + "# of times the dependency scanner performed a named lookup of a Swift module"); +STATISTIC(DepScanClangModuleQueries, + "# of times the dependency scanner performed a named lookup of a Clang module"); + static void findPath_dfs(ModuleDependencyID X, ModuleDependencyID Y, ModuleDependencyIDSet &visited, std::vector &stack, @@ -299,6 +306,7 @@ ModuleDependencyScanningWorker::ModuleDependencyScanningWorker( SwiftModuleScannerQueryResult ModuleDependencyScanningWorker::scanFilesystemForSwiftModuleDependency( Identifier moduleName, bool isTestableImport) { + DepScanSwiftModuleQueries++; return swiftModuleScannerLoader->lookupSwiftModule(moduleName, isTestableImport); } @@ -309,6 +317,7 @@ ModuleDependencyScanningWorker::scanFilesystemForClangModuleDependency( LookupModuleOutputCallback lookupModuleOutput, const llvm::DenseSet &alreadySeenModules) { + DepScanClangModuleQueries++; auto clangModuleDependencies = clangScanningTool.getModuleDependencies( moduleName.str(), clangScanningModuleCommandLineArgs, clangScanningWorkingDirectoryPath, alreadySeenModules, diff --git a/test/ScanDependencies/basic_query_stats.swift b/test/ScanDependencies/basic_query_stats.swift new file mode 100644 index 0000000000000..1b7ac2adfba92 --- /dev/null +++ b/test/ScanDependencies/basic_query_stats.swift @@ -0,0 +1,39 @@ +// REQUIRES: asserts +// RUN: %empty-directory(%t) +// RUN: %empty-directory(%t/module-cache) +// RUN: %empty-directory(%t/inputs) +// RUN: split-file %s %t + +// RUN: %target-swift-frontend -scan-dependencies -module-name Test -module-cache-path %t/module-cache -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import -parse-stdlib %t/test.swift -o %t/deps.json -I %t/inputs -print-stats &> %t/stats.txt +// RUN: cat %t/stats.txt | %FileCheck %s + +// Ensure that despite being a common dependency to multiple Swift modules, only 1 query is performed to find 'C' +// CHECK: ... Statistics Collected ... +// CHECK: 1 DependencyScanner - # of times the dependency scanner performed a named lookup of a Clang module + +//--- test.swift +import A +import B +public func test() {} + +//--- inputs/A.swiftinterface +// swift-interface-format-version: 1.0 +// swift-module-flags: -module-name A -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import -parse-stdlib -user-module-version 1.0 +import C +public func a() { } + +//--- inputs/B.swiftinterface +// swift-interface-format-version: 1.0 +// swift-module-flags: -module-name B -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import -parse-stdlib -user-module-version 1.0 +import C +public func b() { } + +//--- inputs/c.h +void c(void); + +//--- inputs/module.modulemap +module C { + header "C.h" + export * +} +