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