| // Test current directory pruning when computing the context hash. |
| |
| // REQUIRES: shell |
| |
| // RUN: rm -rf %t |
| // RUN: split-file %s %t |
| // RUN: sed -e "s|DIR|%/t|g" %t/cdb0.json.in > %t/cdb0.json |
| // RUN: sed -e "s|DIR|%/t|g" %t/cdb1.json.in > %t/cdb1.json |
| // RUN: sed -e "s|DIR|%/t|g" %t/cdb3.json.in > %t/cdb3.json |
| // RUN: sed -e "s|DIR|%/t|g" %t/cdb4.json.in > %t/cdb4.json |
| // RUN: sed -e "s|DIR|%/t|g" %t/cdb5.json.in > %t/cdb5.json |
| // RUN: clang-scan-deps -compilation-database %t/cdb0.json -format experimental-full -optimize-args=all > %t/result0.json |
| // RUN: clang-scan-deps -compilation-database %t/cdb1.json -format experimental-full -optimize-args=all > %t/result1.json |
| // It is not a typo to use cdb1.json for result2. We intend to use the same |
| // compilation database, but different clang-scan-deps optimize-args options. |
| // RUN: clang-scan-deps -compilation-database %t/cdb1.json -format experimental-full -optimize-args=header-search,system-warnings,vfs,canonicalize-macros > %t/result2.json |
| // RUN: clang-scan-deps -compilation-database %t/cdb3.json -format experimental-full -optimize-args=all > %t/result3.json |
| // RUN: clang-scan-deps -compilation-database %t/cdb4.json -format experimental-full -optimize-args=all > %t/result4.json |
| // RUN: clang-scan-deps -compilation-database %t/cdb5.json -format experimental-full -optimize-args=all > %t/result5.json |
| // RUN: cat %t/result0.json %t/result1.json | FileCheck %s |
| // RUN: cat %t/result0.json %t/result2.json | FileCheck %s -check-prefix=SKIPOPT |
| // RUN: cat %t/result3.json %t/result4.json | FileCheck %s -check-prefix=RELPATH |
| // RUN: cat %t/result0.json %t/result5.json | FileCheck %s |
| |
| //--- cdb0.json.in |
| [{ |
| "directory": "DIR", |
| "command": "clang -c DIR/tu.c -fmodules -fmodules-cache-path=DIR/cache -IDIR/include/ -o DIR/tu.o", |
| "file": "DIR/tu.c" |
| }] |
| |
| //--- cdb1.json.in |
| [{ |
| "directory": "DIR/a", |
| "command": "clang -c DIR/tu.c -fmodules -fmodules-cache-path=DIR/cache -IDIR/include/ -o DIR/tu.o", |
| "file": "DIR/tu.c" |
| }] |
| |
| // cdb2 is skipped because we reuse cdb1. |
| |
| //--- cdb3.json.in |
| [{ |
| "directory": "DIR", |
| "command": "clang -c DIR/tu.c -fmodules -fmodules-cache-path=DIR/cache -fprebuilt-module-path=.././module -IDIR/include/ -o DIR/tu.o ", |
| "file": "DIR/tu.c" |
| }] |
| |
| //--- cdb4.json.in |
| [{ |
| "directory": "DIR/a/", |
| "command": "clang -c DIR/tu.c -fmodules -fmodules-cache-path=DIR/cache -fprebuilt-module-path=.././module -IDIR/include/ -o DIR/tu.o ", |
| "file": "DIR/tu.c" |
| }] |
| |
| //--- cdb5.json.in |
| [{ |
| "directory": "DIR", |
| "command": "clang -c DIR/tu.c -fmodules -fmodules-cache-path=DIR/cache -IDIR/include/ -Xclang -working-directory=DIR/a/ -o DIR/tu.o", |
| "file": "DIR/tu.c" |
| }] |
| |
| //--- include/module.modulemap |
| module mod { |
| header "mod.h" |
| } |
| |
| //--- include/mod.h |
| |
| //--- tu.c |
| #include "mod.h" |
| |
| // Check that result0 and result1/result5 compute the same hash with |
| // optimization on. The only difference between result0 and result1/result5 is |
| // the compiler's working directory. |
| // CHECK: { |
| // CHECK-NEXT: "modules": [ |
| // CHECK-NEXT: { |
| // CHECK-NEXT: "clang-module-deps": [], |
| // CHECK: "context-hash": "[[HASH:.*]]", |
| // CHECK: } |
| // CHECK: "translation-units": [ |
| // CHECK: { |
| // CHECK: "commands": [ |
| // CHECK: { |
| // CHECK-NEXT: "clang-context-hash": "{{.*}}", |
| // CHECK-NEXT: "clang-module-deps": [ |
| // CHECK-NEXT: { |
| // CHECK-NEXT: "context-hash": "[[HASH]]", |
| // CHECK-NEXT: "module-name": "mod" |
| // CHECK: } |
| // CHECK: ], |
| // CHECK: { |
| // CHECK-NEXT: "modules": [ |
| // CHECK-NEXT: { |
| // CHECK-NEXT: "clang-module-deps": [], |
| // CHECK: "context-hash": "[[HASH]]", |
| // CHECK: } |
| // CHECK: "translation-units": [ |
| // CHECK: { |
| // CHECK: "commands": [ |
| // CHECK: { |
| // CHECK-NEXT: "clang-context-hash": "{{.*}}", |
| // CHECK-NEXT: "clang-module-deps": [ |
| // CHECK-NEXT: { |
| // CHECK-NEXT: "context-hash": "[[HASH]]", |
| // CHECK-NEXT: "module-name": "mod" |
| // CHECK: } |
| // CHECK: ], |
| |
| // Check that result0 and result2 compute different hashes because |
| // the working directory optmization is turned off for result2. |
| // SKIPOPT: { |
| // SKIPOPT-NEXT: "modules": [ |
| // SKIPOPT-NEXT: { |
| // SKIPOPT-NEXT: "clang-module-deps": [], |
| // SKIPOPT: "context-hash": "[[HASH0:.*]]", |
| // SKIPOPT: } |
| // SKIPOPT: "translation-units": [ |
| // SKIPOPT: { |
| // SKIPOPT: "commands": [ |
| // SKIPOPT: { |
| // SKIPOPT-NEXT: "clang-context-hash": "{{.*}}", |
| // SKIPOPT-NEXT: "clang-module-deps": [ |
| // SKIPOPT-NEXT: { |
| // SKIPOPT-NEXT: "context-hash": "[[HASH0]]", |
| // SKIPOPT-NEXT: "module-name": "mod" |
| // SKIPOPT: } |
| // SKIPOPT: ], |
| // SKIPOPT: { |
| // SKIPOPT-NEXT: "modules": [ |
| // SKIPOPT-NEXT: { |
| // SKIPOPT-NEXT: "clang-module-deps": [], |
| // SKIPOPT-NOT: "context-hash": "[[HASH0]]", |
| // SKIPOPT: "context-hash": "[[HASH2:.*]]", |
| // SKIPOPT: } |
| // SKIPOPT: "translation-units": [ |
| // SKIPOPT: { |
| // SKIPOPT: "commands": [ |
| // SKIPOPT: { |
| // SKIPOPT-NEXT: "clang-context-hash": "{{.*}}", |
| // SKIPOPT-NEXT: "clang-module-deps": [ |
| // SKIPOPT-NEXT: { |
| // SKIPOPT-NOT: "context-hash": "[[HASH0]]", |
| // SKIPOPT-NEXT: "context-hash": "[[HASH2]]" |
| // SKIPOPT-NEXT: "module-name": "mod" |
| // SKIPOPT: } |
| // SKIPOPT: ], |
| |
| // Check that result3 and result4 contain different hashes because |
| // both have a same relative path as a command line input, and |
| // they are produced using different compiler working directories. |
| // RELPATH: { |
| // RELPATH-NEXT: "modules": [ |
| // RELPATH-NEXT: { |
| // RELPATH-NEXT: "clang-module-deps": [], |
| // RELPATH: "context-hash": "[[HASH3:.*]]", |
| // RELPATH: } |
| // RELPATH: "translation-units": [ |
| // RELPATH: { |
| // RELPATH: "commands": [ |
| // RELPATH: { |
| // RELPATH-NEXT: "clang-context-hash": "{{.*}}", |
| // RELPATH-NEXT: "clang-module-deps": [ |
| // RELPATH-NEXT: { |
| // RELPATH-NEXT: "context-hash": "[[HASH3]]", |
| // RELPATH-NEXT: "module-name": "mod" |
| // RELPATH: } |
| // RELPATH: ], |
| // RELPATH: { |
| // RELPATH-NEXT: "modules": [ |
| // RELPATH-NEXT: { |
| // RELPATH-NEXT: "clang-module-deps": [], |
| // RELPATH-NOT: "context-hash": "[[HASH3]]", |
| // RELPATH: "context-hash": "[[HASH4:.*]]", |
| // RELPATH: } |
| // RELPATH: "translation-units": [ |
| // RELPATH: { |
| // RELPATH: "commands": [ |
| // RELPATH: { |
| // RELPATH-NEXT: "clang-context-hash": "{{.*}}", |
| // RELPATH-NEXT: "clang-module-deps": [ |
| // RELPATH-NEXT: { |
| // RELPATH-NOT: "context-hash": "[[HASH3]]", |
| // RELPATH-NEXT: "context-hash": "[[HASH4]]" |
| // RELPATH-NEXT: "module-name": "mod" |
| // RELPATH: } |
| // RELPATH: ], |
| |