1 // Test scanning when the driver requires multiple jobs. E.g. with -save-temps 2 // there will be separate -E, -emit-llvm-bc, -S, and -cc1as jobs, which should 3 // each result in a "command" in the output. 4 5 // We use an x86_64-apple-darwin target to avoid host-dependent behaviour in 6 // the driver. Platforms without an integrated assembler have different commands 7 // REQUIRES: x86-registered-target 8 9 // RUN: rm -rf %t 10 // RUN: split-file %s %t 11 // RUN: sed -e "s|DIR|%/t|g" %t/cdb.json.in > %t/cdb.json 12 13 // RUN: clang-scan-deps -compilation-database %t/cdb.json -module-files-dir %t/modules \ 14 // RUN: -j 1 -format experimental-full -mode preprocess-dependency-directives \ 15 // RUN: > %t/deps.json 16 17 // RUN: cat %t/deps.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t 18 19 // Build the -save-temps + -fmodules case 20 // RUN: %deps-to-rsp %t/deps.json --module-name=Mod > %t/Mod.rsp 21 // RUN: %deps-to-rsp %t/deps.json --tu-index 1 --tu-cmd-index 0 > %t/tu-cpp.rsp 22 // RUN: %deps-to-rsp %t/deps.json --tu-index 1 --tu-cmd-index 1 > %t/tu-emit-ir.rsp 23 // RUN: %deps-to-rsp %t/deps.json --tu-index 1 --tu-cmd-index 2 > %t/tu-emit-asm.rsp 24 // RUN: %deps-to-rsp %t/deps.json --tu-index 1 --tu-cmd-index 3 > %t/tu-cc1as.rsp 25 // RUN: %clang @%t/Mod.rsp 26 // RUN: %clang @%t/tu-cpp.rsp 27 // RUN: ls %t/tu_save_temps_module.i 28 // RUN: %clang @%t/tu-emit-ir.rsp 29 // RUN: ls %t/tu_save_temps_module.bc 30 // RUN: %clang @%t/tu-emit-asm.rsp 31 // RUN: ls %t/tu_save_temps_module.s 32 // RUN: %clang @%t/tu-cc1as.rsp 33 // RUN: ls %t/tu_save_temps_module.o 34 35 36 // CHECK: "modules": [ 37 // CHECK-NEXT: { 38 // CHECK: "clang-modulemap-file": "[[PREFIX]]{{.}}module.modulemap" 39 // CHECK: "name": "Mod" 40 // CHECK: } 41 // CHECK-NEXT: ] 42 // CHECK-NEXT: "translation-units": [ 43 // CHECK-NEXT: { 44 // CHECK: "commands": [ 45 // CHECK-NEXT: { 46 // CHECK-NEXT: "clang-context-hash": 47 // CHECK-NEXT: "clang-module-deps": [] 48 // CHECK-NEXT: "command-line": [ 49 // CHECK-NEXT: "-cc1" 50 // CHECK: "-o" 51 // CHECK-NEXT: "{{.*}}tu_no_integrated_cpp{{.*}}.i" 52 // CHECK: "-E" 53 // CHECK: ] 54 // CHECK-NEXT: "executable": "clang_tool" 55 // CHECK: "input-file": "[[PREFIX]]{{.}}tu_no_integrated_cpp.c" 56 // CHECK-NEXT: } 57 // CHECK-NEXT: { 58 // CHECK-NEXT: "clang-context-hash": 59 // CHECK-NEXT: "clang-module-deps": [] 60 // CHECK-NEXT: "command-line": [ 61 // CHECK-NEXT: "-cc1" 62 // CHECK: "-o" 63 // CHECK-NEXT: "{{.*}}tu_no_integrated_cpp.o" 64 // CHECK: "-emit-obj" 65 // CHECK: "{{.*}}tu_no_integrated_cpp{{.*}}.i" 66 // CHECK: ] 67 // CHECK-NEXT: "executable": "clang_tool" 68 // CHECK: "input-file": "[[PREFIX]]{{.}}tu_no_integrated_cpp.c" 69 // CHECK-NEXT: } 70 // CHECK-NEXT: ] 71 // CHECK-NEXT: } 72 // CHECK-NEXT: { 73 // CHECK-NEXT: "commands": [ 74 // CHECK-NEXT: { 75 // CHECK: "clang-module-deps": [ 76 // CHECK-NEXT: { 77 // CHECK: "module-name": "Mod" 78 // CHECK-NEXT: } 79 // CHECK-NEXT: ] 80 // CHECK-NEXT: "command-line": [ 81 // CHECK-NEXT: "-cc1" 82 // CHECK: "-o" 83 // CHECK-NEXT: "{{.*}}tu_save_temps_module.i" 84 // CHECK: "-E" 85 // CHECK: "-fmodule-file={{.*}}[[PREFIX]]{{.}}modules{{.*}}Mod-{{.*}}.pcm" 86 // CHECK: "{{.*}}tu_save_temps_module.c" 87 // CHECK: ] 88 // CHECK-NEXT: "executable": "clang_tool" 89 // CHECK: "input-file": "[[PREFIX]]{{.}}tu_save_temps_module.c" 90 // CHECK-NEXT: } 91 // CHECK-NEXT: { 92 // CHECK: "clang-module-deps": [ 93 // CHECK-NEXT: { 94 // CHECK: "module-name": "Mod" 95 // CHECK-NEXT: } 96 // CHECK-NEXT: ] 97 // CHECK-NEXT: "command-line": [ 98 // CHECK-NEXT: "-cc1" 99 // CHECK: "-o" 100 // CHECK-NEXT: "{{.*}}tu_save_temps_module.bc" 101 // CHECK: "-emit-llvm-bc" 102 // CHECK: "{{.*}}tu_save_temps_module.i" 103 // CHECK: "-fmodule-file={{.*}}[[PREFIX]]{{.}}modules{{.*}}Mod-{{.*}}.pcm" 104 // CHECK: ] 105 // CHECK-NEXT: "executable": "clang_tool" 106 // CHECK: "input-file": "[[PREFIX]]{{.}}tu_save_temps_module.c" 107 // CHECK-NEXT: } 108 // CHECK-NEXT: { 109 // CHECK: "clang-module-deps": [ 110 // CHECK-NEXT: { 111 // CHECK: "module-name": "Mod" 112 // CHECK-NEXT: } 113 // CHECK-NEXT: ] 114 // CHECK-NEXT: "command-line": [ 115 // CHECK-NEXT: "-cc1" 116 // CHECK: "-o" 117 // CHECK-NEXT: "{{.*}}tu_save_temps_module.s" 118 // CHECK: "-S" 119 // CHECK: "{{.*}}tu_save_temps_module.bc" 120 // CHECK: ] 121 // CHECK-NEXT: "executable": "clang_tool" 122 // CHECK: "input-file": "[[PREFIX]]{{.}}tu_save_temps_module.c" 123 // CHECK-NEXT: } 124 // CHECK-NEXT: { 125 // CHECK: "clang-module-deps": [ 126 // CHECK-NEXT: { 127 // CHECK: "module-name": "Mod" 128 // CHECK-NEXT: } 129 // CHECK-NEXT: ] 130 // CHECK-NEXT: "command-line": [ 131 // CHECK-NEXT: "-cc1as" 132 // CHECK: "-o" 133 // CHECK-NEXT: "{{.*}}tu_save_temps_module.o" 134 // CHECK: "{{.*}}tu_save_temps_module.s" 135 // CHECK: ] 136 // CHECK-NEXT: "executable": "clang_tool" 137 // CHECK: "input-file": "[[PREFIX]]{{.}}tu_save_temps_module.c" 138 // CHECK-NEXT: } 139 // CHECK-NEXT: ] 140 // CHECK-NEXT: } 141 // CHECK-NEXT: ] 142 143 144 //--- cdb.json.in 145 [ 146 { 147 "directory": "DIR" 148 "command": "clang_tool -target x86_64-apple-darwin -c DIR/tu_no_integrated_cpp.c -no-integrated-cpp -o DIR/tu_no_integrated_cpp.o" 149 "file": "DIR/tu_no_integrated_cpp.c" 150 }, 151 { 152 "directory": "DIR" 153 "command": "clang_tool -target x86_64-apple-darwin -c DIR/tu_save_temps_module.c -save-temps=obj -o DIR/tu_save_temps_module.o -fmodules -fimplicit-modules -fimplicit-module-maps -fmodules-cache-path=DIR/cache" 154 "file": "DIR/tu_save_temps_module.c" 155 } 156 ] 157 158 //--- plain_header.h 159 void foo(void); 160 161 //--- module_header.h 162 void bar(void); 163 164 //--- module.modulemap 165 module Mod { header "module_header.h" } 166 167 //--- tu_no_integrated_cpp.c 168 #include "plain_header.h" tu_no_integrated_cpp(void)169void tu_no_integrated_cpp(void) { foo(); } 170 171 //--- tu_save_temps_module.c 172 #include "module_header.h" tu_save_temps(void)173void tu_save_temps(void) { bar(); } 174