| // Test scanning when the driver requires multiple jobs. E.g. with -save-temps |
| // there will be separate -E, -emit-llvm-bc, -S, and -cc1as jobs, which should |
| // each result in a "command" in the output. |
| |
| // We use an x86_64-apple-darwin target to avoid host-dependent behaviour in |
| // the driver. Platforms without an integrated assembler have different commands |
| // REQUIRES: x86-registered-target |
| |
| // RUN: rm -rf %t |
| // RUN: split-file %s %t |
| // RUN: sed -e "s|DIR|%/t|g" %t/cdb.json.in > %t/cdb.json |
| |
| // RUN: clang-scan-deps -compilation-database %t/cdb.json -module-files-dir %t/modules \ |
| // RUN: -j 1 -format experimental-full -mode preprocess-dependency-directives \ |
| // RUN: > %t/deps.json |
| |
| // RUN: cat %t/deps.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t |
| |
| // Build the -save-temps + -fmodules case |
| // RUN: %deps-to-rsp %t/deps.json --module-name=Mod > %t/Mod.rsp |
| // RUN: %deps-to-rsp %t/deps.json --tu-index 1 --tu-cmd-index 0 > %t/tu-cpp.rsp |
| // RUN: %deps-to-rsp %t/deps.json --tu-index 1 --tu-cmd-index 1 > %t/tu-emit-ir.rsp |
| // RUN: %deps-to-rsp %t/deps.json --tu-index 1 --tu-cmd-index 2 > %t/tu-emit-asm.rsp |
| // RUN: %deps-to-rsp %t/deps.json --tu-index 1 --tu-cmd-index 3 > %t/tu-cc1as.rsp |
| // RUN: %clang @%t/Mod.rsp |
| // RUN: %clang @%t/tu-cpp.rsp |
| // RUN: ls %t/tu_save_temps_module.i |
| // RUN: %clang @%t/tu-emit-ir.rsp |
| // RUN: ls %t/tu_save_temps_module.bc |
| // RUN: %clang @%t/tu-emit-asm.rsp |
| // RUN: ls %t/tu_save_temps_module.s |
| // RUN: %clang @%t/tu-cc1as.rsp |
| // RUN: ls %t/tu_save_temps_module.o |
| |
| |
| // CHECK: "modules": [ |
| // CHECK-NEXT: { |
| // CHECK: "clang-modulemap-file": "[[PREFIX]]{{.}}module.modulemap" |
| // CHECK: "name": "Mod" |
| // CHECK: } |
| // CHECK-NEXT: ] |
| // CHECK-NEXT: "translation-units": [ |
| // CHECK-NEXT: { |
| // CHECK: "commands": [ |
| // CHECK-NEXT: { |
| // CHECK-NEXT: "clang-context-hash": |
| // CHECK-NEXT: "clang-module-deps": [] |
| // CHECK-NEXT: "command-line": [ |
| // CHECK-NEXT: "-cc1" |
| // CHECK: "-o" |
| // CHECK-NEXT: "{{.*}}tu_no_integrated_cpp{{.*}}.i" |
| // CHECK: "-E" |
| // CHECK: ] |
| // CHECK-NEXT: "executable": "clang_tool" |
| // CHECK: "input-file": "[[PREFIX]]{{.}}tu_no_integrated_cpp.c" |
| // CHECK-NEXT: } |
| // CHECK-NEXT: { |
| // CHECK-NEXT: "clang-context-hash": |
| // CHECK-NEXT: "clang-module-deps": [] |
| // CHECK-NEXT: "command-line": [ |
| // CHECK-NEXT: "-cc1" |
| // CHECK: "-o" |
| // CHECK-NEXT: "{{.*}}tu_no_integrated_cpp.o" |
| // CHECK: "-emit-obj" |
| // CHECK: "{{.*}}tu_no_integrated_cpp{{.*}}.i" |
| // CHECK: ] |
| // CHECK-NEXT: "executable": "clang_tool" |
| // CHECK: "input-file": "[[PREFIX]]{{.}}tu_no_integrated_cpp.c" |
| // CHECK-NEXT: } |
| // CHECK-NEXT: ] |
| // CHECK-NEXT: } |
| // CHECK-NEXT: { |
| // CHECK-NEXT: "commands": [ |
| // CHECK-NEXT: { |
| // CHECK: "clang-module-deps": [ |
| // CHECK-NEXT: { |
| // CHECK: "module-name": "Mod" |
| // CHECK-NEXT: } |
| // CHECK-NEXT: ] |
| // CHECK-NEXT: "command-line": [ |
| // CHECK-NEXT: "-cc1" |
| // CHECK: "-o" |
| // CHECK-NEXT: "{{.*}}tu_save_temps_module.i" |
| // CHECK: "-E" |
| // CHECK: "-fmodule-file={{.*}}[[PREFIX]]{{.}}modules{{.*}}Mod-{{.*}}.pcm" |
| // CHECK: "{{.*}}tu_save_temps_module.c" |
| // CHECK: ] |
| // CHECK-NEXT: "executable": "clang_tool" |
| // CHECK: "input-file": "[[PREFIX]]{{.}}tu_save_temps_module.c" |
| // CHECK-NEXT: } |
| // CHECK-NEXT: { |
| // CHECK: "clang-module-deps": [ |
| // CHECK-NEXT: { |
| // CHECK: "module-name": "Mod" |
| // CHECK-NEXT: } |
| // CHECK-NEXT: ] |
| // CHECK-NEXT: "command-line": [ |
| // CHECK-NEXT: "-cc1" |
| // CHECK: "-o" |
| // CHECK-NEXT: "{{.*}}tu_save_temps_module.bc" |
| // CHECK: "-emit-llvm-bc" |
| // CHECK: "{{.*}}tu_save_temps_module.i" |
| // CHECK: "-fmodule-file={{.*}}[[PREFIX]]{{.}}modules{{.*}}Mod-{{.*}}.pcm" |
| // CHECK: ] |
| // CHECK-NEXT: "executable": "clang_tool" |
| // CHECK: "input-file": "[[PREFIX]]{{.}}tu_save_temps_module.c" |
| // CHECK-NEXT: } |
| // CHECK-NEXT: { |
| // CHECK: "clang-module-deps": [ |
| // CHECK-NEXT: { |
| // CHECK: "module-name": "Mod" |
| // CHECK-NEXT: } |
| // CHECK-NEXT: ] |
| // CHECK-NEXT: "command-line": [ |
| // CHECK-NEXT: "-cc1" |
| // CHECK: "-o" |
| // CHECK-NEXT: "{{.*}}tu_save_temps_module.s" |
| // CHECK: "-S" |
| // CHECK: "{{.*}}tu_save_temps_module.bc" |
| // CHECK: ] |
| // CHECK-NEXT: "executable": "clang_tool" |
| // CHECK: "input-file": "[[PREFIX]]{{.}}tu_save_temps_module.c" |
| // CHECK-NEXT: } |
| // CHECK-NEXT: { |
| // CHECK: "clang-module-deps": [ |
| // CHECK-NEXT: { |
| // CHECK: "module-name": "Mod" |
| // CHECK-NEXT: } |
| // CHECK-NEXT: ] |
| // CHECK-NEXT: "command-line": [ |
| // CHECK-NEXT: "-cc1as" |
| // CHECK: "-o" |
| // CHECK-NEXT: "{{.*}}tu_save_temps_module.o" |
| // CHECK: "{{.*}}tu_save_temps_module.s" |
| // CHECK: ] |
| // CHECK-NEXT: "executable": "clang_tool" |
| // CHECK: "input-file": "[[PREFIX]]{{.}}tu_save_temps_module.c" |
| // CHECK-NEXT: } |
| // CHECK-NEXT: ] |
| // CHECK-NEXT: } |
| // CHECK-NEXT: ] |
| |
| |
| //--- cdb.json.in |
| [ |
| { |
| "directory": "DIR" |
| "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" |
| "file": "DIR/tu_no_integrated_cpp.c" |
| }, |
| { |
| "directory": "DIR" |
| "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" |
| "file": "DIR/tu_save_temps_module.c" |
| } |
| ] |
| |
| //--- plain_header.h |
| void foo(void); |
| |
| //--- module_header.h |
| void bar(void); |
| |
| //--- module.modulemap |
| module Mod { header "module_header.h" } |
| |
| //--- tu_no_integrated_cpp.c |
| #include "plain_header.h" |
| void tu_no_integrated_cpp(void) { foo(); } |
| |
| //--- tu_save_temps_module.c |
| #include "module_header.h" |
| void tu_save_temps(void) { bar(); } |