diff --git a/clang/test/ClangScanDeps/cas-fs-prefix-mapping.c b/clang/test/ClangScanDeps/cas-fs-prefix-mapping.c index 3f3c6dfbe6857..134032e050271 100644 --- a/clang/test/ClangScanDeps/cas-fs-prefix-mapping.c +++ b/clang/test/ClangScanDeps/cas-fs-prefix-mapping.c @@ -4,21 +4,21 @@ // REQUIRES: ondisk_cas // RUN: rm -rf %t // RUN: split-file %s %t -// RUN: sed -e "s|DIR|%t|g" -e "s|CLANG|%clang|g" -e "s|SDK|%S/Inputs/SDK|g" %t/cdb.json.template > %t/cdb.json +// RUN: sed -e "s|DIR|%/t|g" -e "s|CLANG|%/ncclang|g" -e "s|SDK|%/S/Inputs/SDK|g" %t/cdb.json.template > %t/cdb.json // == Tree // Ensure the filesystem has the mapped paths. // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-tree -cas-path %t/cas \ -// RUN: -prefix-map=%t=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \ +// RUN: -prefix-map=%t=%/root^src -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc \ // RUN: | sed -E 's/tree ([^ ]+) for.*/\1/' > %t/tree_id.txt // RUN: llvm-cas -cas %t/cas -ls-tree-recursive @%t/tree_id.txt > %t/tree_result.txt -// RUN: FileCheck %s -input-file %t/tree_result.txt -check-prefix=FILES +// RUN: FileCheck %s -input-file %t/tree_result.txt -DROOT=%{/roott} -check-prefix=FILES -// FILES: file llvmcas://{{.*}} /^sdk/usr/include/stdlib.h -// FILES: file llvmcas://{{.*}} /^src/t.c -// FILES: file llvmcas://{{.*}} /^src/top.h -// FILES: file llvmcas://{{.*}} /^tc/lib/clang/{{.*}}/include/stdarg.h +// FILES: file llvmcas://{{.*}} [[ROOT]]^sdk/usr/include/stdlib.h +// FILES: file llvmcas://{{.*}} [[ROOT]]^src/t.c +// FILES: file llvmcas://{{.*}} [[ROOT]]^src/top.h +// FILES: file llvmcas://{{.*}} [[ROOT]]^tc/lib/clang/{{.*}}/include/stdarg.h // == Full Tree // This should have the same filesystem as above, and we also check the command- @@ -26,18 +26,18 @@ // RUN: cat %t/tree_id.txt > %t/full_tree_result.txt // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-tree-full -cas-path %t/cas \ -// RUN: -prefix-map=%t=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \ +// RUN: -prefix-map=%t=%/root^src -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc \ // RUN: >> %t/full_tree_result.txt -// RUN: FileCheck %s -input-file %t/full_tree_result.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK +// RUN: cat %t/full_tree_result.txt | %PathSanitizingFileCheck --sanitize PREFIX=%/t --sanitize SDK_PREFIX=%/S/Inputs/SDK --sanitize ROOT^=%/root^ --enable-yaml-compatibility %s // == Full // Same as full tree. // RUN: cat %t/tree_id.txt > %t/full_result.txt // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full -cas-path %t/cas \ -// RUN: -prefix-map=%t=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \ +// RUN: -prefix-map=%t=%/root^src -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc \ // RUN: >> %t/full_result.txt -// RUN: FileCheck %s -input-file %t/full_result.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK +// RUN: cat %t/full_result.txt | %PathSanitizingFileCheck --sanitize PREFIX=%/t --sanitize SDK_PREFIX=%/S/Inputs/SDK --sanitize ROOT^=%/root^ --enable-yaml-compatibility %s // CHECK: [[MAPPED_FS_ID:llvmcas://[[:xdigit:]]+]] // CHECK: "modules": [] @@ -49,36 +49,36 @@ // CHECK: "clang-module-deps": [] // CHECK: "command-line": [ // CHECK: "-fcas-path" -// CHECK-NEXT: "[[PREFIX]]/cas" +// CHECK-NEXT: "PREFIX{{/|\\\\}}cas" // CHECK: "-fcas-fs" // CHECK-NEXT: "[[MAPPED_FS_ID]]" // CHECK: "-fcas-fs-working-directory" -// CHECK-NEXT: "/^src" +// CHECK-NEXT: "ROOT^src" // CHECK: "-x" // CHECK-NEXT: "c" -// CHECK-NEXT: "/^src/t.c" +// CHECK-NEXT: "ROOT^src{{/|\\\\}}t.c" // CHECK: "-isysroot" -// CHECK-NEXT: "/^sdk" +// CHECK-NEXT: "ROOT^sdk" // CHECK: "-resource-dir" -// CHECK-NEXT: "/^tc/lib/clang/{{.*}}" +// CHECK-NEXT: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}" // CHECK: "-isystem" -// CHECK-NEXT: "/^sdk/usr/local/include +// CHECK-NEXT: "ROOT^sdk{{/|\\\\}}usr{{/|\\\\}}local{{/|\\\\}}include // CHECK: "-isystem" -// CHECK-NEXT: "/^tc/lib/clang/{{.*}}/include" +// CHECK-NEXT: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}{{/|\\\\}}include" // CHECK: "-internal-externc-isystem" -// CHECK-NEXT: "/^sdk/usr/include" -// CHECK: "-fdebug-compilation-dir=/^src" -// CHECK: "-fcoverage-compilation-dir=/^src" -// CHECK-NOT: [[PREFIX]] -// CHECK-NOT: [[SDK_PREFIX]] +// CHECK-NEXT: "ROOT^sdk{{/|\\\\}}usr{{/|\\\\}}include" +// CHECK: "-fdebug-compilation-dir=ROOT^src" +// CHECK: "-fcoverage-compilation-dir=ROOT^src" +// CHECK-NOT: PREFIX +// CHECK-NOT: SDK_PREFIX // CHECK: ] // CHECK: "file-deps": [ -// CHECK: "[[PREFIX]]/t.c" -// CHECK: "[[PREFIX]]/top.h" -// CHECK: "{{.*}}include/stdarg.h" -// CHECK: "[[SDK_PREFIX]]/usr/include/stdlib.h" +// CHECK: "PREFIX{{/|\\\\}}t.c" +// CHECK: "PREFIX{{/|\\\\}}top.h" +// CHECK: "{{.*}}include{{/|\\\\}}stdarg.h" +// CHECK: "SDK_PREFIX{{/|\\\\}}usr{{/|\\\\}}include{{/|\\\\}}stdlib.h" // CHECK: ] -// CHECK: "input-file": "[[PREFIX]]/t.c" +// CHECK: "input-file": "PREFIX{{/|\\\\}}t.c" //--- cdb.json.template [ diff --git a/clang/test/ClangScanDeps/include-tree-prefix-mapping-pch-remap.c b/clang/test/ClangScanDeps/include-tree-prefix-mapping-pch-remap.c index 8c379ef60014d..d117fa5ffadf2 100644 --- a/clang/test/ClangScanDeps/include-tree-prefix-mapping-pch-remap.c +++ b/clang/test/ClangScanDeps/include-tree-prefix-mapping-pch-remap.c @@ -1,11 +1,11 @@ // REQUIRES: ondisk_cas // RUN: rm -rf %t // RUN: split-file %s %t -// RUN: sed -e "s|DIR|%t|g" %t/cdb.json.template > %t/cdb.json +// RUN: sed -e "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json \ // RUN: -format experimental-include-tree-full -cas-path %t/cas \ -// RUN: -prefix-map=%t=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc > %t/deps.json +// RUN: -prefix-map=%t=%/root^src -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc > %t/deps.json //--- cdb.json.template [{ diff --git a/clang/test/ClangScanDeps/include-tree-prefix-mapping.c b/clang/test/ClangScanDeps/include-tree-prefix-mapping.c index e0842a7be6b98..a61c9e00b94be 100644 --- a/clang/test/ClangScanDeps/include-tree-prefix-mapping.c +++ b/clang/test/ClangScanDeps/include-tree-prefix-mapping.c @@ -1,33 +1,33 @@ // REQUIRES: ondisk_cas // RUN: rm -rf %t // RUN: split-file %s %t -// RUN: sed -e "s|DIR|%t|g" -e "s|CLANG|%clang|g" -e "s|SDK|%S/Inputs/SDK|g" %t/cdb.json.template > %t/cdb.json +// RUN: sed -e "s|DIR|%/t|g" -e "s|CLANG|%/ncclang|g" -e "s|SDK|%/S/Inputs/SDK|g" %t/cdb.json.template > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-include-tree -cas-path %t/cas \ -// RUN: -prefix-map=%t=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc > %t/result.txt -// RUN: FileCheck %s -input-file %t/result.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK +// RUN: -prefix-map=%t=%/root^src -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc > %t/result.txt +// RUN: cat %t/result.txt | %PathSanitizingFileCheck --sanitize PREFIX=%/t --sanitize SDK_PREFIX=%/S/Inputs/SDK --sanitize ROOT^=%/root^ %s -// CHECK: {{.*}} - [[PREFIX]]/t.c -// CHECK-NOT: [[PREFIX]] -// CHECK-NOT: [[SDK_PREFIX]] -// CHECK: /^src{{[/\\]}}t.c -// CHECK: /^src{{[/\\]}}top.h -// CHECK: /^tc{{[/\\]}}lib{{[/\\]}}clang{{[/\\]}}{{.*}}{{[/\\]}}include{{[/\\]}}stdarg.h -// CHECK: /^sdk{{[/\\]}}usr{{[/\\]}}include{{[/\\]}}stdlib.h +// CHECK: {{.*}} - PREFIX{{/|\\}}t.c +// CHECK-NOT: PREFIX +// CHECK-NOT: SDK_PREFIX +// CHECK: ROOT^src{{[/\\]}}t.c +// CHECK: ROOT^src{{[/\\]}}top.h +// CHECK: ROOT^tc{{[/\\]}}lib{{[/\\]}}clang{{[/\\]}}{{.*}}{{[/\\]}}include{{[/\\]}}stdarg.h +// CHECK: ROOT^sdk{{[/\\]}}usr{{[/\\]}}include{{[/\\]}}stdlib.h // RUN: clang-scan-deps -compilation-database %t/cdb.json \ // RUN: -format experimental-include-tree-full -cas-path %t/cas \ -// RUN: -prefix-map=%t=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc > %t/deps.json +// RUN: -prefix-map=%t=%/root^src -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc > %t/deps.json // RUN: cat %t/result.txt > %t/full.txt // RUN: echo "FULL DEPS START" >> %t/full.txt -// RUN: cat %t/deps.json | sed 's:\\\\\?:/:g' >> %t/full.txt +// RUN: cat %t/deps.json >> %t/full.txt -// RUN: FileCheck %s -DPREFIX=%/t -DSDK_PREFIX=%S/Inputs/SDK -check-prefix=FULL -input-file %t/full.txt +// RUN: cat %t/full.txt | %PathSanitizingFileCheck --sanitize PREFIX=%/t --sanitize SDK_PREFIX=%/S/Inputs/SDK --sanitize ROOT^=%/root^ --enable-yaml-compatibility %s -check-prefix=FULL // Capture the tree id from experimental-include-tree ; ensure that it matches // the result from experimental-full. -// FULL: [[TREE_ID:llvmcas://[[:xdigit:]]+]] - [[PREFIX]]/t.c +// FULL: [[TREE_ID:llvmcas://[[:xdigit:]]+]] - PREFIX{{/|\\}}t.c // FULL: FULL DEPS START // FULL-NEXT: { @@ -40,7 +40,7 @@ // FULL: "command-line": [ // FULL-NEXT: "-cc1" // FULL: "-fcas-path" -// FULL-NEXT: "[[PREFIX]]/cas" +// FULL-NEXT: "PREFIX{{/|\\\\}}cas" // FULL: "-disable-free" // FULL: "-fcas-include-tree" // FULL-NEXT: "[[TREE_ID]]" @@ -49,15 +49,15 @@ // FULL: "-x" // FULL-NEXT: "c" // FULL: "-isysroot" -// FULL-NEXT: "/^sdk" +// FULL-NEXT: "ROOT^sdk" // FULL: ] // FULL: "file-deps": [ -// FULL-DAG: "[[PREFIX]]/t.c" -// FULL-DAG: "[[PREFIX]]/top.h" -// FULL-DAG: "{{.*}}/stdarg.h" -// FULL-DAG: "[[SDK_PREFIX]]/usr/include/stdlib.h" +// FULL-DAG: "PREFIX{{/|\\\\}}t.c" +// FULL-DAG: "PREFIX{{/|\\\\}}top.h" +// FULL-DAG: "{{.*}}{{/|\\\\}}stdarg.h" +// FULL-DAG: "SDK_PREFIX{{/|\\\\}}usr{{/|\\\\}}include{{/|\\\\}}stdlib.h" // FULL: ] -// FULL: "input-file": "[[PREFIX]]/t.c" +// FULL: "input-file": "PREFIX{{/|\\\\}}t.c" // FULL: } // FULL: ] // FULL: } diff --git a/clang/test/ClangScanDeps/modules-cas-fs-prefix-mapping-caching.c b/clang/test/ClangScanDeps/modules-cas-fs-prefix-mapping-caching.c index 230b21b83fae7..064d9f0d20783 100644 --- a/clang/test/ClangScanDeps/modules-cas-fs-prefix-mapping-caching.c +++ b/clang/test/ClangScanDeps/modules-cas-fs-prefix-mapping-caching.c @@ -5,19 +5,19 @@ // RUN: rm -rf %t // RUN: split-file %s %t // RUN: cp -r %t/dir1 %t/dir2 -// RUN: sed -e "s|DIR|%t/dir1|g" -e "s|CLANG|%clang|g" -e "s|SDK|%S/Inputs/SDK|g" %t/cdb.json.template > %t/dir1/cdb.json -// RUN: sed -e "s|DIR|%t/dir2|g" -e "s|CLANG|%clang|g" -e "s|SDK|%S/Inputs/SDK|g" %t/cdb.json.template > %t/dir2/cdb.json +// RUN: sed -e "s|DIR|%/t/dir1|g" -e "s|CLANG|%/ncclang|g" -e "s|SDK|%/S/Inputs/SDK|g" %t/cdb.json.template > %t/dir1/cdb.json +// RUN: sed -e "s|DIR|%/t/dir2|g" -e "s|CLANG|%/ncclang|g" -e "s|SDK|%/S/Inputs/SDK|g" %t/cdb.json.template > %t/dir2/cdb.json // RUN: clang-scan-deps -compilation-database %t/dir1/cdb.json -format experimental-full \ // RUN: -cas-path %t/cas -module-files-dir %t/dir1/modules \ -// RUN: -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \ -// RUN: -prefix-map=%t/dir1/modules=/^modules -prefix-map=%t/dir1=/^src -optimize-args=none \ +// RUN: -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc \ +// RUN: -prefix-map=%t/dir1/modules=%/root^modules -prefix-map=%t/dir1=%/root^src -optimize-args=none \ // RUN: > %t/dir1.txt // RUN: clang-scan-deps -compilation-database %t/dir2/cdb.json -format experimental-full \ // RUN: -cas-path %t/cas -module-files-dir %t/dir2/modules \ -// RUN: -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \ -// RUN: -prefix-map=%t/dir2/modules=/^modules -prefix-map=%t/dir2=/^src -optimize-args=none \ +// RUN: -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc \ +// RUN: -prefix-map=%t/dir2/modules=%/root^modules -prefix-map=%t/dir2=%/root^src -optimize-args=none \ // RUN: > %t/dir2.txt // Extract individual commands. @@ -29,15 +29,21 @@ // RUN: %deps-to-rsp %t/dir2.txt --module-name=A > %t/dir2/A.cc1.rsp // RUN: %deps-to-rsp %t/dir2.txt --tu-index 0 > %t/dir2/tu.cc1.rsp -// RUN: (cd %t/dir1; %clang @B.cc1.rsp) 2>&1 | FileCheck %s -check-prefix=CACHE-MISS -// RUN: (cd %t/dir1; %clang @A.cc1.rsp) 2>&1 | FileCheck %s -check-prefix=CACHE-MISS -// RUN: (cd %t/dir1; %clang @tu.cc1.rsp) 2>&1 | FileCheck %s -check-prefix=CACHE-MISS +// RUN: cd %t/dir1 && %clang @B.cc1.rsp > %t/miss-B.txt 2>&1 +// RUN: cat %t/miss-B.txt | FileCheck %s -check-prefix=CACHE-MISS +// RUN: cd %t/dir1 && %clang @A.cc1.rsp > %t/miss-A.txt 2>&1 +// RUN: cat %t/miss-A.txt | FileCheck %s -check-prefix=CACHE-MISS +// RUN: cd %t/dir1 && %clang @tu.cc1.rsp > %t/miss-tu.txt 2>&1 +// RUN: cat %t/miss-tu.txt | FileCheck %s -check-prefix=CACHE-MISS // CACHE-MISS: compile job cache miss -// RUN: (cd %t/dir2; %clang @B.cc1.rsp) 2>&1 | FileCheck %s -check-prefix=CACHE-HIT -// RUN: (cd %t/dir2; %clang @A.cc1.rsp) 2>&1 | FileCheck %s -check-prefix=CACHE-HIT -// RUN: (cd %t/dir2; %clang @tu.cc1.rsp) 2>&1 | FileCheck %s -check-prefix=CACHE-HIT +// RUN: cd %t/dir2 && %clang @B.cc1.rsp > %t/hit-B.txt 2>&1 +// RUN: cat %t/hit-B.txt | FileCheck %s -check-prefix=CACHE-HIT +// RUN: cd %t/dir2 && %clang @A.cc1.rsp > %t/hit-A.txt 2>&1 +// RUN: cat %t/hit-B.txt | FileCheck %s -check-prefix=CACHE-HIT +// RUN: cd %t/dir2 && %clang @tu.cc1.rsp > %t/hit-tu.txt 2>&1 +// RUN: cat %t/hit-tu.txt | FileCheck %s -check-prefix=CACHE-HIT // CACHE-HIT: compile job cache hit diff --git a/clang/test/ClangScanDeps/modules-cas-fs-prefix-mapping.c b/clang/test/ClangScanDeps/modules-cas-fs-prefix-mapping.c index 24190438079f4..63892d1a87595 100644 --- a/clang/test/ClangScanDeps/modules-cas-fs-prefix-mapping.c +++ b/clang/test/ClangScanDeps/modules-cas-fs-prefix-mapping.c @@ -5,15 +5,15 @@ // RUN: rm -rf %t // RUN: split-file %s %t -// RUN: sed -e "s|DIR|%t|g" -e "s|CLANG|%clang|g" -e "s|SDK|%S/Inputs/SDK|g" %t/cdb.json.template > %t/cdb.json +// RUN: sed -e "s|DIR|%/t|g" -e "s|CLANG|%/ncclang|g" -e "s|SDK|%/S/Inputs/SDK|g" %t/cdb.json.template > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full \ // RUN: -cas-path %t/cas -module-files-dir %t/modules \ -// RUN: -prefix-map=%t/modules=/^modules -prefix-map=%t=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \ +// RUN: -prefix-map=%t/modules=%/root^modules -prefix-map=%t=%/root^src -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc \ // RUN: > %t/full_result.txt // Check the command-lines. -// RUN: FileCheck %s -input-file %t/full_result.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK +// RUN: cat %t/full_result.txt | %PathSanitizingFileCheck --sanitize PREFIX=%/t --sanitize SDK_PREFIX=%/S/Inputs/SDK --sanitize ROOT^=%/root^ --enable-yaml-compatibility %s // Extract individual commands. // RUN: %deps-to-rsp %t/full_result.txt --module-name=B > %t/B.cc1.rsp @@ -27,18 +27,18 @@ // RUN: llvm-cas -cas %t/cas -ls-tree-recursive @%t/B_id.txt > %t/B_fs.txt // RUN: llvm-cas -cas %t/cas -ls-tree-recursive @%t/A_id.txt > %t/A_fs.txt // RUN: llvm-cas -cas %t/cas -ls-tree-recursive @%t/tu_id.txt > %t/tu_fs.txt -// RUN: FileCheck %s -input-file %t/A_fs.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -check-prefixes=FS_NEG,FS -// RUN: FileCheck %s -input-file %t/B_fs.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -check-prefixes=FS_NEG,FS -// RUN: FileCheck %s -input-file %t/tu_fs.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -check-prefixes=FS_NEG,FS +// RUN: FileCheck %s -input-file %t/A_fs.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -DROOT=%{/roott} -check-prefixes=FS_NEG,FS +// RUN: FileCheck %s -input-file %t/B_fs.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -DROOT=%{/roott} -check-prefixes=FS_NEG,FS +// RUN: FileCheck %s -input-file %t/tu_fs.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -DROOT=%{/roott} -check-prefixes=FS_NEG,FS // FS_NEG-NOT: [[PREFIX]] // FS_NEG-NOT: [[SDK_PREFIX]] // FS_NEG-NOT: .pcm{{$}} -// FS: file llvmcas://{{.*}} /^sdk/usr/include/stdlib.h -// FS: file llvmcas://{{.*}} /^src/a.h -// FS: file llvmcas://{{.*}} /^src/b.h -// FS: file llvmcas://{{.*}} /^src/module.modulemap -// FS: file llvmcas://{{.*}} /^tc/lib/clang/{{.*}}/include/stdarg.h +// FS: file llvmcas://{{.*}} [[ROOT]]^sdk/usr/include/stdlib.h +// FS: file llvmcas://{{.*}} [[ROOT]]^src/a.h +// FS: file llvmcas://{{.*}} [[ROOT]]^src/b.h +// FS: file llvmcas://{{.*}} [[ROOT]]^src/module.modulemap +// FS: file llvmcas://{{.*}} [[ROOT]]^tc/lib/clang/{{.*}}/include/stdarg.h // Check that it builds. // RUN: %clang @%t/B.cc1.rsp @@ -54,71 +54,71 @@ // CHECK: "module-name": "B" // CHECK: } // CHECK: ] -// CHECK: "clang-modulemap-file": "[[PREFIX]]/module.modulemap" +// CHECK: "clang-modulemap-file": "PREFIX{{/|\\\\}}module.modulemap" // CHECK: "command-line": [ // CHECK: "-fcas-path" -// CHECK: "[[PREFIX]]/cas" +// CHECK: "PREFIX{{/|\\\\}}cas" // CHECK: "-fcas-fs" // CHECK: "[[A_ROOT_ID]]" // CHECK: "-fcas-fs-working-directory" -// CHECK: "/^src" -// CHECK: "-fmodule-map-file=/^src/module.modulemap" +// CHECK: "ROOT^src" +// CHECK: "-fmodule-map-file=ROOT^src{{/|\\\\}}module.modulemap" // CHECK: "-o" -// CHECK: "[[PREFIX]]/modules/{{.*}}/A-{{.*}}.pcm" +// CHECK: "PREFIX{{/|\\\\}}modules{{/|\\\\}}{{.*}}{{/|\\\\}}A-{{.*}}.pcm" // CHECK: "-fmodule-file-cache-key" -// CHECK: "/^modules/{{.*}}/B-[[B_CONTEXT_HASH:[^.]+]].pcm" +// CHECK: "ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}B-[[B_CONTEXT_HASH:[^.]+]].pcm" // CHECK: "llvmcas://{{.*}}" // CHECK: "-x" // CHECK: "c" -// CHECK: "/^src/module.modulemap" +// CHECK: "ROOT^src{{/|\\\\}}module.modulemap" // CHECK: "-isysroot" -// CHECK: "/^sdk" +// CHECK: "ROOT^sdk" // CHECK: "-resource-dir" -// CHECK: "/^tc/lib/clang/{{.*}}" -// CHECK: "-fmodule-file=B=/^modules/{{.*}}/B-[[B_CONTEXT_HASH]].pcm" +// CHECK: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}" +// CHECK: "-fmodule-file=B=ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}B-[[B_CONTEXT_HASH]].pcm" // CHECK: "-isystem" -// CHECK: "/^tc/lib/clang/{{.*}}/include" +// CHECK: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}{{/|\\\\}}include" // CHECK: "-internal-externc-isystem" -// CHECK: "/^sdk/usr/include" +// CHECK: "ROOT^sdk{{/|\\\\}}usr{{/|\\\\}}include" // CHECK: ] // CHECK: "file-deps": [ -// CHECK: "[[PREFIX]]/module.modulemap" -// CHECK: "[[PREFIX]]/a.h" +// CHECK: "PREFIX{{/|\\\\}}module.modulemap" +// CHECK: "PREFIX{{/|\\\\}}a.h" // CHECK: ] // CHECK: "name": "A" // CHECK: } // CHECK: { // CHECK: "casfs-root-id": "[[B_ROOT_ID:llvmcas://[[:xdigit:]]+]]" // CHECK: "clang-module-deps": [], -// CHECK: "clang-modulemap-file": "[[PREFIX]]/module.modulemap" +// CHECK: "clang-modulemap-file": "PREFIX{{/|\\\\}}module.modulemap" // CHECK: "command-line": [ // CHECK: "-fcas-path" -// CHECK: "[[PREFIX]]/cas" +// CHECK: "PREFIX{{/|\\\\}}cas" // CHECK: "-fcas-fs" // CHECK: "[[B_ROOT_ID]]" // CHECK: "-fcas-fs-working-directory" -// CHECK: "/^src" +// CHECK: "ROOT^src" // CHECK: "-o" -// CHECK: "[[PREFIX]]/modules/{{.*}}/B-[[B_CONTEXT_HASH]].pcm" +// CHECK: "PREFIX{{/|\\\\}}modules{{/|\\\\}}{{.*}}{{/|\\\\}}B-[[B_CONTEXT_HASH]].pcm" // CHECK: "-x" // CHECK: "c" -// CHECK: "/^src/module.modulemap" +// CHECK: "ROOT^src{{/|\\\\}}module.modulemap" // CHECK: "-isysroot" -// CHECK: "/^sdk" +// CHECK: "ROOT^sdk" // CHECK: "-resource-dir" -// CHECK: "/^tc/lib/clang/{{.*}}" +// CHECK: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}" // CHECK: "-isystem" -// CHECK: "/^tc/lib/clang/{{.*}}/include" +// CHECK: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}{{/|\\\\}}include" // CHECK: "-internal-externc-isystem" -// CHECK: "/^sdk/usr/include" +// CHECK: "ROOT^sdk{{/|\\\\}}usr{{/|\\\\}}include" // CHECK: ] // CHECK: "context-hash": "[[B_CONTEXT_HASH]]" // CHECK: "file-deps": [ // Note: PREFIX, SDK_PREFIX and toolchain path are unordered -// CHECK-DAG: "[[PREFIX]]/module.modulemap" -// CHECK-DAG: "[[PREFIX]]/b.h" -// CHECK-DAG: "{{.*}}/include/stdarg.h" -// CHECK-DAG: "[[SDK_PREFIX]]/usr/include/stdlib.h" +// CHECK-DAG: "PREFIX{{/|\\\\}}module.modulemap" +// CHECK-DAG: "PREFIX{{/|\\\\}}b.h" +// CHECK-DAG: "{{.*}}{{/|\\\\}}include{{/|\\\\}}stdarg.h" +// CHECK-DAG: "SDK_PREFIX{{/|\\\\}}usr{{/|\\\\}}include{{/|\\\\}}stdlib.h" // CHECK: ] // CHECK: "name": "B" // CHECK: } @@ -135,32 +135,32 @@ // CHECK: ] // CHECK: "command-line": [ // CHECK: "-fcas-path" -// CHECK: "[[PREFIX]]/cas" +// CHECK: "PREFIX{{/|\\\\}}cas" // CHECK: "-fcas-fs" // CHECK: "[[TU_ROOT_ID]]" // CHECK: "-fcas-fs-working-directory" -// CHECK: "/^src" -// CHECK: "-fmodule-map-file=/^src/module.modulemap" +// CHECK: "ROOT^src" +// CHECK: "-fmodule-map-file=ROOT^src{{/|\\\\}}module.modulemap" // CHECK: "-fmodule-file-cache-key" -// CHECK: "/^modules/{{.*}}A-{{.*}}.pcm" +// CHECK: "ROOT^modules{{/|\\\\}}{{.*}}A-{{.*}}.pcm" // CHECK: "llvmcas://{{.*}}" // CHECK: "-x" // CHECK: "c" -// CHECK: "/^src/t.c" +// CHECK: "ROOT^src{{/|\\\\}}t.c" // CHECK: "-isysroot" -// CHECK: "/^sdk" +// CHECK: "ROOT^sdk" // CHECK: "-resource-dir" -// CHECK: "/^tc/lib/clang/{{.*}}" -// CHECK: "-fmodule-file=A=/^modules/{{.*}}/A-{{.*}}.pcm" +// CHECK: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}" +// CHECK: "-fmodule-file=A=ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}A-{{.*}}.pcm" // CHECK: "-isystem" -// CHECK: "/^tc/lib/clang/{{.*}}/include" +// CHECK: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}{{/|\\\\}}include" // CHECK: "-internal-externc-isystem" -// CHECK: "/^sdk/usr/include" +// CHECK: "ROOT^sdk{{/|\\\\}}usr{{/|\\\\}}include" // CHECK: ], // CHECK: "file-deps": [ -// CHECK: "[[PREFIX]]/t.c" +// CHECK: "PREFIX{{/|\\\\}}t.c" // CHECK: ] -// CHECK: "input-file": "[[PREFIX]]/t.c" +// CHECK: "input-file": "PREFIX{{/|\\\\}}t.c" // CHECK: } diff --git a/clang/test/ClangScanDeps/modules-include-tree-prefix-map.c b/clang/test/ClangScanDeps/modules-include-tree-prefix-map.c index 8eb7da7be4bea..cde604544d5fc 100644 --- a/clang/test/ClangScanDeps/modules-include-tree-prefix-map.c +++ b/clang/test/ClangScanDeps/modules-include-tree-prefix-map.c @@ -4,12 +4,13 @@ // RUN: rm -rf %t // RUN: split-file %s %t/dir1 // RUN: cp -r %t/dir1 %t/dir2 -// RUN: sed -e "s|DIR|%/t/dir1|g" -e "s|CLANG|%clang|g" %t/dir1/cdb.json.template > %t/cdb1.json -// RUN: sed -e "s|DIR|%/t/dir2|g" -e "s|CLANG|%clang|g" %t/dir1/cdb.json.template > %t/cdb2.json +// RUN: sed -e "s|DIR|%/t/dir1|g" -e "s|CLANG|%/ncclang|g" %t/dir1/cdb.json.template > %t/cdb1.json +// RUN: sed -e "s|DIR|%/t/dir2|g" -e "s|CLANG|%/ncclang|g" %t/dir1/cdb.json.template > %t/cdb2.json // RUN: clang-scan-deps -compilation-database %t/cdb1.json \ // RUN: -cas-path %t/cas -module-files-dir %t/dir1/outputs \ -// RUN: -prefix-map=%t/dir1/outputs=/^modules -prefix-map=%t/dir1=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \ +// RUN: -prefix-map=%t/dir1/outputs=%/root^modules -prefix-map=%t/dir1=%/root^src \ +// RUN: -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc \ // RUN: -format experimental-include-tree-full -mode preprocess-dependency-directives -optimize-args=none \ // RUN: > %t/deps.json @@ -45,50 +46,50 @@ // RUN: cat %t/deps.json >> %t/result.txt -// RUN: FileCheck %s -input-file %t/result.txt -DPREFIX=%/t +// RUN: cat %t/result.txt | %PathSanitizingFileCheck --sanitize PREFIX=%/t --sanitize ROOT^=%/root^ --enable-yaml-compatibility %s // CHECK-LABEL: MODULE Top // CHECK: llvmcas://{{[[:xdigit:]]+}} // CHECK: 1:1 llvmcas://{{[[:xdigit:]]+}} -// CHECK: 2:1 /^src/Top.h llvmcas://{{[[:xdigit:]]+}} +// CHECK: 2:1 ROOT^src{{/|\\}}Top.h llvmcas://{{[[:xdigit:]]+}} // CHECK: Module Map: // CHECK: Top // CHECK: export * // CHECK: Files: // CHECK-NOT: module.modulemap -// CHECK: /^src/Top.h llvmcas://{{[[:xdigit:]]+}} +// CHECK: ROOT^src{{/|\\}}Top.h llvmcas://{{[[:xdigit:]]+}} // CHECK-NOT: module.modulemap // CHECK-LABEL: MODULE Left // CHECK: llvmcas://{{[[:xdigit:]]+}} // CHECK: 1:1 llvmcas://{{[[:xdigit:]]+}} -// CHECK: 2:1 /^src/Left.h llvmcas://{{[[:xdigit:]]+}} +// CHECK: 2:1 ROOT^src{{/|\\}}Left.h llvmcas://{{[[:xdigit:]]+}} // CHECK: 2:1 (Module) Top // CHECK: Module Map: // CHECK: Left // CHECK: export * // CHECK: Files: // CHECK-NOT: module.modulemap -// CHECK: /^src/Left.h llvmcas://{{[[:xdigit:]]+}} +// CHECK: ROOT^src{{/|\\}}Left.h llvmcas://{{[[:xdigit:]]+}} // CHECK-NOT: module.modulemap -// CHECK: /^src/Top.h llvmcas://{{[[:xdigit:]]+}} +// CHECK: ROOT^src{{/|\\}}Top.h llvmcas://{{[[:xdigit:]]+}} // CHECK-LABEL: MODULE Right // CHECK: llvmcas://{{[[:xdigit:]]+}} // CHECK: 1:1 llvmcas://{{[[:xdigit:]]+}} -// CHECK: 2:1 /^src/Right.h llvmcas://{{[[:xdigit:]]+}} +// CHECK: 2:1 ROOT^src{{/|\\}}Right.h llvmcas://{{[[:xdigit:]]+}} // CHECK: 2:1 (Module) Top // CHECK: Module Map: // CHECK: Right // CHECK: export * // CHECK: Files: // CHECK-NOT: module.modulemap -// CHECK: /^src/Right.h llvmcas://{{[[:xdigit:]]+}} +// CHECK: ROOT^src{{/|\\}}Right.h llvmcas://{{[[:xdigit:]]+}} // CHECK-NOT: module.modulemap -// CHECK: /^src/Top.h llvmcas://{{[[:xdigit:]]+}} +// CHECK: ROOT^src{{/|\\}}Top.h llvmcas://{{[[:xdigit:]]+}} // CHECK-LABEL: TRANSLATION UNIT -// CHECK: /^src/tu.m llvmcas://{{[[:xdigit:]]+}} +// CHECK: ROOT^src{{/|\\}}tu.m llvmcas://{{[[:xdigit:]]+}} // CHECK: 1:1 llvmcas://{{[[:xdigit:]]+}} // CHECK: 2:1 (Module) Left // CHECK: 3:1 (Module) Right @@ -100,9 +101,9 @@ // CHECK-NOT: Module Map // CHECK: Files: // CHECK-NOT: module.modulemap -// CHECK: /^src/Left.h llvmcas://{{[[:xdigit:]]+}} -// CHECK: /^src/Top.h llvmcas://{{[[:xdigit:]]+}} -// CHECK: /^src/Right.h llvmcas://{{[[:xdigit:]]+}} +// CHECK: ROOT^src{{/|\\}}Left.h llvmcas://{{[[:xdigit:]]+}} +// CHECK: ROOT^src{{/|\\}}Top.h llvmcas://{{[[:xdigit:]]+}} +// CHECK: ROOT^src{{/|\\}}Right.h llvmcas://{{[[:xdigit:]]+}} // CHECK-LABEL: System module-includes // CHECK-NEXT: #import "sys.h" @@ -117,14 +118,14 @@ // CHECK: "module-name": "Top" // CHECK: } // CHECK-NEXT: ] -// CHECK: "clang-modulemap-file": "[[PREFIX]]/dir1/module.modulemap" +// CHECK: "clang-modulemap-file": "PREFIX{{/|\\\\}}dir1{{/|\\\\}}module.modulemap" // CHECK: "command-line": [ // CHECK-NEXT: "-cc1" // CHECK: "-fcas-path" -// CHECK-NEXT: "[[PREFIX]]/cas" +// CHECK-NEXT: "PREFIX{{/|\\\\}}cas" // CHECK-NOT: -fmodule-map-file // CHECK: "-o" -// CHECK-NEXT: "[[PREFIX]]/dir1/outputs/{{.*}}/Left-{{.*}}.pcm" +// CHECK-NEXT: "PREFIX{{/|\\\\}}dir1{{/|\\\\}}outputs{{/|\\\\}}{{.*}}{{/|\\\\}}Left-{{.*}}.pcm" // CHECK: "-disable-free" // CHECK: "-fno-pch-timestamp" // CHECK: "-fcas-include-tree" @@ -132,16 +133,16 @@ // CHECK: "-fcache-compile-job" // CHECK: "-emit-module" // CHECK: "-fmodule-file-cache-key" -// CHECK-NEXT: "/^modules/{{.*}}/Top-{{.*}}.pcm" +// CHECK-NEXT: "ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}Top-{{.*}}.pcm" // CHECK-NEXT: "llvmcas://{{[[:xdigit:]]+}}" -// CHECK: "-fmodule-file=Top=/^modules/{{.*}}/Top-{{.*}}.pcm" +// CHECK: "-fmodule-file=Top=ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}Top-{{.*}}.pcm" // CHECK: "-fmodules" // CHECK: "-fmodule-name=Left" // CHECK: "-fno-implicit-modules" // CHECK: ] // CHECK: "file-deps": [ -// CHECK-NEXT: "[[PREFIX]]/dir1/module.modulemap" -// CHECK-NEXT: "[[PREFIX]]/dir1/Left.h" +// CHECK-NEXT: "PREFIX{{/|\\\\}}dir1{{/|\\\\}}module.modulemap" +// CHECK-NEXT: "PREFIX{{/|\\\\}}dir1{{/|\\\\}}Left.h" // CHECK: ] // CHECK: "name": "Left" // CHECK: } @@ -152,14 +153,14 @@ // CHECK: "module-name": "Top" // CHECK: } // CHECK-NEXT: ] -// CHECK: "clang-modulemap-file": "[[PREFIX]]/dir1/module.modulemap" +// CHECK: "clang-modulemap-file": "PREFIX{{/|\\\\}}dir1{{/|\\\\}}module.modulemap" // CHECK: "command-line": [ // CHECK-NEXT: "-cc1" // CHECK: "-fcas-path" -// CHECK-NEXT: "[[PREFIX]]/cas" +// CHECK-NEXT: "PREFIX{{/|\\\\}}cas" // CHECK-NOT: -fmodule-map-file // CHECK: "-o" -// CHECK-NEXT: "[[PREFIX]]/dir1/outputs/{{.*}}/Right-{{.*}}.pcm" +// CHECK-NEXT: "PREFIX{{/|\\\\}}dir1{{/|\\\\}}outputs{{/|\\\\}}{{.*}}{{/|\\\\}}Right-{{.*}}.pcm" // CHECK: "-disable-free" // CHECK: "-fno-pch-timestamp" // CHECK: "-fcas-include-tree" @@ -167,29 +168,29 @@ // CHECK: "-fcache-compile-job" // CHECK: "-emit-module" // CHECK: "-fmodule-file-cache-key -// CHECK-NEXT: "/^modules/{{.*}}/Top-{{.*}}.pcm" +// CHECK-NEXT: "ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}Top-{{.*}}.pcm" // CHECK-NEXT: "llvmcas://{{[[:xdigit:]]+}}" -// CHECK: "-fmodule-file=Top=/^modules/{{.*}}/Top-{{.*}}.pcm" +// CHECK: "-fmodule-file=Top=ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}Top-{{.*}}.pcm" // CHECK: "-fmodules" // CHECK: "-fmodule-name=Right" // CHECK: "-fno-implicit-modules" // CHECK: ] // CHECK: "file-deps": [ -// CHECK-NEXT: "[[PREFIX]]/dir1/module.modulemap" -// CHECK-NEXT: "[[PREFIX]]/dir1/Right.h" +// CHECK-NEXT: "PREFIX{{/|\\\\}}dir1{{/|\\\\}}module.modulemap" +// CHECK-NEXT: "PREFIX{{/|\\\\}}dir1{{/|\\\\}}Right.h" // CHECK-NEXT: ] // CHECK: "name": "Right" // CHECK: } // CHECK-NEXT: { // CHECK: "cas-include-tree-id": "[[SYS_TREE:llvmcas://[[:xdigit:]]+]]" // CHECK: "clang-module-deps": [] -// CHECK: "clang-modulemap-file": "[[PREFIX]]/dir1/System/module.modulemap" +// CHECK: "clang-modulemap-file": "PREFIX{{/|\\\\}}dir1{{/|\\\\}}System{{/|\\\\}}module.modulemap" // CHECK: "command-line": [ // CHECK-NEXT: "-cc1" // CHECK: "-fcas-path" -// CHECK-NEXT: "[[PREFIX]]/cas" +// CHECK-NEXT: "PREFIX{{/|\\\\}}cas" // CHECK: "-o" -// CHECK-NEXT: "[[PREFIX]]/dir1/outputs/{{.*}}/System-{{.*}}.pcm" +// CHECK-NEXT: "PREFIX{{/|\\\\}}dir1{{/|\\\\}}outputs{{/|\\\\}}{{.*}}{{/|\\\\}}System-{{.*}}.pcm" // CHECK: "-disable-free" // CHECK: "-fno-pch-timestamp" // CHECK: "-fcas-include-tree" @@ -201,22 +202,22 @@ // CHECK: "-fno-implicit-modules" // CHECK: ] // CHECK: "file-deps": [ -// CHECK-DAG: "[[PREFIX]]/dir1/System/module.modulemap" -// CHECK-DAG: "[[PREFIX]]/dir1/System/sys.h" -// CHECK-DAG: "{{.*}}/stdbool.h" +// CHECK-DAG: "PREFIX{{/|\\\\}}dir1{{/|\\\\}}System{{/|\\\\}}module.modulemap" +// CHECK-DAG: "PREFIX{{/|\\\\}}dir1{{/|\\\\}}System{{/|\\\\}}sys.h" +// CHECK-DAG: "{{.*}}{{/|\\\\}}stdbool.h" // CHECK: ] // CHECK: "name": "System" // CHECK: } // CHECK-NEXT: { // CHECK: "cas-include-tree-id": "[[TOP_TREE:llvmcas://[[:xdigit:]]+]]" // CHECK: "clang-module-deps": [] -// CHECK: "clang-modulemap-file": "[[PREFIX]]/dir1/module.modulemap" +// CHECK: "clang-modulemap-file": "PREFIX{{/|\\\\}}dir1{{/|\\\\}}module.modulemap" // CHECK: "command-line": [ // CHECK-NEXT: "-cc1" // CHECK: "-fcas-path" -// CHECK-NEXT: "[[PREFIX]]/cas" +// CHECK-NEXT: "PREFIX{{/|\\\\}}cas" // CHECK: "-o" -// CHECK-NEXT: "[[PREFIX]]/dir1/outputs/{{.*}}/Top-{{.*}}.pcm" +// CHECK-NEXT: "PREFIX{{/|\\\\}}dir1{{/|\\\\}}outputs{{/|\\\\}}{{.*}}{{/|\\\\}}Top-{{.*}}.pcm" // CHECK: "-disable-free" // CHECK: "-fno-pch-timestamp" // CHECK: "-fcas-include-tree" @@ -228,8 +229,8 @@ // CHECK: "-fno-implicit-modules" // CHECK: ] // CHECK: "file-deps": [ -// CHECK-NEXT: "[[PREFIX]]/dir1/module.modulemap" -// CHECK-NEXT: "[[PREFIX]]/dir1/Top.h" +// CHECK-NEXT: "PREFIX{{/|\\\\}}dir1{{/|\\\\}}module.modulemap" +// CHECK-NEXT: "PREFIX{{/|\\\\}}dir1{{/|\\\\}}Top.h" // CHECK-NEXT: ] // CHECK: "name": "Top" // CHECK: } @@ -253,7 +254,7 @@ // CHECK: "command-line": [ // CHECK-NEXT: "-cc1" // CHECK: "-fcas-path" -// CHECK-NEXT: "[[PREFIX]]/cas" +// CHECK-NEXT: "PREFIX{{/|\\\\}}cas" // CHECK-NOT: -fmodule-map-file // CHECK: "-disable-free" // CHECK: "-fcas-include-tree" @@ -261,20 +262,20 @@ // CHECK: "-fcache-compile-job" // CHECK: "-fsyntax-only" // CHECK: "-fmodule-file-cache-key" -// CHECK-NEXT: "/^modules/{{.*}}/Left-{{.*}}.pcm" +// CHECK-NEXT: "ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}Left-{{.*}}.pcm" // CHECK-NEXT: "llvmcas://{{[[:xdigit:]]+}}" // CHECK: "-fmodule-file-cache-key" -// CHECK-NEXT: "/^modules/{{.*}}/Right-{{.*}}.pcm" +// CHECK-NEXT: "ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}Right-{{.*}}.pcm" // CHECK-NEXT: "llvmcas://{{[[:xdigit:]]+}}" -// CHECK: "-fmodule-file=Left=/^modules/{{.*}}/Left-{{.*}}.pcm" -// CHECK: "-fmodule-file=Right=/^modules/{{.*}}/Right-{{.*}}.pcm" +// CHECK: "-fmodule-file=Left=ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}Left-{{.*}}.pcm" +// CHECK: "-fmodule-file=Right=ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}Right-{{.*}}.pcm" // CHECK: "-fmodules" // CHECK: "-fno-implicit-modules" // CHECK: ] // CHECK: "file-deps": [ -// CHECK-NEXT: "[[PREFIX]]/dir1/tu.m" +// CHECK-NEXT: "PREFIX{{/|\\\\}}dir1{{/|\\\\}}tu.m" // CHECK-NEXT: ] -// CHECK: "input-file": "[[PREFIX]]/dir1/tu.m" +// CHECK: "input-file": "PREFIX{{/|\\\\}}dir1{{/|\\\\}}tu.m" // CHECK: } // CHECK-NEXT: ] // CHECK-NEXT: } @@ -291,7 +292,8 @@ // Scan in a different directory // RUN: clang-scan-deps -compilation-database %t/cdb2.json \ // RUN: -cas-path %t/cas -module-files-dir %t/dir2/outputs \ -// RUN: -prefix-map=%t/dir2/outputs=/^modules -prefix-map=%t/dir2=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \ +// RUN: -prefix-map=%t/dir2/outputs=%/root^modules -prefix-map=%t/dir2=%/root^src \ +// RUN: -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc \ // RUN: -format experimental-include-tree-full -mode preprocess-dependency-directives -optimize-args=none \ // RUN: > %t/deps2.json diff --git a/clang/test/ClangScanDeps/modules-pch-cas-fs-prefix-mapping-caching.c b/clang/test/ClangScanDeps/modules-pch-cas-fs-prefix-mapping-caching.c index 3341c048b87ee..b68a623fe3774 100644 --- a/clang/test/ClangScanDeps/modules-pch-cas-fs-prefix-mapping-caching.c +++ b/clang/test/ClangScanDeps/modules-pch-cas-fs-prefix-mapping-caching.c @@ -5,62 +5,72 @@ // RUN: rm -rf %t // RUN: split-file %s %t // RUN: cp -r %t/dir1 %t/dir2 -// RUN: sed -e "s|DIR|%t/dir1|g" -e "s|CLANG|%clang|g" -e "s|SDK|%S/Inputs/SDK|g" %t/cdb.json.template > %t/dir1/cdb.json -// RUN: sed -e "s|DIR|%t/dir1|g" -e "s|CLANG|%clang|g" -e "s|SDK|%S/Inputs/SDK|g" %t/cdb_pch.json.template > %t/dir1/cdb_pch.json -// RUN: sed -e "s|DIR|%t/dir2|g" -e "s|CLANG|%clang|g" -e "s|SDK|%S/Inputs/SDK|g" %t/cdb.json.template > %t/dir2/cdb.json -// RUN: sed -e "s|DIR|%t/dir2|g" -e "s|CLANG|%clang|g" -e "s|SDK|%S/Inputs/SDK|g" %t/cdb_pch.json.template > %t/dir2/cdb_pch.json +// RUN: sed -e "s|DIR|%/t/dir1|g" -e "s|CLANG|%/ncclang|g" -e "s|SDK|%/S/Inputs/SDK|g" %t/cdb.json.template > %t/dir1/cdb.json +// RUN: sed -e "s|DIR|%/t/dir1|g" -e "s|CLANG|%/ncclang|g" -e "s|SDK|%/S/Inputs/SDK|g" %t/cdb_pch.json.template > %t/dir1/cdb_pch.json +// RUN: sed -e "s|DIR|%/t/dir2|g" -e "s|CLANG|%/ncclang|g" -e "s|SDK|%/S/Inputs/SDK|g" %t/cdb.json.template > %t/dir2/cdb.json +// RUN: sed -e "s|DIR|%/t/dir2|g" -e "s|CLANG|%/ncclang|g" -e "s|SDK|%/S/Inputs/SDK|g" %t/cdb_pch.json.template > %t/dir2/cdb_pch.json // == Scan PCH // RUN: clang-scan-deps -compilation-database %t/dir1/cdb_pch.json -format experimental-full -optimize-args=none \ // RUN: -cas-path %t/cas -module-files-dir %t/dir1/modules \ -// RUN: -prefix-map=%t/dir1/modules=/^modules -prefix-map=%t/dir1=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \ +// RUN: -prefix-map=%t/dir1/modules=%/root^modules -prefix-map=%t/dir1=%/root^src -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc \ // RUN: > %t/pch_dir1.txt // RUN: clang-scan-deps -compilation-database %t/dir2/cdb_pch.json -format experimental-full -optimize-args=none \ // RUN: -cas-path %t/cas -module-files-dir %t/dir2/modules \ -// RUN: -prefix-map=%t/dir2/modules=/^modules -prefix-map=%t/dir2=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \ +// RUN: -prefix-map=%t/dir2/modules=%/root^modules -prefix-map=%t/dir2=%/root^src -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc \ // RUN: > %t/pch_dir2.txt // == Build PCH // RUN: %deps-to-rsp %t/pch_dir1.txt --module-name=B > %t/dir1/B.cc1.rsp // RUN: %deps-to-rsp %t/pch_dir1.txt --module-name=A > %t/dir1/A.cc1.rsp // RUN: %deps-to-rsp %t/pch_dir1.txt --tu-index 0 > %t/dir1/pch.cc1.rsp -// RUN: (cd %t/dir1; %clang @B.cc1.rsp) 2>&1 | FileCheck %s -check-prefix=CACHE-MISS -// RUN: (cd %t/dir1; %clang @A.cc1.rsp) 2>&1 | FileCheck %s -check-prefix=CACHE-MISS -// RUN: (cd %t/dir1; %clang @pch.cc1.rsp) 2>&1 | FileCheck %s -check-prefix=CACHE-MISS +// RUN: cd %t/dir1 && %clang @B.cc1.rsp > %t/miss-B.txt 2>&1 +// RUN: cat %t/miss-B.txt | FileCheck %s -check-prefix=CACHE-MISS +// RUN: cd %t/dir1 && %clang @A.cc1.rsp > %t/miss-A.txt 2>&1 +// RUN: cat %t/miss-A.txt | FileCheck %s -check-prefix=CACHE-MISS +// RUN: cd %t/dir1 && %clang @pch.cc1.rsp > %t/miss-pch.txt 2>&1 +// RUN: cat %t/miss-pch.txt | FileCheck %s -check-prefix=CACHE-MISS // CACHE-MISS: compile job cache miss // RUN: %deps-to-rsp %t/pch_dir2.txt --module-name=B > %t/dir2/B.cc1.rsp // RUN: %deps-to-rsp %t/pch_dir2.txt --module-name=A > %t/dir2/A.cc1.rsp // RUN: %deps-to-rsp %t/pch_dir2.txt --tu-index 0 > %t/dir2/pch.cc1.rsp -// RUN: (cd %t/dir2; %clang @B.cc1.rsp) 2>&1 | FileCheck %s -check-prefix=CACHE-HIT -// RUN: (cd %t/dir2; %clang @A.cc1.rsp) 2>&1 | FileCheck %s -check-prefix=CACHE-HIT -// RUN: (cd %t/dir2; %clang @pch.cc1.rsp) 2>&1 | FileCheck %s -check-prefix=CACHE-HIT +// RUN: cd %t/dir2 && %clang @B.cc1.rsp > %t/hit-B.txt 2>&1 +// RUN: cat %t/hit-B.txt | FileCheck %s -check-prefix=CACHE-HIT +// RUN: cd %t/dir2 && %clang @A.cc1.rsp > %t/hit-A.txt 2>&1 +// RUN: cat %t/hit-B.txt | FileCheck %s -check-prefix=CACHE-HIT +// RUN: cd %t/dir2 && %clang @pch.cc1.rsp > %t/hit-pch.txt 2>&1 +// RUN: cat %t/hit-pch.txt | FileCheck %s -check-prefix=CACHE-HIT // CACHE-HIT: compile job cache hit // == Scan TU, including PCH // RUN: clang-scan-deps -compilation-database %t/dir1/cdb.json -format experimental-full -optimize-args=none \ // RUN: -cas-path %t/cas -module-files-dir %t/dir1/modules \ -// RUN: -prefix-map=%t/dir1/modules=/^modules -prefix-map=%t/dir1=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \ +// RUN: -prefix-map=%t/dir1/modules=%/root^modules -prefix-map=%t/dir1=%/root^src -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc \ // RUN: > %t/dir1.txt // RUN: clang-scan-deps -compilation-database %t/dir2/cdb.json -format experimental-full -optimize-args=none \ // RUN: -cas-path %t/cas -module-files-dir %t/dir2/modules \ -// RUN: -prefix-map=%t/dir2/modules=/^modules -prefix-map=%t/dir2=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \ +// RUN: -prefix-map=%t/dir2/modules=%/root^modules -prefix-map=%t/dir2=%/root^src -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc \ // RUN: > %t/dir2.txt // == Build TU // RUN: %deps-to-rsp %t/dir1.txt --module-name=C > %t/dir1/C.cc1.rsp // RUN: %deps-to-rsp %t/dir1.txt --tu-index 0 > %t/dir1/tu.cc1.rsp -// RUN: (cd %t/dir1; %clang @C.cc1.rsp) 2>&1 | FileCheck %s -check-prefix=CACHE-MISS -// RUN: (cd %t/dir1; %clang @tu.cc1.rsp) 2>&1 | FileCheck %s -check-prefix=CACHE-MISS +// RUN: cd %t/dir1 && %clang @C.cc1.rsp > %t/c-miss.txt 2>&1 +// RUN: cat %t/c-miss.txt | FileCheck %s -check-prefix=CACHE-MISS +// RUN: cd %t/dir1 && %clang @tu.cc1.rsp > %t/tu-miss.txt 2>&1 +// RUN: cat %t/tu-miss.txt | FileCheck %s -check-prefix=CACHE-MISS // RUN: %deps-to-rsp %t/dir2.txt --module-name=C > %t/dir2/C.cc1.rsp // RUN: %deps-to-rsp %t/dir2.txt --tu-index 0 > %t/dir2/tu.cc1.rsp -// RUN: (cd %t/dir2; %clang @C.cc1.rsp) 2>&1 | FileCheck %s -check-prefix=CACHE-HIT -// RUN: (cd %t/dir2; %clang @tu.cc1.rsp) 2>&1 | FileCheck %s -check-prefix=CACHE-HIT +// RUN: cd %t/dir2 && %clang @C.cc1.rsp > %t/c-hit.txt 2>&1 +// RUN: cat %t/c-hit.txt | FileCheck %s -check-prefix=CACHE-HIT +// RUN: cd %t/dir2 && %clang @tu.cc1.rsp > %t/tu-hit.txt 2>&1 +// RUN: cat %t/tu-hit.txt | FileCheck %s -check-prefix=CACHE-HIT // RUN: diff -u %t/dir1/prefix.h.pch %t/dir2/prefix.h.pch // RUN: diff -r -u %t/dir1/modules %t/dir2/modules diff --git a/clang/test/ClangScanDeps/modules-pch-cas-fs-prefix-mapping.c b/clang/test/ClangScanDeps/modules-pch-cas-fs-prefix-mapping.c index aee657ce58e3d..8dad299143de9 100644 --- a/clang/test/ClangScanDeps/modules-pch-cas-fs-prefix-mapping.c +++ b/clang/test/ClangScanDeps/modules-pch-cas-fs-prefix-mapping.c @@ -5,17 +5,17 @@ // RUN: rm -rf %t // RUN: split-file %s %t -// RUN: sed -e "s|DIR|%t|g" -e "s|CLANG|%clang|g" -e "s|SDK|%S/Inputs/SDK|g" %t/cdb.json.template > %t/cdb.json -// RUN: sed -e "s|DIR|%t|g" -e "s|CLANG|%clang|g" -e "s|SDK|%S/Inputs/SDK|g" %t/cdb_pch.json.template > %t/cdb_pch.json +// RUN: sed -e "s|DIR|%/t|g" -e "s|CLANG|%/ncclang|g" -e "s|SDK|%/S/Inputs/SDK|g" %t/cdb.json.template > %t/cdb.json +// RUN: sed -e "s|DIR|%/t|g" -e "s|CLANG|%/ncclang|g" -e "s|SDK|%/S/Inputs/SDK|g" %t/cdb_pch.json.template > %t/cdb_pch.json // == Scan PCH // RUN: clang-scan-deps -compilation-database %t/cdb_pch.json -format experimental-full \ // RUN: -cas-path %t/cas -module-files-dir %t/modules \ -// RUN: -prefix-map=%t/modules=/^modules -prefix-map=%t=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \ +// RUN: -prefix-map=%t/modules=%/root^modules -prefix-map=%t=%/root^src -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc \ // RUN: > %t/pch_result.txt // == Check specifics of the PCH command-line -// RUN: FileCheck %s -input-file %t/pch_result.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -check-prefix=PCH +// RUN: cat %t/pch_result.txt | %PathSanitizingFileCheck --sanitize PREFIX=%/t --sanitize SDK_PREFIX=%/S/Inputs/SDK --sanitize ROOT^=%/root^ --enable-yaml-compatibility %s -check-prefix=PCH // == Build PCH // RUN: %deps-to-rsp %t/pch_result.txt --module-name=B > %t/B.cc1.rsp @@ -30,11 +30,11 @@ // == Scan TU, including PCH // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full \ // RUN: -cas-path %t/cas -module-files-dir %t/modules \ -// RUN: -prefix-map=%t/modules=/^modules -prefix-map=%t=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \ +// RUN: -prefix-map=%t/modules=%/root^modules -prefix-map=%t=%/root^src -prefix-map-sdk=%/root^sdk -prefix-map-toolchain=%/root^tc \ // RUN: > %t/result.txt // == Check specifics of the TU command-line -// RUN: FileCheck %s -input-file %t/result.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK +// RUN: cat %t/result.txt | %PathSanitizingFileCheck --sanitize PREFIX=%/t --sanitize SDK_PREFIX=%/S/Inputs/SDK --sanitize ROOT^=%/root^ --enable-yaml-compatibility %s // == Build TU // RUN: %deps-to-rsp %t/result.txt --module-name=C > %t/C.cc1.rsp @@ -55,20 +55,20 @@ // RUN: llvm-cas -cas %t/cas -ls-tree-recursive @%t/pch_id.txt > %t/pch_fs.txt // RUN: llvm-cas -cas %t/cas -ls-tree-recursive @%t/tu_id.txt > %t/tu_fs.txt -// RUN: FileCheck %s -input-file %t/A_fs.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -check-prefixes=FS_NEG,FS -// RUN: FileCheck %s -input-file %t/B_fs.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -check-prefixes=FS_NEG,FS -// RUN: FileCheck %s -input-file %t/C_fs.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -check-prefixes=FS_NEG,FS -// RUN: FileCheck %s -input-file %t/pch_fs.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -check-prefixes=FS_NEG,FS -// RUN: FileCheck %s -input-file %t/tu_fs.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -check-prefixes=FS_NEG,FS +// RUN: FileCheck %s -input-file %t/A_fs.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -DROOT=%{/roott} -check-prefixes=FS_NEG,FS +// RUN: FileCheck %s -input-file %t/B_fs.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -DROOT=%{/roott} -check-prefixes=FS_NEG,FS +// RUN: FileCheck %s -input-file %t/C_fs.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -DROOT=%{/roott} -check-prefixes=FS_NEG,FS +// RUN: FileCheck %s -input-file %t/pch_fs.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -DROOT=%{/roott} -check-prefixes=FS_NEG,FS +// RUN: FileCheck %s -input-file %t/tu_fs.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK -DROOT=%{/roott} -check-prefixes=FS_NEG,FS // FS_NEG-NOT: [[PREFIX]] // FS_NEG-NOT: [[SDK_PREFIX]] // FS_NEG-NOT: .pcm{{$}} -// FS: file llvmcas://{{.*}} /^sdk/usr/include/stdlib.h -// FS: file llvmcas://{{.*}} /^src/a.h -// FS: file llvmcas://{{.*}} /^src/b.h -// FS: file llvmcas://{{.*}} /^src/module.modulemap -// FS: file llvmcas://{{.*}} /^tc/lib/clang/{{.*}}/include/stdarg.h +// FS: file llvmcas://{{.*}} [[ROOT]]^sdk/usr/include/stdlib.h +// FS: file llvmcas://{{.*}} [[ROOT]]^src/a.h +// FS: file llvmcas://{{.*}} [[ROOT]]^src/b.h +// FS: file llvmcas://{{.*}} [[ROOT]]^src/module.modulemap +// FS: file llvmcas://{{.*}} [[ROOT]]^tc/lib/clang/{{.*}}/include/stdarg.h // Check that it builds. // RUN: %clang @%t/B.cc1.rsp @@ -84,71 +84,71 @@ // PCH: "module-name": "B" // PCH: } // PCH: ] -// PCH: "clang-modulemap-file": "[[PREFIX]]/module.modulemap" +// PCH: "clang-modulemap-file": "PREFIX{{/|\\\\}}module.modulemap" // PCH: "command-line": [ // PCH: "-fcas-path" -// PCH: "[[PREFIX]]/cas" +// PCH: "PREFIX{{/|\\\\}}cas" // PCH: "-fcas-fs" // PCH: "[[A_ROOT_ID]]" // PCH: "-fcas-fs-working-directory" -// PCH: "/^src" -// PCH: "-fmodule-map-file=/^src/module.modulemap" +// PCH: "ROOT^src" +// PCH: "-fmodule-map-file=ROOT^src{{/|\\\\}}module.modulemap" // PCH: "-o" -// PCH: "[[PREFIX]]/modules/{{.*}}/A-{{.*}}.pcm" +// PCH: "PREFIX{{/|\\\\}}modules{{/|\\\\}}{{.*}}{{/|\\\\}}A-{{.*}}.pcm" // PCH: "-fmodule-file-cache-key" -// PCH: "/^modules/{{.*}}/B-[[B_CONTEXT_HASH:[^.]+]].pcm" +// PCH: "ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}B-[[B_CONTEXT_HASH:[^.]+]].pcm" // PCH: "llvmcas://{{.*}}" // PCH: "-x" // PCH: "c" -// PCH: "/^src/module.modulemap" +// PCH: "ROOT^src{{/|\\\\}}module.modulemap" // PCH: "-isysroot" -// PCH: "/^sdk" +// PCH: "ROOT^sdk" // PCH: "-resource-dir" -// PCH: "/^tc/lib/clang/{{.*}}" -// PCH: "-fmodule-file=B=/^modules/{{.*}}/B-[[B_CONTEXT_HASH]].pcm" +// PCH: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}" +// PCH: "-fmodule-file=B=ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}B-[[B_CONTEXT_HASH]].pcm" // PCH: "-isystem" -// PCH: "/^tc/lib/clang/{{.*}}/include" +// PCH: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}{{/|\\\\}}include" // PCH: "-internal-externc-isystem" -// PCH: "/^sdk/usr/include" +// PCH: "ROOT^sdk{{/|\\\\}}usr{{/|\\\\}}include" // PCH: ] // PCH: "file-deps": [ -// PCH: "[[PREFIX]]/module.modulemap" -// PCH: "[[PREFIX]]/a.h" +// PCH: "PREFIX{{/|\\\\}}module.modulemap" +// PCH: "PREFIX{{/|\\\\}}a.h" // PCH: ] // PCH: "name": "A" // PCH: } // PCH: { // PCH: "casfs-root-id": "[[B_ROOT_ID:llvmcas://[[:xdigit:]]+]]" // PCH: "clang-module-deps": [], -// PCH: "clang-modulemap-file": "[[PREFIX]]/module.modulemap" +// PCH: "clang-modulemap-file": "PREFIX{{/|\\\\}}module.modulemap" // PCH: "command-line": [ // PCH: "-fcas-path" -// PCH: "[[PREFIX]]/cas" +// PCH: "PREFIX{{/|\\\\}}cas" // PCH: "-fcas-fs" // PCH: "[[B_ROOT_ID]]" // PCH: "-fcas-fs-working-directory" -// PCH: "/^src" +// PCH: "ROOT^src" // PCH: "-o" -// PCH: "[[PREFIX]]/modules/{{.*}}/B-[[B_CONTEXT_HASH]].pcm" +// PCH: "PREFIX{{/|\\\\}}modules{{/|\\\\}}{{.*}}{{/|\\\\}}B-[[B_CONTEXT_HASH]].pcm" // PCH: "-x" // PCH: "c" -// PCH: "/^src/module.modulemap" +// PCH: "ROOT^src{{/|\\\\}}module.modulemap" // PCH: "-isysroot" -// PCH: "/^sdk" +// PCH: "ROOT^sdk" // PCH: "-resource-dir" -// PCH: "/^tc/lib/clang/{{.*}}" +// PCH: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}" // PCH: "-isystem" -// PCH: "/^tc/lib/clang/{{.*}}/include" +// PCH: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}{{/|\\\\}}include" // PCH: "-internal-externc-isystem" -// PCH: "/^sdk/usr/include" +// PCH: "ROOT^sdk{{/|\\\\}}usr{{/|\\\\}}include" // PCH: ] // PCH: "context-hash": "[[B_CONTEXT_HASH]]" // PCH: "file-deps": [ // Note: PREFIX, SDK_PREFIX and toolchain path are unordered -// PCH-DAG: "[[PREFIX]]/module.modulemap" -// PCH-DAG: "[[PREFIX]]/b.h" -// PCH-DAG: "[[SDK_PREFIX]]/usr/include/stdlib.h" -// PCH-DAG: "{{.*}}/include/stdarg.h" +// PCH-DAG: "PREFIX{{/|\\\\}}module.modulemap" +// PCH-DAG: "PREFIX{{/|\\\\}}b.h" +// PCH-DAG: "SDK_PREFIX{{/|\\\\}}usr{{/|\\\\}}include{{/|\\\\}}stdlib.h" +// PCH-DAG: "{{.*}}{{/|\\\\}}include{{/|\\\\}}stdarg.h" // PCH: ] // PCH: "name": "B" // PCH: } @@ -165,32 +165,32 @@ // PCH: ] // PCH: "command-line": [ // PCH: "-fcas-path" -// PCH: "[[PREFIX]]/cas" +// PCH: "PREFIX{{/|\\\\}}cas" // PCH: "-fcas-fs" // PCH: "[[TU_ROOT_ID]]" // PCH: "-fcas-fs-working-directory" -// PCH: "/^src" -// PCH: "-fmodule-map-file=/^src/module.modulemap" +// PCH: "ROOT^src" +// PCH: "-fmodule-map-file=ROOT^src{{/|\\\\}}module.modulemap" // PCH: "-fmodule-file-cache-key" -// PCH: "/^modules/{{.*}}A-{{.*}}.pcm" +// PCH: "ROOT^modules{{/|\\\\}}{{.*}}A-{{.*}}.pcm" // PCH: "llvmcas://{{.*}}" // PCH: "-x" // PCH: "c-header" -// PCH: "/^src/prefix.h" +// PCH: "ROOT^src{{/|\\\\}}prefix.h" // PCH: "-isysroot" -// PCH: "/^sdk" +// PCH: "ROOT^sdk" // PCH: "-resource-dir" -// PCH: "/^tc/lib/clang/{{.*}}" -// PCH: "-fmodule-file=A=/^modules/{{.*}}/A-{{.*}}.pcm" +// PCH: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}" +// PCH: "-fmodule-file=A=ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}A-{{.*}}.pcm" // PCH: "-isystem" -// PCH: "/^tc/lib/clang/{{.*}}/include" +// PCH: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}{{/|\\\\}}include" // PCH: "-internal-externc-isystem" -// PCH: "/^sdk/usr/include" +// PCH: "ROOT^sdk{{/|\\\\}}usr{{/|\\\\}}include" // PCH: ], // PCH: "file-deps": [ -// PCH: "[[PREFIX]]/prefix.h" +// PCH: "PREFIX{{/|\\\\}}prefix.h" // PCH: ] -// PCH: "input-file": "[[PREFIX]]/prefix.h" +// PCH: "input-file": "PREFIX{{/|\\\\}}prefix.h" // PCH: } // CHECK: { @@ -201,26 +201,26 @@ // CHECK: "command-line": [ // CHECK-NEXT: "-cc1" // CHECK: "-fcas-path" -// CHECK-NEXT: "[[PREFIX]]{{.}}cas" +// CHECK-NEXT: "PREFIX{{.}}cas" // CHECK: "-fcas-fs" // CHECK-NEXT: "[[C_ROOT_ID]]" // CHECK: "-fcas-fs-working-directory" -// CHECK-NEXT: "/^src" +// CHECK-NEXT: "ROOT^src" // CHECK: "-fcache-compile-job" // CHECK: "-emit-module" -// CHECK: "-fmodule-file=/^modules/{{.*}}/B-{{.*}}.pcm" +// CHECK: "-fmodule-file=ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}B-{{.*}}.pcm" // CHECK: "-fmodule-file-cache-key" -// CHECK: "/^modules/{{.*}}/B-{{.*}}.pcm" +// CHECK: "ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}B-{{.*}}.pcm" // CHECK: "llvmcas://{{.*}}" // CHECK: "-x" // CHECK-NEXT: "c" -// CHECK-NEXT: "/^src/module.modulemap" +// CHECK-NEXT: "ROOT^src{{/|\\\\}}module.modulemap" // CHECK: "-isysroot" -// CHECK-NEXT: "/^sdk" +// CHECK-NEXT: "ROOT^sdk" // CHECK: "-resource-dir" -// CHECK-NEXT: "/^tc/lib/clang/{{.*}}" -// CHECK-NOT: [[PREFIX]] -// CHECK-NOT: [[SDK_PREFIX]] +// CHECK-NEXT: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}" +// CHECK-NOT: PREFIX +// CHECK-NOT: SDK_PREFIX // CHECK: ] // CHECK: "name": "C" // CHECK: } @@ -237,37 +237,37 @@ // CHECK: ] // CHECK: "command-line": [ // CHECK: "-fcas-path" -// CHECK-NEXT: "[[PREFIX]]/cas" +// CHECK-NEXT: "PREFIX{{/|\\\\}}cas" // CHECK: "-fcas-fs" // CHECK-NEXT: "[[TU_ROOT_ID]]" // CHECK: "-fcas-fs-working-directory" -// CHECK-NEXT: "/^src" -// CHECK: "-fmodule-map-file=/^src/module.modulemap" +// CHECK-NEXT: "ROOT^src" +// CHECK: "-fmodule-map-file=ROOT^src{{/|\\\\}}module.modulemap" // CHECK: "-fmodule-file-cache-key" -// CHECK: "/^modules/{{.*}}C-{{.*}}.pcm" +// CHECK: "ROOT^modules{{/|\\\\}}{{.*}}C-{{.*}}.pcm" // CHECK: "llvmcas://{{.*}}" // CHECK: "-x" // CHECK-NEXT: "c" -// CHECK-NEXT: "/^src/t.c" +// CHECK-NEXT: "ROOT^src{{/|\\\\}}t.c" // CHECK: "-isysroot" -// CHECK-NEXT: "/^sdk" +// CHECK-NEXT: "ROOT^sdk" // CHECK: "-resource-dir" -// CHECK-NEXT: "/^tc/lib/clang/{{.*}}" -// CHECK: "-fmodule-file=C=/^modules/{{.*}}/C-{{.*}}.pcm" +// CHECK-NEXT: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}" +// CHECK: "-fmodule-file=C=ROOT^modules{{/|\\\\}}{{.*}}{{/|\\\\}}C-{{.*}}.pcm" // CHECK: "-isystem" -// CHECK-NEXT: "/^sdk/usr/local/include" +// CHECK-NEXT: "ROOT^sdk{{/|\\\\}}usr{{/|\\\\}}local{{/|\\\\}}include" // CHECK: "-isystem" -// CHECK-NEXT: "/^tc/lib/clang/{{.*}}/include" +// CHECK-NEXT: "ROOT^tc{{/|\\\\}}lib{{/|\\\\}}clang{{/|\\\\}}{{.*}}{{/|\\\\}}include" // CHECK: "-internal-externc-isystem" -// CHECK-NEXT: "/^sdk/usr/include" +// CHECK-NEXT: "ROOT^sdk{{/|\\\\}}usr{{/|\\\\}}include" // CHECK: "-include-pch" -// CHECK-NEXT: "/^src/prefix.h.pch" +// CHECK-NEXT: "ROOT^src{{/|\\\\}}prefix.h.pch" // CHECK: ], // CHECK: "file-deps": [ -// CHECK: "[[PREFIX]]/t.c" -// CHECK: "[[PREFIX]]/prefix.h.pch" +// CHECK: "PREFIX{{/|\\\\}}t.c" +// CHECK: "PREFIX{{/|\\\\}}prefix.h.pch" // CHECK: ] -// CHECK: "input-file": "[[PREFIX]]/t.c" +// CHECK: "input-file": "PREFIX{{/|\\\\}}t.c" // CHECK: } //--- cdb.json.template diff --git a/clang/utils/PathSanitizingFileCheck b/clang/utils/PathSanitizingFileCheck index eaf8a67a18c06..cb717299a3a5c 100644 --- a/clang/utils/PathSanitizingFileCheck +++ b/clang/utils/PathSanitizingFileCheck @@ -70,7 +70,9 @@ constants.""") if args.enable_windows_compatibility: if args.enable_yaml_compatibility: - slashes_re = r'(/|\\\\|\\\\\\\\)' + # Put the double escaped backslahes before the single + # escaped to ensure longest match + slashes_re = r'(/|\\\\\\\\|\\\\)' else: slashes_re = r'(/|\\\\)' else: diff --git a/llvm/include/llvm/CAS/TreePath.h b/llvm/include/llvm/CAS/TreePath.h new file mode 100644 index 0000000000000..054f0e94fb72c --- /dev/null +++ b/llvm/include/llvm/CAS/TreePath.h @@ -0,0 +1,45 @@ +//===- llvm/CAS/TreePath.h - Tree path utility ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CAS_TREEPATH_H +#define LLVM_CAS_TREEPATH_H + +#include "llvm/ADT/StringRef.h" +#include "llvm/Support/Path.h" +#include + +namespace llvm::cas { + +// On Windows, prepend a dummy root backslash to tree paths internally +// (\C:\foo) and distinguish them from normal file paths (C:\foo) that +// come from and return to clients and are passed to sys::fs +// functions. This is so that we can have a single root and CAS ID +// representing the root of the filesystem (that may otherwise spread +// across multiple trees / drives) and the path handling to be more +// uniform with the Posix systems. These convert paths between them. +// TODO: Reassess this way of handling multiple roots for Windows later. +inline std::string getTreePath(StringRef FilePath, sys::path::Style PathStyle) { + if (sys::path::is_style_windows(PathStyle)) { + assert(FilePath[0] != '\\'); + std::string TreePath = "\\" + std::string(FilePath); + return TreePath; + } + return FilePath.str(); +} + +inline StringRef getFilePath(StringRef TreePath, sys::path::Style PathStyle) { + if (sys::path::is_style_windows(PathStyle)) { + assert(TreePath[0] == '\\'); + return TreePath.drop_front(1); + } + return TreePath; +} + +} // namespace llvm::cas + +#endif // LLVM_CAS_TREEPATH_H diff --git a/llvm/include/llvm/Support/PrefixMapper.h b/llvm/include/llvm/Support/PrefixMapper.h index 69782e4e35ea4..8c483c5694892 100644 --- a/llvm/include/llvm/Support/PrefixMapper.h +++ b/llvm/include/llvm/Support/PrefixMapper.h @@ -170,8 +170,8 @@ class TreePathPrefixMapper : public PrefixMapper { /// Find the tree path for \p Path, getting the real path for its parent /// directory but not following symlinks in \a sys::path::filename(). /// - /// \returns The tree path, or the original path if there are any errors. - StringRef getTreePath(StringRef Path); + /// \returns The tree path, or none if there are any errors. + std::optional getTreePath(StringRef Path); public: void add(const MappedPrefix &Mapping) override; diff --git a/llvm/lib/CAS/CachingOnDiskFileSystem.cpp b/llvm/lib/CAS/CachingOnDiskFileSystem.cpp index 9c2ce9325a64a..3b9c6089fcbb3 100644 --- a/llvm/lib/CAS/CachingOnDiskFileSystem.cpp +++ b/llvm/lib/CAS/CachingOnDiskFileSystem.cpp @@ -12,6 +12,7 @@ #include "llvm/CAS/FileSystemCache.h" #include "llvm/CAS/HierarchicalTreeBuilder.h" #include "llvm/CAS/ObjectStore.h" +#include "llvm/CAS/TreePath.h" #include "llvm/Config/config.h" #include "llvm/Support/FileSystem.h" #include @@ -24,31 +25,6 @@ void CachingOnDiskFileSystem::anchor() {} namespace { -// On Windows, prepend a dummy root backslash to tree paths internally -// (\C:\foo) and distinguish them from normal file paths (C:\foo) that -// come from and return to clients and are passed to sys::fs -// functions. This is so that we can have a single root and CAS ID -// representing the root of the filesystem (that may otherwise spread -// across multiple trees / drives) and the path handling to be more -// uniform with the Posix systems. These convert paths between them. -// TODO: Reassess this way of handling multiple roots for Windows later. -static std::string getTreePath(StringRef FilePath, sys::path::Style PathStyle) { - if (sys::path::is_style_windows(PathStyle)) { - assert(FilePath[0] != '\\'); - std::string TreePath = "\\" + std::string(FilePath); - return TreePath; - } - return FilePath.str(); -} - -static StringRef getFilePath(StringRef TreePath, sys::path::Style PathStyle) { - if (sys::path::is_style_windows(PathStyle)) { - assert(TreePath[0] == '\\'); - return TreePath.drop_front(1); - } - return TreePath; -} - class CachingOnDiskFileSystemImpl final : public CachingOnDiskFileSystem { struct WorkingDirectoryType { FileSystemCache::DirectoryEntry *Entry; @@ -338,7 +314,8 @@ CachingOnDiskFileSystemImpl::makeSymlink(DirectoryEntry &Parent, PathStorage TreePathStorage(TreePath); SmallString<128> Target; if (auto Err = readLink( - getFilePath(TreePathStorage.Path, Cache->getPathStyle()), Target)) + llvm::cas::getFilePath(TreePathStorage.Path, Cache->getPathStyle()), + Target)) return std::move(Err); return makeSymlinkTo(Parent, TreePathStorage.Path, Target); } @@ -364,7 +341,7 @@ static bool is_executable(StringRef TreePath, sys::fs::file_status Status, // This isn't the most reliable way but does better than just // checking owner_exe because most owned files have all_all // permission regardless of they are executable files. - StringRef FilePath = getFilePath(TreePath, PathStyle); + StringRef FilePath = llvm::cas::getFilePath(TreePath, PathStyle); return (Status.permissions() & sys::fs::perms::owner_exe) && (FilePath.ends_with_insensitive(".exe") || sys::fs::exists(FilePath + ".exe")); @@ -396,7 +373,8 @@ CachingOnDiskFileSystemImpl::makeEntry( std::optional KnownStatus) { assert(Parent.isDirectory() && "Expected a directory"); PathStorage TreePathStorage(TreePath); - StringRef FilePath = getFilePath(TreePathStorage.Path, Cache->getPathStyle()); + StringRef FilePath = llvm::cas::getFilePath(TreePathStorage.Path, + Cache->getPathStyle()); // lstat is extremely slow... sys::fs::file_status Status; @@ -467,7 +445,7 @@ CachingOnDiskFileSystemImpl::getRealPath(const Twine &Path, getDirectoryEntry(Path, /*FollowSymlinks=*/true).moveInto(Entry)) return errorToErrorCode(std::move(E)); - StringRef RealFilePath = getFilePath(Entry->getTreePath(), + StringRef RealFilePath = llvm::cas::getFilePath(Entry->getTreePath(), Cache->getPathStyle()); Output.resize(RealFilePath.size()); llvm::copy(RealFilePath, Output.begin()); @@ -525,11 +503,12 @@ CachingOnDiskFileSystemImpl::getDirectoryIterator(const Twine &Path) { // Walk the directory on-disk to discover entries. std::error_code EC; SmallVector TreePaths; - StringRef EntryFilePath = getFilePath(Entry->getTreePath(), + StringRef EntryFilePath = llvm::cas::getFilePath(Entry->getTreePath(), Cache->getPathStyle()); for (sys::fs::directory_iterator I(EntryFilePath, EC), E; !EC && I != E; I.increment(EC)) { - TreePaths.emplace_back(getTreePath(I->path(), Cache->getPathStyle())); + TreePaths.emplace_back(llvm::cas::getTreePath(I->path(), + Cache->getPathStyle())); } if (EC) return EC; @@ -565,8 +544,8 @@ CachingOnDiskFileSystemImpl::preloadRealPath(DirectoryEntry &From, SmallString<256> ExpectedRealTreePath; ExpectedRealTreePath = From.getTreePath(); sys::path::append(ExpectedRealTreePath, RemainingStorage.Path); - SmallString<256> ExpectedRealPath = getFilePath(ExpectedRealTreePath.str(), - Cache->getPathStyle()); + SmallString<256> ExpectedRealPath = llvm::cas::getFilePath( + ExpectedRealTreePath.str(), Cache->getPathStyle()); // Most paths don't exist. Start with a stat. Profiling says this is faster // on Darwin when running clang-scan-deps (looks like allocation traffic in @@ -588,7 +567,7 @@ CachingOnDiskFileSystemImpl::preloadRealPath(DirectoryEntry &From, /* expand_tilde */false)) return errorCodeToError(EC); - SmallString<256> RealTreePath = StringRef(getTreePath(RealPath, + SmallString<256> RealTreePath = StringRef(llvm::cas::getTreePath(RealPath, Cache->getPathStyle())); FileSystemCache::LookupPathState State(Cache->getPathStyle(), Cache->getRoot(get_separator(Cache->getPathStyle())), RealTreePath); @@ -803,7 +782,7 @@ DiscoveryInstanceImpl::requestDirectoryEntry(DirectoryEntry &Parent, assert(Parent.isDirectory() && "Expected a directory"); SmallString<256> Path(Parent.getTreePath()); sys::path::append(Path, Name); - StringRef FilePath = getFilePath(Path.str(), FS.getPathStyle()); + StringRef FilePath = llvm::cas::getFilePath(Path.str(), FS.getPathStyle()); // lstat is extremely slow... sys::fs::file_status Status; @@ -832,7 +811,7 @@ DiscoveryInstanceImpl::requestDirectoryEntry(DirectoryEntry &Parent, if (Name.equals_insensitive(NextName) || !isASCII(Name)) { // Might be a case-insensitive match, check if it's the same entity. // FIXME: put this unique id in the cache. - StringRef NextFilePath = getFilePath(Next->getTreePath(), + StringRef NextFilePath = llvm::cas::getFilePath(Next->getTreePath(), FS.getPathStyle()); sys::fs::file_status StatNext; if (std::error_code EC = diff --git a/llvm/lib/Support/PrefixMapper.cpp b/llvm/lib/Support/PrefixMapper.cpp index 7105301e539a3..2f06e1512c7cc 100644 --- a/llvm/lib/Support/PrefixMapper.cpp +++ b/llvm/lib/Support/PrefixMapper.cpp @@ -9,6 +9,8 @@ #include "llvm/Support/PrefixMapper.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/StringMap.h" +#include "llvm/CAS/TreePath.h" #include "llvm/Support/StringSaver.h" #include "llvm/Support/VirtualFileSystem.h" @@ -102,6 +104,30 @@ static bool startsWith(StringRef Path, StringRef Prefix, return true; } +static bool equals(StringRef Prefix1, StringRef Prefix2, + sys::path::Style PathStyle) { + if (PathStyle == sys::path::Style::posix || + (PathStyle == sys::path::Style::native && + sys::path::is_style_posix(sys::path::Style::native))) + return Prefix1 == Prefix2; + + if (Prefix1.size() != Prefix2.size()) + return false; + + // Windows prefix matching : case and separator insensitive + for (size_t I = 0, E = Prefix1.size(); I != E; ++I) { + bool Sep1 = sys::path::is_separator(Prefix1[I], PathStyle); + bool Sep2 = sys::path::is_separator(Prefix2[I], PathStyle); + if (Sep1 != Sep2) + return false; + if (Sep1) + continue; + if (toLower(Prefix1[I]) != toLower(Prefix2[I])) + return false; + } + return true; +} + std::optional PrefixMapper::mapImpl(StringRef Path, SmallVectorImpl &Storage) { for (const MappedPrefix &Map : Mappings) { @@ -189,22 +215,24 @@ TreePathPrefixMapper::~TreePathPrefixMapper() = default; std::optional TreePathPrefixMapper::mapImpl(StringRef Path, SmallVectorImpl &Storage) { - StringRef TreePath = getTreePath(Path); - std::optional Mapped = PrefixMapper::mapImpl(TreePath, Storage); + std::optional TreePath = getTreePath(Path); + StringRef FilePath = TreePath ? + llvm::cas::getFilePath(TreePath.value(), getPathStyle()) : Path; + std::optional Mapped = PrefixMapper::mapImpl(FilePath, Storage); if (Mapped) return *Mapped; - if (TreePath != Path) - return TreePath; + if (FilePath != Path) + return FilePath; return std::nullopt; } -StringRef TreePathPrefixMapper::getTreePath(StringRef Path) { +std::optional TreePathPrefixMapper::getTreePath(StringRef Path) { if (Path.empty()) - return Path; + return std::nullopt; auto Entry = FS->getDirectoryEntry(Path, /*FollowSymlinks=*/false); if (!Entry) { consumeError(Entry.takeError()); - return Path; + return std::nullopt; } return (*Entry)->getTreePath(); } @@ -214,10 +242,12 @@ void TreePathPrefixMapper::add(const MappedPrefix &Mapping) { // only affect the behaviour when later mapping a path that cannot be // canonicalized, since a non-canonical prefix cannot match a canonical path. PrefixMapper::add(Mapping); - StringRef Old = getTreePath(Mapping.Old); + std::optional OldTreePath = getTreePath(Mapping.Old); + if (!OldTreePath) return; + StringRef Old = llvm::cas::getFilePath(OldTreePath.value(), getPathStyle()); StringRef New = Mapping.New; // Add the canonical prefix mapping, if different. - if (Old != Mapping.Old) + if (!equals(Old, Mapping.Old, getPathStyle())) PrefixMapper::add(MappedPrefix{Old, New}); } @@ -225,6 +255,13 @@ StringRef TreePathPrefixMapper::mapDirEntry(const vfs::CachedDirectoryEntry &Entry, SmallVectorImpl &Storage) { StringRef TreePath = Entry.getTreePath(); - std::optional Mapped = PrefixMapper::mapImpl(TreePath, Storage); - return Mapped ? *Mapped : TreePath; + StringRef FilePath = llvm::cas::getFilePath(TreePath, getPathStyle()); + std::optional Mapped = PrefixMapper::mapImpl(FilePath, Storage); + if (Mapped) { + std::string MappedTreePath = + llvm::cas::getTreePath(*Mapped, getPathStyle()); + Storage.assign(MappedTreePath.begin(), MappedTreePath.end()); + return StringRef(Storage.begin(), Storage.size()); + } + return TreePath; } diff --git a/llvm/unittests/CAS/CachingOnDiskFileSystemTest.cpp b/llvm/unittests/CAS/CachingOnDiskFileSystemTest.cpp index b6f0d0469eb8b..bb10ad25e3742 100644 --- a/llvm/unittests/CAS/CachingOnDiskFileSystemTest.cpp +++ b/llvm/unittests/CAS/CachingOnDiskFileSystemTest.cpp @@ -402,6 +402,15 @@ TEST(CachingOnDiskFileSystemTest, TrackNewAccesses) { ASSERT_THAT_ERROR(Schema.load(Tree->getRef()).moveInto(TreeNode), Succeeded()); +#ifdef _WIN32 + ASSERT_NE(TreeNode, std::nullopt); + EXPECT_EQ(TreeNode->size(), 1u); + auto DriveNode = TreeNode->lookup(sys::path::root_name(TestDirectory.path())); + ASSERT_TRUE(DriveNode); + ASSERT_THAT_ERROR(Schema.load(DriveNode->getRef()).moveInto(TreeNode), + Succeeded()); +#endif + // Check that all the files are found. EXPECT_EQ(Files.size(), TreeNode->size()); for (const auto &F : Files) @@ -451,6 +460,14 @@ TEST(CachingOnDiskFileSystemTest, TrackNewAccessesStack) { std::optional TreeNode; ASSERT_THAT_ERROR(Schema.load(Tree->getRef()).moveInto(TreeNode), Succeeded()); +#ifdef _WIN32 + ASSERT_NE(TreeNode, std::nullopt); + EXPECT_EQ(TreeNode->size(), 1u); + auto DriveNode = TreeNode->lookup(sys::path::root_name(TestDirectory.path())); + ASSERT_TRUE(DriveNode); + ASSERT_THAT_ERROR(Schema.load(DriveNode->getRef()).moveInto(TreeNode), + Succeeded()); +#endif ASSERT_EQ(TreeNode->size(), 2u); EXPECT_TRUE(TreeNode->lookup(sys::path::filename(Temps[2].path()))); EXPECT_TRUE(TreeNode->lookup(sys::path::filename(Temps[3].path()))); @@ -472,6 +489,14 @@ TEST(CachingOnDiskFileSystemTest, TrackNewAccessesStack) { std::optional TreeNode; ASSERT_THAT_ERROR(Schema.load(Tree->getRef()).moveInto(TreeNode), Succeeded()); +#ifdef _WIN32 + ASSERT_NE(TreeNode, std::nullopt); + EXPECT_EQ(TreeNode->size(), 1u); + auto DriveNode = TreeNode->lookup(sys::path::root_name(TestDirectory.path())); + ASSERT_TRUE(DriveNode); + ASSERT_THAT_ERROR(Schema.load(DriveNode->getRef()).moveInto(TreeNode), + Succeeded()); +#endif ASSERT_EQ(TreeNode->size(), 2u); EXPECT_TRUE(TreeNode->lookup(sys::path::filename(Temps[0].path()))); EXPECT_TRUE(TreeNode->lookup(sys::path::filename(Temps[1].path()))); @@ -534,6 +559,14 @@ TEST(CachingOnDiskFileSystemTest, TrackNewAccessesExists) { std::optional TreeNode; ASSERT_THAT_ERROR(Schema.load(Tree->getRef()).moveInto(TreeNode), Succeeded()); +#ifdef _WIN32 + ASSERT_NE(TreeNode, std::nullopt); + EXPECT_EQ(TreeNode->size(), 1u); + auto DriveNode = TreeNode->lookup(sys::path::root_name(TestDirectory.path())); + ASSERT_TRUE(DriveNode); + ASSERT_THAT_ERROR(Schema.load(DriveNode->getRef()).moveInto(TreeNode), + Succeeded()); +#endif auto Node0 = TreeNode->lookup(sys::path::filename(Temps[0].path())); auto Node1 = TreeNode->lookup(sys::path::filename(Temps[1].path())); ASSERT_TRUE(Node0); @@ -558,6 +591,14 @@ TEST(CachingOnDiskFileSystemTest, TrackNewAccessesExists) { std::optional TreeNode; ASSERT_THAT_ERROR(Schema.load(Tree->getRef()).moveInto(TreeNode), Succeeded()); +#ifdef _WIN32 + ASSERT_NE(TreeNode, std::nullopt); + EXPECT_EQ(TreeNode->size(), 1u); + auto DriveNode = TreeNode->lookup(sys::path::root_name(TestDirectory.path())); + ASSERT_TRUE(DriveNode); + ASSERT_THAT_ERROR(Schema.load(DriveNode->getRef()).moveInto(TreeNode), + Succeeded()); +#endif auto Node0 = TreeNode->lookup(sys::path::filename(Temps[0].path())); auto Node1 = TreeNode->lookup(sys::path::filename(Temps[1].path())); ASSERT_TRUE(Node0); @@ -582,6 +623,14 @@ TEST(CachingOnDiskFileSystemTest, TrackNewAccessesExists) { std::optional TreeNode; ASSERT_THAT_ERROR(Schema.load(Tree->getRef()).moveInto(TreeNode), Succeeded()); +#ifdef _WIN32 + ASSERT_NE(TreeNode, std::nullopt); + EXPECT_EQ(TreeNode->size(), 1u); + auto DriveNode = TreeNode->lookup(sys::path::root_name(TestDirectory.path())); + ASSERT_TRUE(DriveNode); + ASSERT_THAT_ERROR(Schema.load(DriveNode->getRef()).moveInto(TreeNode), + Succeeded()); +#endif auto Node0 = TreeNode->lookup(sys::path::filename(Temps[0].path())); auto Node1 = TreeNode->lookup(sys::path::filename(Temps[1].path())); ASSERT_TRUE(Node0); @@ -684,6 +733,15 @@ TEST(CachingOnDiskFileSystemTest, ExcludeFromTacking) { EXPECT_EQ(FS->excludeFromTracking(F21.path()), std::error_code()); AccessAllFiles(); auto Tree = CreateTreeFromNewAccesses(); +#ifdef _WIN32 + ASSERT_NE(Tree, std::nullopt); + EXPECT_EQ(Tree->size(), 1u); + auto DriveNode = Tree->lookup(sys::path::root_name(TestDirectory.path())); + ASSERT_TRUE(DriveNode); + auto DriveDir = Schema.load(DriveNode->getRef()); + ASSERT_THAT_EXPECTED(DriveDir, Succeeded()); + Tree = *DriveDir; +#endif ASSERT_NE(Tree, std::nullopt); EXPECT_EQ(Tree->size(), 1u); EXPECT_FALSE(Tree->lookup("d1")); @@ -702,6 +760,15 @@ TEST(CachingOnDiskFileSystemTest, ExcludeFromTacking) { EXPECT_EQ(FS->excludeFromTracking(D1.path()), std::error_code()); EXPECT_EQ(FS->excludeFromTracking(F21.path()), std::error_code()); auto Tree = CreateTreeFromNewAccesses(); +#ifdef _WIN32 + ASSERT_NE(Tree, std::nullopt); + EXPECT_EQ(Tree->size(), 1u); + auto DriveNode = Tree->lookup(sys::path::root_name(TestDirectory.path())); + ASSERT_TRUE(DriveNode); + auto DriveDir = Schema.load(DriveNode->getRef()); + ASSERT_THAT_EXPECTED(DriveDir, Succeeded()); + Tree = *DriveDir; +#endif ASSERT_NE(Tree, std::nullopt); EXPECT_EQ(Tree->size(), 1u); EXPECT_FALSE(Tree->lookup("d1")); @@ -720,6 +787,15 @@ TEST(CachingOnDiskFileSystemTest, ExcludeFromTacking) { EXPECT_EQ(FS->excludeFromTracking(D1Sub.path()), std::error_code()); EXPECT_EQ(FS->excludeFromTracking(D2.path()), std::error_code()); auto Tree = CreateTreeFromNewAccesses(); +#ifdef _WIN32 + ASSERT_NE(Tree, std::nullopt); + EXPECT_EQ(Tree->size(), 1u); + auto DriveNode = Tree->lookup(sys::path::root_name(TestDirectory.path())); + ASSERT_TRUE(DriveNode); + auto DriveDir = Schema.load(DriveNode->getRef()); + ASSERT_THAT_EXPECTED(DriveDir, Succeeded()); + Tree = *DriveDir; +#endif ASSERT_NE(Tree, std::nullopt); EXPECT_EQ(Tree->size(), 1u); EXPECT_FALSE(Tree->lookup("d2")); diff --git a/llvm/unittests/Support/PrefixMapperTest.cpp b/llvm/unittests/Support/PrefixMapperTest.cpp index ce6630e04759a..4f364e4ceef86 100644 --- a/llvm/unittests/Support/PrefixMapperTest.cpp +++ b/llvm/unittests/Support/PrefixMapperTest.cpp @@ -416,7 +416,7 @@ TEST(TreePathPrefixMapperTest, construct) { TEST(TreePathPrefixMapperTest, add) { auto FS = makeIntrusiveRefCnt(); - TreePathPrefixMapper PM(FS); + TreePathPrefixMapper PM(FS, sys::path::Style::posix); // Non-canonical paths create two map entries: one for the canonical and one // for the non-canonical path. @@ -440,7 +440,7 @@ TEST(TreePathPrefixMapperTest, add) { TEST(TreePathPrefixMapperTest, addRange) { auto FS = makeIntrusiveRefCnt(); - TreePathPrefixMapper PM(FS); + TreePathPrefixMapper PM(FS, sys::path::Style::posix); MappedPrefix MissingMapping[] = { {"missing", "/new"}, @@ -465,7 +465,7 @@ TEST(TreePathPrefixMapperTest, addRange) { TEST(TreePathPrefixMapperTest, addInverseRange) { auto FS = makeIntrusiveRefCnt(); - TreePathPrefixMapper PM(FS); + TreePathPrefixMapper PM(FS, sys::path::Style::posix); MappedPrefix MissingMapping[] = { {"/new", "missing"}, diff --git a/llvm/utils/lit/lit/TestRunner.py b/llvm/utils/lit/lit/TestRunner.py index bf3444fa9319c..f37d769013d05 100644 --- a/llvm/utils/lit/lit/TestRunner.py +++ b/llvm/utils/lit/lit/TestRunner.py @@ -1553,6 +1553,17 @@ def regex_escape(s): ] ) + substitutions.extend( + [ + # The filesystem root and their tree path forms for + # Windows for CAS prefix mapping. The t suffix stands for + # tree path. Those with suffixes need to use {} because + # lit macro names cannot be a prefix of another macro. + ("%/root", os.environ.get('SystemDrive') + "/" if kIsWindows else "/"), + ("%{/roott}", "/" + os.environ.get('SystemDrive') + "/" if kIsWindows else "/"), + ] + ) + return substitutions diff --git a/llvm/utils/lit/lit/llvm/config.py b/llvm/utils/lit/lit/llvm/config.py index e47fa93a7beb8..b59348be09f8c 100644 --- a/llvm/utils/lit/lit/llvm/config.py +++ b/llvm/utils/lit/lit/llvm/config.py @@ -1,5 +1,6 @@ import itertools import os +import pathlib import platform import re import subprocess @@ -756,6 +757,17 @@ def use_clang( command=self.config.clang, extra_args=["--driver-mode=g++"] + additional_flags, ), + # A clang path with natural casing on Windows. Same as + # %/clang on non-Windows. + ToolSubst( + "%/ncclang", + command = ( + str(pathlib.Path(self.config.clang).resolve(strict=False)).replace("\\", "/") + if platform.system() == "Windows" + else self.config.clang.replace("\\", "/") + ), + extra_args=additional_flags + ), ] self.add_tool_substitutions(tool_substitutions) self.config.substitutions.append(("%resource_dir", builtin_include_dir))