[clang][deps] Ensure deterministic order of TU '-fmodule-file=' arguments
authorJan Svoboda <jan_svoboda@apple.com>
Wed, 25 Aug 2021 08:56:15 +0000 (10:56 +0200)
committerJan Svoboda <jan_svoboda@apple.com>
Wed, 25 Aug 2021 09:14:16 +0000 (11:14 +0200)
Translation units with multiple direct modular dependencies trigger a non-deterministic ordering in `clang-scan-deps`. This boils down to usage of `std::unordered_map`, which gets replaced by `std::map` in this patch.

Depends on D103526.

Reviewed By: dexonsmith

Differential Revision: https://reviews.llvm.org/D103807

clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp
clang/test/ClangScanDeps/modules-pch.c

index 2fd12f7..43b6a0c 100644 (file)
@@ -180,7 +180,7 @@ DependencyScanningTool::getFullDependencies(
   private:
     std::vector<std::string> Dependencies;
     std::vector<PrebuiltModuleDep> PrebuiltModuleDeps;
-    std::unordered_map<std::string, ModuleDeps> ClangModuleDeps;
+    std::map<std::string, ModuleDeps> ClangModuleDeps;
     std::string ContextHash;
     std::vector<std::string> OutputPaths;
     const llvm::StringSet<> &AlreadySeen;
index b9b7ed7..1f368f9 100644 (file)
@@ -90,9 +90,9 @@
 // CHECK-PCH-NEXT:       "command-line": [
 // CHECK-PCH-NEXT:         "-fno-implicit-modules",
 // CHECK-PCH-NEXT:         "-fno-implicit-module-maps",
-// CHECK-PCH-DAG:          "-fmodule-file=[[PREFIX]]/build/[[HASH_MOD_COMMON_1]]/ModCommon1-{{.*}}.pcm",
-// CHECK-PCH-DAG:          "-fmodule-file=[[PREFIX]]/build/[[HASH_MOD_COMMON_2]]/ModCommon2-{{.*}}.pcm",
-// CHECK-PCH-DAG:          "-fmodule-file=[[PREFIX]]/build/[[HASH_MOD_PCH]]/ModPCH-{{.*}}.pcm",
+// CHECK-PCH-NEXT:         "-fmodule-file=[[PREFIX]]/build/[[HASH_MOD_COMMON_1]]/ModCommon1-{{.*}}.pcm",
+// CHECK-PCH-NEXT:         "-fmodule-file=[[PREFIX]]/build/[[HASH_MOD_COMMON_2]]/ModCommon2-{{.*}}.pcm",
+// CHECK-PCH-NEXT:         "-fmodule-file=[[PREFIX]]/build/[[HASH_MOD_PCH]]/ModPCH-{{.*}}.pcm",
 // CHECK-PCH-NEXT:         "-fmodule-map-file=[[PREFIX]]/module.modulemap",
 // CHECK-PCH-NEXT:         "-fmodule-map-file=[[PREFIX]]/module.modulemap",
 // CHECK-PCH-NEXT:         "-fmodule-map-file=[[PREFIX]]/module.modulemap"