Author: Ben Langmuir Date: 2022-06-08T11:09:17-07:00 New Revision: 835fcf2aa5127bf99a1e6397c72153f00a0497b2
URL: https://github.com/llvm/llvm-project/commit/835fcf2aa5127bf99a1e6397c72153f00a0497b2 DIFF: https://github.com/llvm/llvm-project/commit/835fcf2aa5127bf99a1e6397c72153f00a0497b2.diff LOG: [clang][deps] Make order of module dependencies deterministic This fixes the underlying module dependencies, which had a non-deterministic order, which was also visible in the order of calls to DependencyConsumer methods. This was not directly observable in the clang-scan-deps utility, because it was previously seeing a sorted order from std::map in DependencyScanningTool. However, the underlying API previously created a likely issue for any other clients. Note: if you only apply the change from DependencyScanningTool, you can see the issue in clang-scan-deps, and existing tests will fail non-deterministicaly. Differential Revision: https://reviews.llvm.org/D127243 Added: Modified: clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h b/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h index 363e159dd990f..e0a4d6a554eb2 100644 --- a/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h +++ b/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h @@ -149,9 +149,9 @@ class ModuleDepCollectorPP final : public PPCallbacks { /// The parent dependency collector. ModuleDepCollector &MDC; /// Working set of direct modular dependencies. - llvm::DenseSet<const Module *> DirectModularDeps; + llvm::SetVector<const Module *> DirectModularDeps; /// Working set of direct modular dependencies that have already been built. - llvm::DenseSet<const Module *> DirectPrebuiltModularDeps; + llvm::SetVector<const Module *> DirectPrebuiltModularDeps; void handleImport(const Module *Imported); @@ -199,7 +199,7 @@ class ModuleDepCollector final : public DependencyCollector { /// textually included header files. std::vector<std::string> FileDeps; /// Direct and transitive modular dependencies of the main source file. - std::unordered_map<const Module *, ModuleDeps> ModularDeps; + llvm::MapVector<const Module *, std::unique_ptr<ModuleDeps>> ModularDeps; /// Options that control the dependency output generation. std::unique_ptr<DependencyOutputOptions> 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 index 6fd3a83fd3f7b..5041a8eb6e597 100644 --- a/clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp +++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp @@ -176,7 +176,7 @@ DependencyScanningTool::getFullDependencies( private: std::vector<std::string> Dependencies; std::vector<PrebuiltModuleDep> PrebuiltModuleDeps; - std::map<std::string, ModuleDeps> ClangModuleDeps; + llvm::MapVector<std::string, ModuleDeps, llvm::StringMap<unsigned>> ClangModuleDeps; std::string ContextHash; std::vector<std::string> OutputPaths; const llvm::StringSet<> &AlreadySeen; diff --git a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp index 21a422f8dbbae..6c7fdbc3944a6 100644 --- a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp +++ b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp @@ -199,7 +199,7 @@ void ModuleDepCollectorPP::EndOfMainFile() { 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 @@ ModuleID ModuleDepCollectorPP::handleTopLevelModule(const Module *M) { 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>(); + ModuleDeps &MD = *ModI.first->second; MD.ID.ModuleName = M->getFullModuleName(); MD.ImportedByMainFile = DirectModularDeps.contains(M); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits