From 986e6057f5a05d29fea34cf38f94dc957dbbda2d Mon Sep 17 00:00:00 2001 From: Artem Chikin Date: Wed, 20 Aug 2025 16:04:29 -0700 Subject: [PATCH] [Dependency Scanning] Re-enable querying Swift Overlays only for visible Clang modules This change re-enables the new semantic of looking up Swift Overlay modules only for "visible" clang modules. We have investigated the failures we were seeing with this change enabled and addressed them with project-side fixes. --- .../ModuleDependencyScanner.cpp | 29 +++---------------- ...dule_deps_swift_overlay_only_visible.swift | 1 - 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/lib/DependencyScan/ModuleDependencyScanner.cpp b/lib/DependencyScan/ModuleDependencyScanner.cpp index 030dd0ed858e8..e3b1b4bfe51d0 100644 --- a/lib/DependencyScan/ModuleDependencyScanner.cpp +++ b/lib/DependencyScan/ModuleDependencyScanner.cpp @@ -554,23 +554,6 @@ ModuleDependencyScanner::ModuleDependencyScanner( DependencyTracker, CAS, ActionCache, PrefixMapper.get(), Diagnostics)); } -/// Find all of the imported Clang modules starting with the given module name. -static void findAllImportedClangModules(StringRef moduleName, - const ModuleDependenciesCache &cache, - llvm::StringSet<> &allModules) { - if (!allModules.insert(moduleName).second) - return; - - auto moduleID = - ModuleDependencyID{moduleName.str(), ModuleDependencyKind::Clang}; - auto optionalDependencies = cache.findDependency(moduleID); - if (!optionalDependencies.has_value()) - return; - - for (const auto &dep : cache.getAllClangDependencies(moduleID)) - findAllImportedClangModules(dep.ModuleName, cache, allModules); -} - static std::set collectBinarySwiftDeps(const ModuleDependenciesCache &cache) { std::set binarySwiftModuleDepIDs; @@ -1458,11 +1441,7 @@ void ModuleDependencyScanner::resolveSwiftOverlayDependenciesForModule( ModuleDependencyIDSetVector &swiftOverlayDependencies) { PrettyStackTraceStringAction trace( "Resolving Swift Overlay dependencies of module", moduleID.ModuleName); - llvm::StringSet<> allClangDependencies; - - // Find all of the discovered Clang modules that this module depends on. - for (const auto &dep : cache.getAllClangDependencies(moduleID)) - findAllImportedClangModules(dep.ModuleName, cache, allClangDependencies); + auto visibleClangDependencies = cache.getVisibleClangModules(moduleID); llvm::StringMap swiftOverlayLookupResult; std::mutex lookupResultLock; @@ -1493,7 +1472,7 @@ void ModuleDependencyScanner::resolveSwiftOverlayDependenciesForModule( }; // Enque asynchronous lookup tasks - for (const auto &clangDep : allClangDependencies) + for (const auto &clangDep : visibleClangDependencies) ScanningThreadPool.async(scanForSwiftDependency, getModuleImportIdentifier(clangDep.getKey().str())); ScanningThreadPool.wait(); @@ -1522,7 +1501,7 @@ void ModuleDependencyScanner::resolveSwiftOverlayDependenciesForModule( lookupResult.incompatibleCandidates, cache, std::nullopt); } }; - for (const auto &clangDep : allClangDependencies) + for (const auto &clangDep : visibleClangDependencies) recordResult(clangDep.getKey().str()); // C++ Interop requires additional handling @@ -1555,7 +1534,7 @@ void ModuleDependencyScanner::resolveSwiftOverlayDependenciesForModule( lookupCxxStdLibOverlay = false; if (lookupCxxStdLibOverlay) { - for (const auto &clangDepNameEntry : allClangDependencies) { + for (const auto &clangDepNameEntry : visibleClangDependencies) { auto clangDepName = clangDepNameEntry.getKey().str(); // If this Clang module is a part of the C++ stdlib, and we haven't diff --git a/test/ScanDependencies/module_deps_swift_overlay_only_visible.swift b/test/ScanDependencies/module_deps_swift_overlay_only_visible.swift index 0d0c775c72aa4..eff4edf747f5a 100644 --- a/test/ScanDependencies/module_deps_swift_overlay_only_visible.swift +++ b/test/ScanDependencies/module_deps_swift_overlay_only_visible.swift @@ -1,4 +1,3 @@ -// REQUIRES: rdar157603647 // RUN: %empty-directory(%t) // RUN: %empty-directory(%t/clang-module-cache) // RUN: %empty-directory(%t/swiftDeps)