[clang] 223e99f - [clang][deps] Fix module context hash for constant strings
Ben Langmuir via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 3 15:15:40 PST 2023
Author: Ben Langmuir
Date: 2023-02-03T15:10:19-08:00
New Revision: 223e99fb698dd63b5bb9266e11c2582261e05ad9
URL: https://github.com/llvm/llvm-project/commit/223e99fb698dd63b5bb9266e11c2582261e05ad9
DIFF: https://github.com/llvm/llvm-project/commit/223e99fb698dd63b5bb9266e11c2582261e05ad9.diff
LOG: [clang][deps] Fix module context hash for constant strings
We were not hashing constant strings in the command-line, only ones that
required allocations. This was causing us to get the same hash across
different flag options.
rdar://101053855
Differential Revision: https://reviews.llvm.org/D143027
Added:
clang/test/ClangScanDeps/Inputs/modules-context-hash/cdb_b2.json.template
Modified:
clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
clang/test/ClangScanDeps/modules-context-hash.c
Removed:
################################################################################
diff --git a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
index 1130c2bc21dea..4ff9e606677a8 100644
--- a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
+++ b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
@@ -267,13 +267,12 @@ static std::string getModuleContextHash(const ModuleDeps &MD,
HashBuilder.add(serialization::VERSION_MAJOR, serialization::VERSION_MINOR);
// Hash the BuildInvocation without any input files.
- SmallVector<const char *, 32> DummyArgs;
- CI.generateCC1CommandLine(DummyArgs, [&](const Twine &Arg) {
- Scratch.clear();
- StringRef Str = Arg.toStringRef(Scratch);
- HashBuilder.add(Str);
- return "<unused>";
- });
+ SmallVector<const char *, 32> Args;
+ llvm::BumpPtrAllocator Alloc;
+ llvm::StringSaver Saver(Alloc);
+ CI.generateCC1CommandLine(
+ Args, [&](const Twine &Arg) { return Saver.save(Arg).data(); });
+ HashBuilder.addRange(Args);
// Hash the module dependencies. These paths may
diff er even if the invocation
// is identical if they depend on the contents of the files in the TU -- for
diff --git a/clang/test/ClangScanDeps/Inputs/modules-context-hash/cdb_b2.json.template b/clang/test/ClangScanDeps/Inputs/modules-context-hash/cdb_b2.json.template
new file mode 100644
index 0000000000000..adb7b425397ee
--- /dev/null
+++ b/clang/test/ClangScanDeps/Inputs/modules-context-hash/cdb_b2.json.template
@@ -0,0 +1,7 @@
+[
+ {
+ "directory": "DIR",
+ "command": "clang -c DIR/tu.c -fmodules -fmodules-cache-path=DIR/cache -IDIR/b -o DIR/tu_b.o -fapplication-extension",
+ "file": "DIR/tu.c"
+ }
+]
diff --git a/clang/test/ClangScanDeps/modules-context-hash.c b/clang/test/ClangScanDeps/modules-context-hash.c
index 97a86534348f7..3108c924b0721 100644
--- a/clang/test/ClangScanDeps/modules-context-hash.c
+++ b/clang/test/ClangScanDeps/modules-context-hash.c
@@ -7,15 +7,18 @@
// RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-context-hash/cdb_a.json.template > %t/cdb_a.json
// RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-context-hash/cdb_b.json.template > %t/cdb_b.json
+// RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-context-hash/cdb_b2.json.template > %t/cdb_b2.json
-// We run two separate scans. The context hash for "a" and "b" can
diff er between
+// We run separate scans. The context hash for "a" and "b" can
diff er between
// systems. If we'd scan both Clang invocations in a single run, the order of JSON
// entities would be non-deterministic. To prevent this, run the scans separately
// and verify that the context hashes
diff er with a single FileCheck invocation.
//
-// RUN: clang-scan-deps -compilation-database %t/cdb_a.json -format experimental-full -j 1 > %t/result.json
-// RUN: clang-scan-deps -compilation-database %t/cdb_b.json -format experimental-full -j 1 >> %t/result.json
-// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK
+// RUN: clang-scan-deps -compilation-database %t/cdb_a.json -format experimental-full -j 1 > %t/result_a.json
+// RUN: clang-scan-deps -compilation-database %t/cdb_b.json -format experimental-full -j 1 > %t/result_b.json
+// RUN: clang-scan-deps -compilation-database %t/cdb_b2.json -format experimental-full -j 1 > %t/result_b2.json
+// RUN: cat %t/result_a.json %t/result_b.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK
+// RUN: cat %t/result_b.json %t/result_b2.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=FLAG_ONLY
// CHECK: {
// CHECK-NEXT: "modules": [
@@ -91,3 +94,17 @@
// CHECK-NEXT: ],
// CHECK-NEXT: "input-file": "[[PREFIX]]/tu.c"
// CHECK-NEXT: }
+
+// B and B2 only
diff er by -fapplication-extension
+
+// FLAG_ONLY: "modules": [
+// FLAG_ONLY-NEXT: {
+// FLAG_ONLY: "context-hash": "[[HASH_MOD_B1:.*]]"
+// FLAG_ONLY-NOT: "-fapplication-extension"
+
+// FLAG_ONLY: "modules": [
+// FLAG_ONLY-NEXT: {
+// FLAG_ONLY-NOT: "context-hash": "[[HASH_MOD_B1]]"
+// FLAG_ONLY: "-fapplication-extension"
+// FLAG_ONLY: "translation-units": [
+// FLAG_ONLY-NOT: "context-hash": "[[HASH_MOD_B1]]"
More information about the cfe-commits
mailing list