diff --git a/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h b/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h --- a/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h +++ b/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h @@ -149,9 +149,9 @@ /// The parent dependency collector. ModuleDepCollector &MDC; /// Working set of direct modular dependencies. - llvm::DenseSet DirectModularDeps; + llvm::SetVector DirectModularDeps; /// Working set of direct modular dependencies that have already been built. - llvm::DenseSet DirectPrebuiltModularDeps; + llvm::SetVector DirectPrebuiltModularDeps; void handleImport(const Module *Imported); @@ -199,7 +199,7 @@ /// textually included header files. std::vector FileDeps; /// Direct and transitive modular dependencies of the main source file. - std::unordered_map ModularDeps; + llvm::MapVector> ModularDeps; /// Options that control the dependency output generation. std::unique_ptr Opts; /// The original Clang invocation passed to dependency scanner. diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp --- a/clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp +++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp @@ -176,7 +176,7 @@ private: std::vector Dependencies; std::vector PrebuiltModuleDeps; - std::map ClangModuleDeps; + llvm::MapVector> ClangModuleDeps; std::string ContextHash; std::vector OutputPaths; const llvm::StringSet<> &AlreadySeen; diff --git a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp --- a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp +++ b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp @@ -199,7 +199,7 @@ MDC.Consumer.handleDependencyOutputOpts(*MDC.Opts); for (auto &&I : MDC.ModularDeps) - MDC.Consumer.handleModuleDependency(I.second); + MDC.Consumer.handleModuleDependency(*I.second); for (auto &&I : MDC.FileDeps) MDC.Consumer.handleFileDependency(I); @@ -212,11 +212,12 @@ assert(M == M->getTopLevelModule() && "Expected top level module!"); // If this module has been handled already, just return its ID. - auto ModI = MDC.ModularDeps.insert({M, ModuleDeps{}}); + auto ModI = MDC.ModularDeps.insert({M, nullptr}); if (!ModI.second) - return ModI.first->second.ID; + return ModI.first->second->ID; - ModuleDeps &MD = ModI.first->second; + ModI.first->second = std::make_unique(); + ModuleDeps &MD = *ModI.first->second; MD.ID.ModuleName = M->getFullModuleName(); MD.ImportedByMainFile = DirectModularDeps.contains(M);