@@ -388,6 +388,9 @@ GlobalModuleDependenciesCache::findSourceModuleDependency(
388388
389389bool GlobalModuleDependenciesCache::hasDependencies (
390390 StringRef moduleName, ModuleLookupSpecifics details) const {
391+ assert (details.kind != ModuleDependenciesKind::Clang &&
392+ " Attempting to query Clang dependency in persistent Dependency "
393+ " Scanner Cache." );
391394 return findDependencies (moduleName, details).hasValue ();
392395}
393396
@@ -397,6 +400,9 @@ GlobalModuleDependenciesCache::findAllDependenciesIrrespectiveOfSearchPaths(
397400 if (!kind) {
398401 for (auto kind = ModuleDependenciesKind::FirstKind;
399402 kind != ModuleDependenciesKind::LastKind; ++kind) {
403+ if (kind == ModuleDependenciesKind::Clang)
404+ continue ;
405+
400406 auto deps =
401407 findAllDependenciesIrrespectiveOfSearchPaths (moduleName, kind);
402408 if (deps.hasValue ())
@@ -446,6 +452,10 @@ static std::string modulePathForVerification(const ModuleDependencies &module) {
446452const ModuleDependencies *GlobalModuleDependenciesCache::recordDependencies (
447453 StringRef moduleName, ModuleDependencies dependencies) {
448454 auto kind = dependencies.getKind ();
455+ assert (kind != ModuleDependenciesKind::Clang &&
456+ " Attempting to cache Clang dependency in persistent Dependency "
457+ " Scanner Cache." );
458+
449459 // Source-based dependencies are recorded independently of the invocation's
450460 // target triple.
451461 if (kind == swift::ModuleDependenciesKind::SwiftSource) {
@@ -482,6 +492,10 @@ const ModuleDependencies *GlobalModuleDependenciesCache::recordDependencies(
482492const ModuleDependencies *GlobalModuleDependenciesCache::updateDependencies (
483493 ModuleDependencyID moduleID, ModuleDependencies dependencies) {
484494 auto kind = dependencies.getKind ();
495+ assert (kind != ModuleDependenciesKind::Clang &&
496+ " Attempting to update Clang dependency in persistent Dependency "
497+ " Scanner Cache." );
498+
485499 // Source-based dependencies
486500 if (kind == swift::ModuleDependenciesKind::SwiftSource) {
487501 assert (SwiftSourceModuleDependenciesMap.count (moduleID.first ) == 1 &&
@@ -517,9 +531,8 @@ ModuleDependenciesCache::getDependencyReferencesMap(
517531}
518532
519533ModuleDependenciesCache::ModuleDependenciesCache (
520- GlobalModuleDependenciesCache &globalCache,
521- StringRef mainModuleName)
522- : globalCache(globalCache), mainModuleName(mainModuleName) {
534+ GlobalModuleDependenciesCache &globalCache)
535+ : globalCache(globalCache) {
523536 for (auto kind = ModuleDependenciesKind::FirstKind;
524537 kind != ModuleDependenciesKind::LastKind; ++kind) {
525538 ModuleDependenciesMap.insert (
@@ -572,12 +585,29 @@ void ModuleDependenciesCache::recordDependencies(
572585 // The underlying Clang module needs to be cached in this invocation,
573586 // but should not make it to the global cache since it will look slightly
574587 // differently for clients of this module than it does for the module itself.
575- const ModuleDependencies* recordedDependencies;
576- if (moduleName == mainModuleName && dependencies.isClangModule ()) {
577- underlyingClangModuleDependency = std::make_unique<ModuleDependencies>(std::move (dependencies));
578- recordedDependencies = underlyingClangModuleDependency.get ();
588+ const ModuleDependencies *recordedDependencies;
589+ if (dependencies.getKind () == ModuleDependenciesKind::Clang) {
590+ auto *clangDep = dependencies.getAsClangModule ();
591+ assert (clangDep && " Unexpected NULL Clang dependency." );
592+ // Cache may already have a dependency for this module
593+ if (clangModuleDependencies.count (moduleName) != 0 ) {
594+ // Do not record duplicate dependencies.
595+ auto newModulePath = clangDep->moduleMapFile ;
596+ for (auto &existingDeps : clangModuleDependencies[moduleName]) {
597+ if (modulePathForVerification (existingDeps) == newModulePath)
598+ return ;
599+ }
600+ clangModuleDependencies[moduleName].emplace_back (std::move (dependencies));
601+ recordedDependencies = clangModuleDependencies[moduleName].end () - 1 ;
602+ } else {
603+ clangModuleDependencies.insert (
604+ {moduleName, ModuleDependenciesVector{std::move (dependencies)}});
605+ recordedDependencies = &(clangModuleDependencies[moduleName].front ());
606+ }
607+
579608 } else
580- recordedDependencies = globalCache.recordDependencies (moduleName, dependencies);
609+ recordedDependencies =
610+ globalCache.recordDependencies (moduleName, dependencies);
581611
582612 auto &map = getDependencyReferencesMap (dependenciesKind);
583613 assert (map.count (moduleName) == 0 && " Already added to map" );
0 commit comments