From 56a6c14ba0fb18ae4c12201aca7dd5291128920e Mon Sep 17 00:00:00 2001 From: Artem Chikin Date: Thu, 10 Jul 2025 13:54:59 -0700 Subject: [PATCH] [Dependency Scanning] Reduce the amount of copying of collections of module IDs Previously, frequently-used methods like 'getAllDependencies' and 'getAllClangDependencies' had to aggregate (copy) multiple collections stored in a 'ModuleDependencyInfo' into a new result array to present to the client. These methods have been refactored to instead return an iterable joined view of the constituent collections. --- include/swift/AST/ModuleDependencies.h | 84 ++++++++++-- .../DependencyScan/ModuleDependencyScanner.h | 4 +- lib/AST/ModuleDependencies.cpp | 129 +++++++++--------- .../ModuleDependencyScanner.cpp | 45 +++--- lib/DependencyScan/ScanDependencies.cpp | 52 ++----- 5 files changed, 175 insertions(+), 139 deletions(-) diff --git a/include/swift/AST/ModuleDependencies.h b/include/swift/AST/ModuleDependencies.h index 3739d7465eaf1..bbb6235a95004 100644 --- a/include/swift/AST/ModuleDependencies.h +++ b/include/swift/AST/ModuleDependencies.h @@ -94,6 +94,69 @@ struct ModuleDependencyIDHash { } }; +// An iterable view over multiple joined ArrayRefs +// FIXME: std::ranges::join_view +template +class JoinedArrayRefView { +public: + class Iterator { + public: + using iterator_category = std::forward_iterator_tag; + using value_type = T; + using difference_type = std::ptrdiff_t; + using pointer = const T*; + using reference = const T&; + Iterator(const JoinedArrayRefView *parent, size_t memberIndex, + size_t elementIndex) + : parentView(parent), collectionIndex(memberIndex), + elementIndex(elementIndex) { + checkAdvance(); + } + const T &operator*() const { + return (parentView->memberCollections[collectionIndex])[elementIndex]; + } + const T *operator->() const { + return &(parentView->memberCollections[collectionIndex])[elementIndex]; + } + Iterator &operator++() { + ++elementIndex; + checkAdvance(); + return *this; + } + bool operator==(const Iterator &other) const { + return collectionIndex == other.collectionIndex && + elementIndex == other.elementIndex; + } + bool operator!=(const Iterator &other) const { return !(*this == other); } + + private: + const JoinedArrayRefView *parentView; + size_t collectionIndex; + size_t elementIndex; + + void checkAdvance() { + while (collectionIndex < parentView->memberCollections.size() && + elementIndex >= parentView->memberCollections[collectionIndex].size()) { + ++collectionIndex; + elementIndex = 0; + } + } + }; + + Iterator begin() const { return Iterator(this, 0, 0); } + Iterator end() const { return Iterator(this, memberCollections.size(), 0); } + + template + JoinedArrayRefView(Arrays ...arrs) { + memberCollections.reserve(sizeof...(arrs)); + (memberCollections.push_back(arrs), ...); + } + +private: + std::vector> memberCollections; +}; +using ModuleDependencyIDCollectionView = JoinedArrayRefView; + using ModuleDependencyIDSet = std::unordered_set; using ModuleDependencyIDSetVector = @@ -718,9 +781,8 @@ class ModuleDependencyInfo { ArrayRef getSwiftOverlayDependencies() const { return storage->swiftOverlayDependencies; } - - void - setCrossImportOverlayDependencies(const ArrayRef dependencyIDs) { + void setCrossImportOverlayDependencies( + const ModuleDependencyIDCollectionView dependencyIDs) { assert(isSwiftModule()); storage->crossImportOverlayModules.assign(dependencyIDs.begin(), dependencyIDs.end()); @@ -1051,12 +1113,16 @@ class ModuleDependenciesCache { } /// Query all dependencies - ModuleDependencyIDSetVector + ModuleDependencyIDCollectionView getAllDependencies(const ModuleDependencyID &moduleID) const; + /// Query all directly-imported dependencies + ModuleDependencyIDCollectionView + getDirectImportedDependencies(const ModuleDependencyID &moduleID) const; + /// Query all Clang module dependencies. - ModuleDependencyIDSetVector - getClangDependencies(const ModuleDependencyID &moduleID) const; + ModuleDependencyIDCollectionView + getAllClangDependencies(const ModuleDependencyID &moduleID) const; /// Query all directly-imported Swift dependencies llvm::ArrayRef @@ -1138,9 +1204,9 @@ class ModuleDependenciesCache { setHeaderClangDependencies(ModuleDependencyID moduleID, const ArrayRef dependencyIDs); /// Resolve this module's cross-import overlay dependencies - void - setCrossImportOverlayDependencies(ModuleDependencyID moduleID, - const ArrayRef dependencyIDs); + void setCrossImportOverlayDependencies( + ModuleDependencyID moduleID, + const ModuleDependencyIDCollectionView dependencyIDs); /// Add to this module's set of visible Clang modules void addVisibleClangModules(ModuleDependencyID moduleID, diff --git a/include/swift/DependencyScan/ModuleDependencyScanner.h b/include/swift/DependencyScan/ModuleDependencyScanner.h index 6bc8a4ddc3c59..9fbfd48b51e4e 100644 --- a/include/swift/DependencyScan/ModuleDependencyScanner.h +++ b/include/swift/DependencyScan/ModuleDependencyScanner.h @@ -249,8 +249,8 @@ class ModuleDependencyScanner { /// 4. Swift overlay modules of all of the transitively imported Clang modules /// that have one ModuleDependencyIDSetVector - resolveImportedModuleDependencies(const ModuleDependencyID &rootModuleID, - ModuleDependenciesCache &cache); + resolveImportedModuleDependencies( + const ModuleDependencyID &rootModuleID, ModuleDependenciesCache &cache); void resolveSwiftModuleDependencies( const ModuleDependencyID &rootModuleID, ModuleDependenciesCache &cache, ModuleDependencyIDSetVector &discoveredSwiftModules); diff --git a/lib/AST/ModuleDependencies.cpp b/lib/AST/ModuleDependencies.cpp index ae2ba45e722af..1ac5bd6543267 100644 --- a/lib/AST/ModuleDependencies.cpp +++ b/lib/AST/ModuleDependencies.cpp @@ -850,74 +850,90 @@ void ModuleDependenciesCache::removeDependency(ModuleDependencyID moduleID) { map.erase(moduleID.ModuleName); } -void -ModuleDependenciesCache::setImportedSwiftDependencies(ModuleDependencyID moduleID, - const ArrayRef dependencyIDs) { +void ModuleDependenciesCache::setImportedSwiftDependencies( + ModuleDependencyID moduleID, + const ArrayRef dependencyIDs) { auto dependencyInfo = findKnownDependency(moduleID); assert(dependencyInfo.getImportedSwiftDependencies().empty()); #ifndef NDEBUG for (const auto &depID : dependencyIDs) assert(depID.Kind != ModuleDependencyKind::Clang); #endif - // Copy the existing info to a mutable one we can then replace it with, after setting its overlay dependencies. + // Copy the existing info to a mutable one we can then replace it with, after + // setting its overlay dependencies. auto updatedDependencyInfo = dependencyInfo; updatedDependencyInfo.setImportedSwiftDependencies(dependencyIDs); updateDependency(moduleID, updatedDependencyInfo); } -void -ModuleDependenciesCache::setImportedClangDependencies(ModuleDependencyID moduleID, - const ArrayRef dependencyIDs) { +void ModuleDependenciesCache::setImportedClangDependencies( + ModuleDependencyID moduleID, + const ArrayRef dependencyIDs) { auto dependencyInfo = findKnownDependency(moduleID); assert(dependencyInfo.getImportedClangDependencies().empty()); #ifndef NDEBUG for (const auto &depID : dependencyIDs) assert(depID.Kind == ModuleDependencyKind::Clang); #endif - // Copy the existing info to a mutable one we can then replace it with, after setting its overlay dependencies. + // Copy the existing info to a mutable one we can then replace it with, after + // setting its overlay dependencies. auto updatedDependencyInfo = dependencyInfo; updatedDependencyInfo.setImportedClangDependencies(dependencyIDs); updateDependency(moduleID, updatedDependencyInfo); } -void -ModuleDependenciesCache::setHeaderClangDependencies(ModuleDependencyID moduleID, - const ArrayRef dependencyIDs) { +void ModuleDependenciesCache::setHeaderClangDependencies( + ModuleDependencyID moduleID, + const ArrayRef dependencyIDs) { auto dependencyInfo = findKnownDependency(moduleID); #ifndef NDEBUG for (const auto &depID : dependencyIDs) assert(depID.Kind == ModuleDependencyKind::Clang); #endif - // Copy the existing info to a mutable one we can then replace it with, after setting its overlay dependencies. + // Copy the existing info to a mutable one we can then replace it with, after + // setting its overlay dependencies. auto updatedDependencyInfo = dependencyInfo; updatedDependencyInfo.setHeaderClangDependencies(dependencyIDs); updateDependency(moduleID, updatedDependencyInfo); } -void ModuleDependenciesCache::setSwiftOverlayDependencies(ModuleDependencyID moduleID, - const ArrayRef dependencyIDs) { +void ModuleDependenciesCache::setSwiftOverlayDependencies( + ModuleDependencyID moduleID, + const ArrayRef dependencyIDs) { auto dependencyInfo = findKnownDependency(moduleID); assert(dependencyInfo.getSwiftOverlayDependencies().empty()); #ifndef NDEBUG for (const auto &depID : dependencyIDs) assert(depID.Kind != ModuleDependencyKind::Clang); #endif - // Copy the existing info to a mutable one we can then replace it with, after setting its overlay dependencies. + // Copy the existing info to a mutable one we can then replace it with, after + // setting its overlay dependencies. auto updatedDependencyInfo = dependencyInfo; updatedDependencyInfo.setSwiftOverlayDependencies(dependencyIDs); updateDependency(moduleID, updatedDependencyInfo); } -void -ModuleDependenciesCache::setCrossImportOverlayDependencies(ModuleDependencyID moduleID, - const ArrayRef dependencyIDs) { +void ModuleDependenciesCache::setCrossImportOverlayDependencies( + ModuleDependencyID moduleID, + const ModuleDependencyIDCollectionView dependencyIDs) { auto dependencyInfo = findKnownDependency(moduleID); assert(dependencyInfo.getCrossImportOverlayDependencies().empty()); - // Copy the existing info to a mutable one we can then replace it with, after setting its overlay dependencies. + // Copy the existing info to a mutable one we can then replace it with, + // after setting its overlay dependencies. auto updatedDependencyInfo = dependencyInfo; updatedDependencyInfo.setCrossImportOverlayDependencies(dependencyIDs); updateDependency(moduleID, updatedDependencyInfo); } -void -ModuleDependenciesCache::addVisibleClangModules(ModuleDependencyID moduleID, - const std::vector &moduleNames) { +ModuleDependencyIDCollectionView ModuleDependenciesCache::getAllDependencies( + const ModuleDependencyID &moduleID) const { + const auto &moduleInfo = findKnownDependency(moduleID); + return ModuleDependencyIDCollectionView( + moduleInfo.getImportedSwiftDependencies(), + moduleInfo.getHeaderClangDependencies(), + moduleInfo.getSwiftOverlayDependencies(), + moduleInfo.getCrossImportOverlayDependencies(), + moduleInfo.getImportedClangDependencies()); +} + +void ModuleDependenciesCache::addVisibleClangModules( + ModuleDependencyID moduleID, const std::vector &moduleNames) { if (moduleNames.empty()) return; auto dependencyInfo = findKnownDependency(moduleID); @@ -926,88 +942,67 @@ ModuleDependenciesCache::addVisibleClangModules(ModuleDependencyID moduleID, updateDependency(moduleID, updatedDependencyInfo); } -llvm::StringSet<> &ModuleDependenciesCache::getVisibleClangModules(ModuleDependencyID moduleID) const { +llvm::StringSet<> &ModuleDependenciesCache::getVisibleClangModules( + ModuleDependencyID moduleID) const { ASSERT(moduleID.Kind == ModuleDependencyKind::SwiftSource || moduleID.Kind == ModuleDependencyKind::SwiftInterface || moduleID.Kind == ModuleDependencyKind::SwiftBinary); return findKnownDependency(moduleID).getVisibleClangModules(); } -ModuleDependencyIDSetVector -ModuleDependenciesCache::getAllDependencies(const ModuleDependencyID &moduleID) const { +ModuleDependencyIDCollectionView +ModuleDependenciesCache::getDirectImportedDependencies( + const ModuleDependencyID &moduleID) const { const auto &moduleInfo = findKnownDependency(moduleID); - ModuleDependencyIDSetVector result; - if (moduleInfo.isSwiftModule()) { - auto swiftImportedDepsRef = moduleInfo.getImportedSwiftDependencies(); - auto headerClangDepsRef = moduleInfo.getHeaderClangDependencies(); - auto overlayDependenciesRef = moduleInfo.getSwiftOverlayDependencies(); - result.insert(swiftImportedDepsRef.begin(), - swiftImportedDepsRef.end()); - result.insert(headerClangDepsRef.begin(), - headerClangDepsRef.end()); - result.insert(overlayDependenciesRef.begin(), - overlayDependenciesRef.end()); - } - - if (moduleInfo.isSwiftSourceModule()) { - auto crossImportOverlayDepsRef = moduleInfo.getCrossImportOverlayDependencies(); - result.insert(crossImportOverlayDepsRef.begin(), - crossImportOverlayDepsRef.end()); - } - - auto clangImportedDepsRef = moduleInfo.getImportedClangDependencies(); - result.insert(clangImportedDepsRef.begin(), - clangImportedDepsRef.end()); - - return result; + return ModuleDependencyIDCollectionView( + moduleInfo.getImportedSwiftDependencies(), + moduleInfo.getImportedClangDependencies()); } -ModuleDependencyIDSetVector -ModuleDependenciesCache::getClangDependencies(const ModuleDependencyID &moduleID) const { +ModuleDependencyIDCollectionView +ModuleDependenciesCache::getAllClangDependencies( + const ModuleDependencyID &moduleID) const { const auto &moduleInfo = findKnownDependency(moduleID); - ModuleDependencyIDSetVector result; - auto clangImportedDepsRef = moduleInfo.getImportedClangDependencies(); - result.insert(clangImportedDepsRef.begin(), - clangImportedDepsRef.end()); - if (moduleInfo.isSwiftSourceModule() || moduleInfo.isSwiftBinaryModule()) { - auto headerClangDepsRef = moduleInfo.getHeaderClangDependencies(); - result.insert(headerClangDepsRef.begin(), - headerClangDepsRef.end()); - } - return result; + return ModuleDependencyIDCollectionView( + moduleInfo.getImportedClangDependencies(), + moduleInfo.getHeaderClangDependencies()); } llvm::ArrayRef -ModuleDependenciesCache::getImportedSwiftDependencies(const ModuleDependencyID &moduleID) const { +ModuleDependenciesCache::getImportedSwiftDependencies( + const ModuleDependencyID &moduleID) const { const auto &moduleInfo = findKnownDependency(moduleID); assert(moduleInfo.isSwiftModule()); return moduleInfo.getImportedSwiftDependencies(); } llvm::ArrayRef -ModuleDependenciesCache::getImportedClangDependencies(const ModuleDependencyID &moduleID) const { +ModuleDependenciesCache::getImportedClangDependencies( + const ModuleDependencyID &moduleID) const { const auto &moduleInfo = findKnownDependency(moduleID); return moduleInfo.getImportedClangDependencies(); } llvm::ArrayRef -ModuleDependenciesCache::getHeaderClangDependencies(const ModuleDependencyID &moduleID) const { +ModuleDependenciesCache::getHeaderClangDependencies( + const ModuleDependencyID &moduleID) const { const auto &moduleInfo = findKnownDependency(moduleID); assert(moduleInfo.isSwiftModule()); return moduleInfo.getHeaderClangDependencies(); } llvm::ArrayRef -ModuleDependenciesCache::getSwiftOverlayDependencies(const ModuleDependencyID &moduleID) const { +ModuleDependenciesCache::getSwiftOverlayDependencies( + const ModuleDependencyID &moduleID) const { const auto &moduleInfo = findKnownDependency(moduleID); assert(moduleInfo.isSwiftModule()); return moduleInfo.getSwiftOverlayDependencies(); } llvm::ArrayRef -ModuleDependenciesCache::getCrossImportOverlayDependencies(const ModuleDependencyID &moduleID) const { +ModuleDependenciesCache::getCrossImportOverlayDependencies( + const ModuleDependencyID &moduleID) const { const auto &moduleInfo = findKnownDependency(moduleID); assert(moduleInfo.isSwiftSourceModule()); return moduleInfo.getCrossImportOverlayDependencies(); } - diff --git a/lib/DependencyScan/ModuleDependencyScanner.cpp b/lib/DependencyScan/ModuleDependencyScanner.cpp index 858281081b0e3..5bc5166c1cd33 100644 --- a/lib/DependencyScan/ModuleDependencyScanner.cpp +++ b/lib/DependencyScan/ModuleDependencyScanner.cpp @@ -623,7 +623,7 @@ static void findAllImportedClangModules(StringRef moduleName, if (!optionalDependencies.has_value()) return; - for (const auto &dep : cache.getClangDependencies(moduleID)) + for (const auto &dep : cache.getAllClangDependencies(moduleID)) findAllImportedClangModules(dep.ModuleName, cache, allModules, knownModules); } @@ -935,7 +935,7 @@ ModuleDependencyScanner::performDependencyScan(ModuleDependencyID rootModuleID, // This may call into 'resolveImportedModuleDependencies' // for the newly-added Swift overlay dependencies. ModuleDependencyIDSetVector allModules = - resolveImportedModuleDependencies(rootModuleID, cache); + resolveImportedModuleDependencies(rootModuleID, cache); // 5. Resolve cross-import overlays // This must only be done for the main source module, since textual and @@ -960,10 +960,10 @@ ModuleDependencyScanner::performDependencyScan(ModuleDependencyID rootModuleID, ModuleDependencyIDSetVector ModuleDependencyScanner::resolveImportedModuleDependencies( const ModuleDependencyID &rootModuleID, ModuleDependenciesCache &cache) { + ModuleDependencyIDSetVector allModules; PrettyStackTraceStringAction trace( "Resolving transitive closure of dependencies of: ", rootModuleID.ModuleName); - ModuleDependencyIDSetVector allModules; // Resolve all imports for which a Swift module can be found, // transitively, starting at 'rootModuleID'. @@ -972,23 +972,25 @@ ModuleDependencyScanner::resolveImportedModuleDependencies( allModules.insert(discoveredSwiftModules.begin(), discoveredSwiftModules.end()); - ModuleDependencyIDSetVector discoveredClangModules; + // Resolve all remaining unresolved imports for which no Swift + // module could be found, assuming them to be Clang modules. + // This operation is done by gathering all unresolved import + // identifiers and querying them in-parallel to the Clang + // dependency scanner. resolveAllClangModuleDependencies(discoveredSwiftModules.getArrayRef(), cache, - discoveredClangModules); - allModules.insert(discoveredClangModules.begin(), - discoveredClangModules.end()); + allModules); - ModuleDependencyIDSetVector discoveredHeaderDependencyClangModules; + // For each discovered Swift module which was built with a + // bridging header, scan the header for module dependencies. + // This includes the source module bridging header. resolveHeaderDependencies(discoveredSwiftModules.getArrayRef(), cache, - discoveredHeaderDependencyClangModules); - allModules.insert(discoveredHeaderDependencyClangModules.begin(), - discoveredHeaderDependencyClangModules.end()); + allModules); - ModuleDependencyIDSetVector discoveredSwiftOverlayDependencyModules; + // For each Swift module which imports Clang modules, + // query whether all visible Clang dependencies from such imports + // have a Swift overaly module. resolveSwiftOverlayDependencies(discoveredSwiftModules.getArrayRef(), cache, - discoveredSwiftOverlayDependencyModules); - allModules.insert(discoveredSwiftOverlayDependencyModules.begin(), - discoveredSwiftOverlayDependencyModules.end()); + allModules); return allModules; } @@ -1282,7 +1284,7 @@ void ModuleDependencyScanner::resolveSwiftOverlayDependencies( // in case it itself has unresolved module dependencies. for (const auto &overlayDepID : discoveredSwiftOverlays) { ModuleDependencyIDSetVector allNewModules = - resolveImportedModuleDependencies(overlayDepID, cache); + resolveImportedModuleDependencies(overlayDepID, cache); allDiscoveredDependencies.insert(allNewModules.begin(), allNewModules.end()); } @@ -1485,7 +1487,7 @@ void ModuleDependencyScanner::resolveSwiftOverlayDependenciesForModule( llvm::StringSet<> knownModules; // Find all of the discovered Clang modules that this module depends on. - for (const auto &dep : cache.getClangDependencies(moduleID)) + for (const auto &dep : cache.getAllClangDependencies(moduleID)) findAllImportedClangModules(dep.ModuleName, cache, allClangDependencies, knownModules); @@ -1635,15 +1637,14 @@ void ModuleDependencyScanner::resolveCrossImportOverlayDependencies( cache.recordDependency(dummyMainName, dummyMainDependencies); ModuleDependencyIDSetVector allModules = - resolveImportedModuleDependencies(dummyMainID, cache); + resolveImportedModuleDependencies(dummyMainID, cache); // Update main module's dependencies to include these new overlays. - auto newOverlayDeps = cache.getAllDependencies(dummyMainID); cache.setCrossImportOverlayDependencies(actualMainID, - newOverlayDeps.getArrayRef()); + cache.getAllDependencies(dummyMainID)); - // Update the command-line on the main module to - // disable implicit cross-import overlay search. + // Update the command-line on the main module to disable implicit + // cross-import overlay search. auto mainDep = cache.findKnownDependency(actualMainID); std::vector cmdCopy = mainDep.getCommandline(); cmdCopy.push_back("-disable-cross-import-overlay-search"); diff --git a/lib/DependencyScan/ScanDependencies.cpp b/lib/DependencyScan/ScanDependencies.cpp index e78151de2eb71..07f22e8c2a6dc 100644 --- a/lib/DependencyScan/ScanDependencies.cpp +++ b/lib/DependencyScan/ScanDependencies.cpp @@ -687,9 +687,9 @@ static bool writeJSONToOutput(DiagnosticEngine &diags, }); } -static void -bridgeDependencyIDs(const ArrayRef dependencies, - std::vector &bridgedDependencyNames) { +static std::vector +bridgeDependencyIDs(const ModuleDependencyIDCollectionView dependencies) { + std::vector bridgedDependencyNames; for (const auto &dep : dependencies) { std::string dependencyKindAndName; switch (dep.Kind) { @@ -710,6 +710,7 @@ bridgeDependencyIDs(const ArrayRef dependencies, dependencyKindAndName += dep.ModuleName; bridgedDependencyNames.push_back(dependencyKindAndName); } + return bridgedDependencyNames; } static swiftscan_macro_dependency_set_t *createMacroDependencySet( @@ -779,7 +780,6 @@ static swiftscan_dependency_graph_t generateFullDependencyGraph( sourceFiles = clangDeps->fileDependencies; } - auto directDependencies = cache.getAllDependencies(moduleID); std::vector clangHeaderDependencyNames; for (const auto &headerDepID : moduleDependencyInfo.getHeaderClangDependencies()) @@ -800,11 +800,6 @@ static swiftscan_dependency_graph_t generateFullDependencyGraph( .c_str()) : create_null(); details->kind = SWIFTSCAN_DEPENDENCY_INFO_SWIFT_TEXTUAL; - // Create an overlay dependencies set according to the output format - std::vector bridgedOverlayDependencyNames; - bridgeDependencyIDs(swiftTextualDeps->swiftOverlayDependencies, - bridgedOverlayDependencyNames); - details->swift_textual_details = { moduleInterfacePath, create_set(swiftTextualDeps->compiledModuleCandidates), @@ -812,7 +807,8 @@ static swiftscan_dependency_graph_t generateFullDependencyGraph( create_set( swiftTextualDeps->textualModuleDetails.bridgingSourceFiles), create_set(clangHeaderDependencyNames), - create_set(bridgedOverlayDependencyNames), + create_set(bridgeDependencyIDs( + cache.getSwiftOverlayDependencies(moduleID))), /*sourceImportedDependencies*/ create_set({}), create_set(swiftTextualDeps->textualModuleDetails.buildCommandLine), /*bridgingHeaderBuildCommand*/ create_set({}), @@ -838,30 +834,16 @@ static swiftscan_dependency_graph_t generateFullDependencyGraph( .c_str()) : create_null(); details->kind = SWIFTSCAN_DEPENDENCY_INFO_SWIFT_TEXTUAL; - // Create an overlay dependencies set according to the output format - std::vector bridgedOverlayDependencyNames; - bridgeDependencyIDs(swiftSourceDeps->swiftOverlayDependencies, - bridgedOverlayDependencyNames); - - // Create a set of directly-source-imported dependencies - std::vector sourceImportDependencies; - std::copy(swiftSourceDeps->importedSwiftModules.begin(), - swiftSourceDeps->importedSwiftModules.end(), - std::back_inserter(sourceImportDependencies)); - std::copy(swiftSourceDeps->importedClangModules.begin(), - swiftSourceDeps->importedClangModules.end(), - std::back_inserter(sourceImportDependencies)); - std::vector bridgedSourceImportedDependencyNames; - bridgeDependencyIDs(sourceImportDependencies, - bridgedSourceImportedDependencyNames); details->swift_textual_details = { moduleInterfacePath, create_empty_set(), bridgingHeaderPath, create_set( swiftSourceDeps->textualModuleDetails.bridgingSourceFiles), create_set(clangHeaderDependencyNames), - create_set(bridgedOverlayDependencyNames), - create_set(bridgedSourceImportedDependencyNames), + create_set(bridgeDependencyIDs( + cache.getSwiftOverlayDependencies(moduleID))), + create_set(bridgeDependencyIDs( + cache.getDirectImportedDependencies(moduleID))), create_set(swiftSourceDeps->textualModuleDetails.buildCommandLine), create_set(swiftSourceDeps->bridgingHeaderBuildCommandLine), /*contextHash*/ @@ -883,15 +865,12 @@ static swiftscan_dependency_graph_t generateFullDependencyGraph( swiftSourceDeps->chainedBridgingHeaderContent.c_str())}; } else if (swiftBinaryDeps) { details->kind = SWIFTSCAN_DEPENDENCY_INFO_SWIFT_BINARY; - // Create an overlay dependencies set according to the output format - std::vector bridgedOverlayDependencyNames; - bridgeDependencyIDs(swiftBinaryDeps->swiftOverlayDependencies, - bridgedOverlayDependencyNames); details->swift_binary_details = { create_clone(swiftBinaryDeps->compiledModulePath.c_str()), create_clone(swiftBinaryDeps->moduleDocPath.c_str()), create_clone(swiftBinaryDeps->sourceInfoPath.c_str()), - create_set(bridgedOverlayDependencyNames), + create_set(bridgeDependencyIDs( + cache.getSwiftOverlayDependencies(moduleID))), create_clone(swiftBinaryDeps->headerImport.c_str()), create_set(clangHeaderDependencyNames), create_set(swiftBinaryDeps->headerSourceFiles), @@ -922,12 +901,7 @@ static swiftscan_dependency_graph_t generateFullDependencyGraph( moduleInfo->module_name = ttt; moduleInfo->module_path = create_clone(modulePath.c_str()); moduleInfo->source_files = create_set(sourceFiles); - - // Create a direct dependencies set according to the output format - std::vector bridgedDependencyNames; - bridgeDependencyIDs(directDependencies.getArrayRef(), - bridgedDependencyNames); - moduleInfo->direct_dependencies = create_set(bridgedDependencyNames); + moduleInfo->direct_dependencies = create_set(bridgeDependencyIDs(cache.getAllDependencies(moduleID))); moduleInfo->details = getModuleDetails(); // Create a link libraries set for this module