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