xref: /llvm-project/clang/test/ClangScanDeps/modules-context-hash.c (revision 9d4837f47c48c634d4a0ac799188e1f5332495ef)
1954d77b9SJan Svoboda // RUN: rm -rf %t && mkdir %t
2954d77b9SJan Svoboda // RUN: cp -r %S/Inputs/modules-context-hash/* %t
3954d77b9SJan Svoboda 
4954d77b9SJan Svoboda // Check that the scanner reports the same module as distinct dependencies when
5954d77b9SJan Svoboda // a single translation unit gets compiled with multiple command-lines that
6954d77b9SJan Svoboda // produce different **strict** context hashes.
7954d77b9SJan Svoboda 
8e76a9f16SJan Svoboda // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-context-hash/cdb_a.json.template > %t/cdb_a.json
9e76a9f16SJan Svoboda // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-context-hash/cdb_b.json.template > %t/cdb_b.json
10223e99fbSBen Langmuir // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-context-hash/cdb_b2.json.template > %t/cdb_b2.json
11e76a9f16SJan Svoboda 
12223e99fbSBen Langmuir // We run separate scans. The context hash for "a" and "b" can differ between
13e76a9f16SJan Svoboda // systems. If we'd scan both Clang invocations in a single run, the order of JSON
14e76a9f16SJan Svoboda // entities would be non-deterministic. To prevent this, run the scans separately
15e76a9f16SJan Svoboda // and verify that the context hashes differ with a single FileCheck invocation.
16e76a9f16SJan Svoboda //
17223e99fbSBen Langmuir // RUN: clang-scan-deps -compilation-database %t/cdb_a.json -format experimental-full -j 1 >  %t/result_a.json
18223e99fbSBen Langmuir // RUN: clang-scan-deps -compilation-database %t/cdb_b.json -format experimental-full -j 1 > %t/result_b.json
19223e99fbSBen Langmuir // RUN: clang-scan-deps -compilation-database %t/cdb_b2.json -format experimental-full -j 1 > %t/result_b2.json
20223e99fbSBen Langmuir // RUN: cat %t/result_a.json %t/result_b.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK
21223e99fbSBen Langmuir // RUN: cat %t/result_b.json %t/result_b2.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=FLAG_ONLY
22954d77b9SJan Svoboda 
23c4b13f7aSJan Svoboda // CHECK:      {
24954d77b9SJan Svoboda // CHECK-NEXT:   "modules": [
25954d77b9SJan Svoboda // CHECK-NEXT:     {
26954d77b9SJan Svoboda // CHECK-NEXT:       "clang-module-deps": [],
27954d77b9SJan Svoboda // CHECK-NEXT:       "clang-modulemap-file": "[[PREFIX]]/module.modulemap",
28954d77b9SJan Svoboda // CHECK-NEXT:       "command-line": [
29954d77b9SJan Svoboda // CHECK-NEXT:         "-cc1"
30954d77b9SJan Svoboda // CHECK:              "-emit-module"
31954d77b9SJan Svoboda // CHECK:              "-I"
32954d77b9SJan Svoboda // CHECK:              "[[PREFIX]]/a"
33954d77b9SJan Svoboda // CHECK:              "-fmodule-name=mod"
34954d77b9SJan Svoboda // CHECK:            ],
35954d77b9SJan Svoboda // CHECK-NEXT:       "context-hash": "[[HASH_MOD_A:.*]]",
36954d77b9SJan Svoboda // CHECK-NEXT:       "file-deps": [
37*9d4837f4SJan Svoboda // CHECK-NEXT:         "[[PREFIX]]/module.modulemap",
38954d77b9SJan Svoboda // CHECK-NEXT:         "[[PREFIX]]/mod.h",
39*9d4837f4SJan Svoboda // CHECK-NEXT:         "[[PREFIX]]/a/dep.h"
40954d77b9SJan Svoboda // CHECK-NEXT:       ],
4168eb3b20SArtem Chikin // CHECK-NEXT:       "link-libraries": [],
42954d77b9SJan Svoboda // CHECK-NEXT:       "name": "mod"
43954d77b9SJan Svoboda // CHECK-NEXT:     }
44954d77b9SJan Svoboda // CHECK-NEXT:   ],
45954d77b9SJan Svoboda // CHECK-NEXT:   "translation-units": [
46954d77b9SJan Svoboda // CHECK-NEXT:     {
4783902c40SBen Langmuir // CHECK:            "clang-context-hash": "{{.*}}",
48954d77b9SJan Svoboda // CHECK-NEXT:       "clang-module-deps": [
49954d77b9SJan Svoboda // CHECK-NEXT:         {
50954d77b9SJan Svoboda // CHECK-NEXT:           "context-hash": "[[HASH_MOD_A]]",
51954d77b9SJan Svoboda // CHECK-NEXT:           "module-name": "mod"
52954d77b9SJan Svoboda // CHECK-NEXT:         }
53954d77b9SJan Svoboda // CHECK-NEXT:       ],
54954d77b9SJan Svoboda // CHECK-NEXT:       "command-line": [
5571e32d5cSJan Svoboda // CHECK:            ],
5683902c40SBen Langmuir // CHECK:            "file-deps": [
57954d77b9SJan Svoboda // CHECK-NEXT:         "[[PREFIX]]/tu.c"
58954d77b9SJan Svoboda // CHECK-NEXT:       ],
59954d77b9SJan Svoboda // CHECK-NEXT:       "input-file": "[[PREFIX]]/tu.c"
60e76a9f16SJan Svoboda // CHECK-NEXT:     }
6183902c40SBen Langmuir 
6283902c40SBen Langmuir // CHECK:       "modules": [
63e76a9f16SJan Svoboda // CHECK-NEXT:     {
64e76a9f16SJan Svoboda // CHECK-NEXT:       "clang-module-deps": [],
65e76a9f16SJan Svoboda // CHECK-NEXT:       "clang-modulemap-file": "[[PREFIX]]/module.modulemap",
66e76a9f16SJan Svoboda // CHECK-NEXT:       "command-line": [
67e76a9f16SJan Svoboda // CHECK-NEXT:         "-cc1"
68e76a9f16SJan Svoboda // CHECK:              "-emit-module"
69e76a9f16SJan Svoboda // CHECK:              "-I"
70e76a9f16SJan Svoboda // CHECK:              "[[PREFIX]]/b"
71e76a9f16SJan Svoboda // CHECK:              "-fmodule-name=mod"
72e76a9f16SJan Svoboda // CHECK:            ],
73e76a9f16SJan Svoboda // CHECK-NOT:        "context-hash": "[[HASH_MOD_A]]",
74e76a9f16SJan Svoboda // CHECK:            "file-deps": [
75*9d4837f4SJan Svoboda // CHECK-NEXT:         "[[PREFIX]]/module.modulemap",
76e76a9f16SJan Svoboda // CHECK-NEXT:         "[[PREFIX]]/mod.h",
77*9d4837f4SJan Svoboda // CHECK-NEXT:         "[[PREFIX]]/b/dep.h"
78e76a9f16SJan Svoboda // CHECK-NEXT:       ],
7968eb3b20SArtem Chikin // CHECK-NEXT:       "link-libraries": [],
80e76a9f16SJan Svoboda // CHECK-NEXT:       "name": "mod"
81e76a9f16SJan Svoboda // CHECK-NEXT:     }
82e76a9f16SJan Svoboda // CHECK-NEXT:   ],
83e76a9f16SJan Svoboda // CHECK-NEXT:   "translation-units": [
84954d77b9SJan Svoboda // CHECK-NEXT:     {
8583902c40SBen Langmuir // CHECK:            "clang-context-hash": "{{.*}}",
86954d77b9SJan Svoboda // CHECK-NEXT:       "clang-module-deps": [
87954d77b9SJan Svoboda // CHECK-NEXT:         {
88e76a9f16SJan Svoboda // CHECK-NOT:            "context-hash": "[[HASH_MOD_A]]",
89e76a9f16SJan Svoboda // CHECK:                "module-name": "mod"
90954d77b9SJan Svoboda // CHECK-NEXT:         }
91954d77b9SJan Svoboda // CHECK-NEXT:       ],
92954d77b9SJan Svoboda // CHECK-NEXT:       "command-line": [
9371e32d5cSJan Svoboda // CHECK:            ],
9483902c40SBen Langmuir // CHECK:            "file-deps": [
95954d77b9SJan Svoboda // CHECK-NEXT:         "[[PREFIX]]/tu.c"
96954d77b9SJan Svoboda // CHECK-NEXT:       ],
97954d77b9SJan Svoboda // CHECK-NEXT:       "input-file": "[[PREFIX]]/tu.c"
98954d77b9SJan Svoboda // CHECK-NEXT:     }
99223e99fbSBen Langmuir 
100223e99fbSBen Langmuir // B and B2 only differ by -fapplication-extension
101223e99fbSBen Langmuir 
102223e99fbSBen Langmuir // FLAG_ONLY:       "modules": [
103223e99fbSBen Langmuir // FLAG_ONLY-NEXT:     {
104223e99fbSBen Langmuir // FLAG_ONLY:            "context-hash": "[[HASH_MOD_B1:.*]]"
105223e99fbSBen Langmuir // FLAG_ONLY-NOT:        "-fapplication-extension"
106223e99fbSBen Langmuir 
107223e99fbSBen Langmuir // FLAG_ONLY:       "modules": [
108223e99fbSBen Langmuir // FLAG_ONLY-NEXT:     {
109223e99fbSBen Langmuir // FLAG_ONLY-NOT:        "context-hash": "[[HASH_MOD_B1]]"
110223e99fbSBen Langmuir // FLAG_ONLY:            "-fapplication-extension"
111223e99fbSBen Langmuir // FLAG_ONLY:       "translation-units": [
112223e99fbSBen Langmuir // FLAG_ONLY-NOT:        "context-hash": "[[HASH_MOD_B1]]"
113