xref: /llvm-project/clang/test/ClangScanDeps/multiple-commands.c (revision f4a13c9c0a049d40e0365477c58c2a5369eda6dc)
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)169 void tu_no_integrated_cpp(void) { foo(); }
170 
171 //--- tu_save_temps_module.c
172 #include "module_header.h"
tu_save_temps(void)173 void tu_save_temps(void) { bar(); }
174