1 // Unsupported on AIX because we don't support the requisite "__clangast"
2 // section in XCOFF yet.
3 // UNSUPPORTED: aix
4 
5 // RUN: rm -rf %t && mkdir %t
6 // RUN: cp %S/Inputs/modules-pch/* %t
7 
8 // Scan dependencies of the PCH:
9 //
10 // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-pch/cdb_pch.json > %t/cdb.json
11 // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full \
12 // RUN:   -generate-modules-path-args -module-files-dir %t/build > %t/result_pch.json
13 // RUN: cat %t/result_pch.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK-PCH
14 //
15 // Check we didn't build the PCH during dependency scanning.
16 // RUN: not cat %/t/pch.h.gch
17 //
18 // CHECK-PCH:      {
19 // CHECK-PCH-NEXT:   "modules": [
20 // CHECK-PCH-NEXT:     {
21 // CHECK-PCH-NEXT:       "clang-module-deps": [],
22 // CHECK-PCH-NEXT:       "clang-modulemap-file": "[[PREFIX]]/module.modulemap",
23 // CHECK-PCH-NEXT:       "command-line": [
24 // CHECK-PCH-NEXT:         "-cc1"
25 // CHECK-PCH:              "-emit-module"
26 // CHECK-PCH:              "-fmodules"
27 // CHECK-PCH-NOT:          "-fimplicit-module-maps"
28 // CHECK-PCH:              "-fmodule-name=ModCommon1"
29 // CHECK-PCH:              "-fno-implicit-modules"
30 // CHECK-PCH:            ],
31 // CHECK-PCH-NEXT:       "context-hash": "[[HASH_MOD_COMMON_1:.*]]",
32 // CHECK-PCH-NEXT:       "file-deps": [
33 // CHECK-PCH-NEXT:         "[[PREFIX]]/mod_common_1.h",
34 // CHECK-PCH-NEXT:         "[[PREFIX]]/module.modulemap"
35 // CHECK-PCH-NEXT:       ],
36 // CHECK-PCH-NEXT:       "name": "ModCommon1"
37 // CHECK-PCH-NEXT:     },
38 // CHECK-PCH-NEXT:     {
39 // CHECK-PCH-NEXT:       "clang-module-deps": [],
40 // CHECK-PCH-NEXT:       "clang-modulemap-file": "[[PREFIX]]/module.modulemap",
41 // CHECK-PCH-NEXT:       "command-line": [
42 // CHECK-PCH-NEXT:         "-cc1"
43 // CHECK-PCH:              "-emit-module"
44 // CHECK-PCH:              "-fmodules"
45 // CHECK-PCH-NOT:          "-fimplicit-module-maps"
46 // CHECK-PCH:              "-fmodule-name=ModCommon2"
47 // CHECK-PCH:              "-fno-implicit-modules"
48 // CHECK-PCH:            ],
49 // CHECK-PCH-NEXT:       "context-hash": "[[HASH_MOD_COMMON_2:.*]]",
50 // CHECK-PCH-NEXT:       "file-deps": [
51 // CHECK-PCH-NEXT:         "[[PREFIX]]/mod_common_2.h",
52 // CHECK-PCH-NEXT:         "[[PREFIX]]/module.modulemap"
53 // CHECK-PCH-NEXT:       ],
54 // CHECK-PCH-NEXT:       "name": "ModCommon2"
55 // CHECK-PCH-NEXT:     },
56 // CHECK-PCH-NEXT:     {
57 // CHECK-PCH-NEXT:       "clang-module-deps": [
58 // CHECK-PCH-NEXT:         {
59 // CHECK-PCH-NEXT:           "context-hash": "[[HASH_MOD_COMMON_2]]",
60 // CHECK-PCH-NEXT:           "module-name": "ModCommon2"
61 // CHECK-PCH-NEXT:         }
62 // CHECK-PCH-NEXT:       ],
63 // CHECK-PCH-NEXT:       "clang-modulemap-file": "[[PREFIX]]/module.modulemap",
64 // CHECK-PCH-NEXT:       "command-line": [
65 // CHECK-PCH-NEXT:         "-cc1"
66 // CHECK-PCH:              "-emit-module"
67 // CHECK-PCH:              "-fmodule-file=[[PREFIX]]/build/[[HASH_MOD_COMMON_2]]/ModCommon2-{{.*}}.pcm"
68 // CHECK-PCH:              "-fmodules"
69 // CHECK-PCH-NOT:          "-fimplicit-module-maps"
70 // CHECK-PCH:              "-fmodule-name=ModPCH"
71 // CHECK-PCH:              "-fno-implicit-modules"
72 // CHECK-PCH:            ],
73 // CHECK-PCH-NEXT:       "context-hash": "[[HASH_MOD_PCH:.*]]",
74 // CHECK-PCH-NEXT:       "file-deps": [
75 // CHECK-PCH-NEXT:         "[[PREFIX]]/mod_pch.h",
76 // CHECK-PCH-NEXT:         "[[PREFIX]]/module.modulemap"
77 // CHECK-PCH-NEXT:       ],
78 // CHECK-PCH-NEXT:       "name": "ModPCH"
79 // CHECK-PCH-NEXT:     }
80 // CHECK-PCH-NEXT:   ],
81 // CHECK-PCH-NEXT:   "translation-units": [
82 // CHECK-PCH-NEXT:     {
83 // CHECK-PCH-NEXT:       "clang-context-hash": "[[HASH_PCH:.*]]",
84 // CHECK-PCH-NEXT:       "clang-module-deps": [
85 // CHECK-PCH-NEXT:         {
86 // CHECK-PCH-NEXT:           "context-hash": "[[HASH_MOD_COMMON_1]]",
87 // CHECK-PCH-NEXT:           "module-name": "ModCommon1"
88 // CHECK-PCH-NEXT:         },
89 // CHECK-PCH-NEXT:         {
90 // CHECK-PCH-NEXT:           "context-hash": "[[HASH_MOD_PCH]]",
91 // CHECK-PCH-NEXT:           "module-name": "ModPCH"
92 // CHECK-PCH-NEXT:         }
93 // CHECK-PCH-NEXT:       ],
94 // CHECK-PCH-NEXT:       "command-line": [
95 // CHECK-PCH:              "-fno-implicit-modules",
96 // CHECK-PCH-NEXT:         "-fno-implicit-module-maps",
97 // CHECK-PCH-NEXT:         "-fmodule-file=[[PREFIX]]/build/[[HASH_MOD_COMMON_1]]/ModCommon1-{{.*}}.pcm",
98 // CHECK-PCH-NEXT:         "-fmodule-file=[[PREFIX]]/build/[[HASH_MOD_PCH]]/ModPCH-{{.*}}.pcm"
99 // CHECK-PCH-NEXT:       ],
100 // CHECK-PCH-NEXT:       "file-deps": [
101 // CHECK-PCH-NEXT:         "[[PREFIX]]/pch.h"
102 // CHECK-PCH-NEXT:       ],
103 // CHECK-PCH-NEXT:       "input-file": "[[PREFIX]]/pch.h"
104 // CHECK-PCH-NEXT:     }
105 // CHECK-PCH-NEXT:   ]
106 // CHECK-PCH-NEXT: }
107 
108 // Explicitly build the PCH:
109 //
110 // RUN: %deps-to-rsp %t/result_pch.json --module-name=ModCommon1 > %t/mod_common_1.cc1.rsp
111 // RUN: %deps-to-rsp %t/result_pch.json --module-name=ModCommon2 > %t/mod_common_2.cc1.rsp
112 // RUN: %deps-to-rsp %t/result_pch.json --module-name=ModPCH > %t/mod_pch.cc1.rsp
113 // RUN: %deps-to-rsp %t/result_pch.json --tu-index=0 > %t/pch.rsp
114 //
115 // RUN: %clang @%t/mod_common_1.cc1.rsp
116 // RUN: %clang @%t/mod_common_2.cc1.rsp
117 // RUN: %clang @%t/mod_pch.cc1.rsp
118 // RUN: %clang @%t/pch.rsp
119 
120 // Scan dependencies of the TU:
121 //
122 // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-pch/cdb_tu.json > %t/cdb.json
123 // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full \
124 // RUN:   -generate-modules-path-args -module-files-dir %t/build > %t/result_tu.json
125 // RUN: cat %t/result_tu.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK-TU
126 //
127 // CHECK-TU:      {
128 // CHECK-TU-NEXT:   "modules": [
129 // CHECK-TU-NEXT:     {
130 // CHECK-TU-NEXT:       "clang-module-deps": [],
131 // CHECK-TU-NEXT:       "clang-modulemap-file": "[[PREFIX]]/module.modulemap",
132 // CHECK-TU-NEXT:       "command-line": [
133 // CHECK-TU-NEXT:         "-cc1",
134 // CHECK-TU:              "-emit-module",
135 // CHECK-TU-NOT:          "-fimplicit-module-maps",
136 // CHECK-TU:              "-fmodule-name=ModTU",
137 // CHECK-TU:              "-fno-implicit-modules",
138 // CHECK-TU:            ],
139 // CHECK-TU-NEXT:       "context-hash": "[[HASH_MOD_TU:.*]]",
140 // CHECK-TU-NEXT:       "file-deps": [
141 // CHECK-TU-NEXT:         "[[PREFIX]]/mod_tu.h",
142 // CHECK-TU-NEXT:         "[[PREFIX]]/module.modulemap"
143 // CHECK-TU-NEXT:       ],
144 // CHECK-TU-NEXT:       "name": "ModTU"
145 // CHECK-TU-NEXT:     }
146 // CHECK-TU-NEXT:   ],
147 // CHECK-TU-NEXT:   "translation-units": [
148 // CHECK-TU-NEXT:     {
149 // CHECK-TU-NEXT:       "clang-context-hash": "[[HASH_TU:.*]]",
150 // CHECK-TU-NEXT:       "clang-module-deps": [
151 // CHECK-TU-NEXT:         {
152 // CHECK-TU-NEXT:           "context-hash": "[[HASH_MOD_TU]]",
153 // CHECK-TU-NEXT:           "module-name": "ModTU"
154 // CHECK-TU-NEXT:         }
155 // CHECK-TU-NEXT:       ],
156 // CHECK-TU-NEXT:       "command-line": [
157 // CHECK-TU:              "-fno-implicit-modules",
158 // CHECK-TU-NEXT:         "-fno-implicit-module-maps",
159 // CHECK-TU-NEXT:         "-fmodule-file=[[PREFIX]]/build/[[HASH_MOD_TU]]/ModTU-{{.*}}.pcm"
160 // CHECK-TU-NEXT:       ],
161 // CHECK-TU-NEXT:       "file-deps": [
162 // CHECK-TU-NEXT:         "[[PREFIX]]/tu.c",
163 // CHECK-TU-NEXT:         "[[PREFIX]]/pch.h.gch"
164 // CHECK-TU-NEXT:       ],
165 // CHECK-TU-NEXT:       "input-file": "[[PREFIX]]/tu.c"
166 // CHECK-TU-NEXT:     }
167 // CHECK-TU-NEXT:   ]
168 // CHECK-TU-NEXT: }
169 
170 // Explicitly build the TU:
171 //
172 // RUN: %deps-to-rsp %t/result_tu.json --module-name=ModTU > %t/mod_tu.cc1.rsp
173 // RUN: %deps-to-rsp %t/result_tu.json --tu-index=0 > %t/tu.rsp
174 //
175 // RUN: %clang @%t/mod_tu.cc1.rsp
176 // RUN: %clang @%t/tu.rsp
177 
178 // Scan dependencies of the TU that has common modules with the PCH:
179 //
180 // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-pch/cdb_tu_with_common.json > %t/cdb.json
181 // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full \
182 // RUN:   -generate-modules-path-args -module-files-dir %t/build > %t/result_tu_with_common.json
183 // RUN: cat %t/result_tu_with_common.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK-TU-WITH-COMMON
184 //
185 // CHECK-TU-WITH-COMMON:      {
186 // CHECK-TU-WITH-COMMON-NEXT:   "modules": [
187 // CHECK-TU-WITH-COMMON-NEXT:     {
188 // CHECK-TU-WITH-COMMON-NEXT:       "clang-module-deps": [],
189 // CHECK-TU-WITH-COMMON-NEXT:       "clang-modulemap-file": "[[PREFIX]]/module.modulemap",
190 // CHECK-TU-WITH-COMMON-NEXT:       "command-line": [
191 // CHECK-TU-WITH-COMMON-NEXT:         "-cc1",
192 // CHECK-TU-WITH-COMMON:              "-emit-module",
193 // CHECK-TU-WITH-COMMON:              "-fmodule-file=[[PREFIX]]/build/{{.*}}/ModCommon1-{{.*}}.pcm",
194 // CHECK-TU-WITH-COMMON-NOT:          "-fimplicit-module-maps",
195 // CHECK-TU-WITH-COMMON:              "-fmodule-name=ModTUWithCommon",
196 // CHECK-TU-WITH-COMMON:              "-fno-implicit-modules",
197 // CHECK-TU-WITH-COMMON:            ],
198 // CHECK-TU-WITH-COMMON-NEXT:       "context-hash": "[[HASH_MOD_TU_WITH_COMMON:.*]]",
199 // CHECK-TU-WITH-COMMON-NEXT:       "file-deps": [
200 // CHECK-TU-WITH-COMMON-NEXT:         "[[PREFIX]]/mod_tu_with_common.h",
201 // CHECK-TU-WITH-COMMON-NEXT:         "[[PREFIX]]/module.modulemap"
202 // CHECK-TU-WITH-COMMON-NEXT:       ],
203 // CHECK-TU-WITH-COMMON-NEXT:       "name": "ModTUWithCommon"
204 // CHECK-TU-WITH-COMMON-NEXT:     }
205 // CHECK-TU-WITH-COMMON-NEXT:   ],
206 // CHECK-TU-WITH-COMMON-NEXT:   "translation-units": [
207 // CHECK-TU-WITH-COMMON-NEXT:     {
208 // CHECK-TU-WITH-COMMON-NEXT:       "clang-context-hash": "[[HASH_TU_WITH_COMMON:.*]]",
209 // CHECK-TU-WITH-COMMON-NEXT:       "clang-module-deps": [
210 // CHECK-TU-WITH-COMMON-NEXT:         {
211 // CHECK-TU-WITH-COMMON-NEXT:           "context-hash": "[[HASH_MOD_TU_WITH_COMMON]]",
212 // CHECK-TU-WITH-COMMON-NEXT:           "module-name": "ModTUWithCommon"
213 // CHECK-TU-WITH-COMMON-NEXT:         }
214 // CHECK-TU-WITH-COMMON-NEXT:       ],
215 // CHECK-TU-WITH-COMMON-NEXT:       "command-line": [
216 // CHECK-TU-WITH-COMMON:              "-fno-implicit-modules",
217 // CHECK-TU-WITH-COMMON-NEXT:         "-fno-implicit-module-maps",
218 // CHECK-TU-WITH-COMMON-NEXT:         "-fmodule-file=[[PREFIX]]/build/{{.*}}/ModCommon2-{{.*}}.pcm",
219 // CHECK-TU-WITH-COMMON-NEXT:         "-fmodule-file=[[PREFIX]]/build/[[HASH_MOD_TU_WITH_COMMON]]/ModTUWithCommon-{{.*}}.pcm"
220 // CHECK-TU-WITH-COMMON-NEXT:       ],
221 // CHECK-TU-WITH-COMMON-NEXT:       "file-deps": [
222 // CHECK-TU-WITH-COMMON-NEXT:         "[[PREFIX]]/tu_with_common.c",
223 // CHECK-TU-WITH-COMMON-NEXT:         "[[PREFIX]]/pch.h.gch"
224 // CHECK-TU-WITH-COMMON-NEXT:       ],
225 // CHECK-TU-WITH-COMMON-NEXT:       "input-file": "[[PREFIX]]/tu_with_common.c"
226 // CHECK-TU-WITH-COMMON-NEXT:     }
227 // CHECK-TU-WITH-COMMON-NEXT:   ]
228 // CHECK-TU-WITH-COMMON-NEXT: }
229 
230 // Explicitly build the TU that has common modules with the PCH:
231 //
232 // RUN: %deps-to-rsp %t/result_tu_with_common.json --module-name=ModTUWithCommon > %t/mod_tu_with_common.cc1.rsp
233 // RUN: %deps-to-rsp %t/result_tu_with_common.json --tu-index=0 > %t/tu_with_common.rsp
234 //
235 // RUN: %clang @%t/mod_tu_with_common.cc1.rsp
236 // RUN: %clang @%t/tu_with_common.rsp
237