xref: /llvm-project/clang/test/ClangScanDeps/optimize-vfs.m (revision 9d4837f47c48c634d4a0ac799188e1f5332495ef)
1// RUN: rm -rf %t
2// RUN: split-file %s %t
3// RUN: sed -e "s|DIR|%/t|g" %t/build/compile-commands.json.in > %t/build/compile-commands.json
4// RUN: sed -e "s|DIR|%/t|g" %t/build/vfs.yaml.in > %t/build/vfs.yaml
5// RUN: sed -e "s|DIR|%/t|g" %t/build/unused-vfs.yaml.in > %t/build/unused-vfs.yaml
6// RUN: sed -e "s|DIR|%/t|g" %t/build/unused-vfs.yaml.in > %t/build/unused2-vfs.yaml
7// RUN: clang-scan-deps -compilation-database %t/build/compile-commands.json \
8// RUN:   -j 1 -format experimental-full --optimize-args=vfs,header-search > %t/deps.db
9// RUN: cat %t/deps.db | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t
10
11// Check that unused -ivfsoverlay arguments are removed, and that used ones are
12// not.
13
14// CHECK:      {
15// CHECK-NEXT:   "modules": [
16// CHECK-NEXT:     {
17// CHECK-NEXT:       "clang-module-deps": [],
18// CHECK-NEXT:       "clang-modulemap-file": "[[PREFIX]]/modules/A/module.modulemap",
19// CHECK-NEXT:       "command-line": [
20// CHECK-NOT:          "build/unused-vfs.yaml"
21// CHECK:              "-ivfsoverlay"
22// CHECK-NEXT:         "build/vfs.yaml"
23// CHECK-NOT:          "build/unused-vfs.yaml"
24// CHECK:            ],
25// CHECK-NEXT:       "context-hash": "{{.*}}",
26// CHECK-NEXT:       "file-deps": [
27// CHECK-NEXT:         "[[PREFIX]]/build/module.modulemap",
28// CHECK-NEXT:         "[[PREFIX]]/build/A.h"
29// CHECK-NEXT:       ],
30// CHECK-NEXT:       "link-libraries": [],
31// CHECK-NEXT:       "name": "A"
32// CHECK-NEXT:     },
33// CHECK-NEXT:     {
34// CHECK-NEXT:       "clang-module-deps": [],
35// CHECK-NEXT:       "clang-modulemap-file": "[[PREFIX]]/modules/B/module.modulemap",
36// CHECK-NEXT:       "command-line": [
37// CHECK-NOT:          "-ivfsoverlay"
38// CHECK:            ],
39// CHECK-NEXT:       "context-hash": "{{.*}}",
40// CHECK-NEXT:       "file-deps": [
41// CHECK-NEXT:         "[[PREFIX]]/modules/B/module.modulemap",
42// CHECK-NEXT:         "[[PREFIX]]/modules/B/B.h"
43// CHECK-NEXT:       ],
44// CHECK-NEXT:       "link-libraries": [],
45// CHECK-NEXT:       "name": "B"
46// CHECK-NEXT:     },
47// CHECK-NEXT:     {
48// CHECK-NEXT:       "clang-module-deps": [
49// CHECK-NEXT:         {
50// CHECK-NEXT:           "context-hash": "{{.*}}",
51// CHECK-NEXT:           "module-name": "B"
52// CHECK-NEXT:         }
53// CHECK-NEXT:       ],
54// CHECK-NEXT:       "clang-modulemap-file": "[[PREFIX]]/modules/C/module.modulemap",
55// CHECK-NEXT:       "command-line": [
56// CHECK-NOT:          "-ivfsoverlay"
57// CHECK:            ],
58// CHECK-NEXT:       "context-hash": "{{.*}}",
59// CHECK-NEXT:       "file-deps": [
60// CHECK-NEXT:         "[[PREFIX]]/modules/C/module.modulemap",
61// CHECK-NEXT:         "[[PREFIX]]/modules/C/C.h",
62// CHECK-NEXT:         "[[PREFIX]]/modules/B/module.modulemap"
63// CHECK-NEXT:       ],
64// CHECK-NEXT:       "link-libraries": [],
65// CHECK-NEXT:       "name": "C"
66// CHECK-NEXT:     }
67// CHECK-NEXT:   ],
68// CHECK-NEXT:   "translation-units": [
69// CHECK:        ]
70// CHECK:      }
71
72//--- build/compile-commands.json.in
73
74[
75{
76  "directory": "DIR",
77  "command": "clang -c DIR/0.m -Imodules/A -Imodules/B -fmodules -fmodules-cache-path=DIR/module-cache -fimplicit-module-maps -ivfsoverlay build/unused-vfs.yaml -ivfsoverlay build/unused2-vfs.yaml -ivfsoverlay build/vfs.yaml",
78  "file": "DIR/0.m"
79},
80{
81  "directory": "DIR",
82  "command": "clang -c DIR/A.m -Imodules/A -Imodules/B -fmodules -fmodules-cache-path=DIR/module-cache -fimplicit-module-maps -ivfsoverlay build/vfs.yaml -ivfsoverlay build/unused-vfs.yaml",
83  "file": "DIR/A.m"
84},
85{
86  "directory": "DIR",
87  "command": "clang -c DIR/B.m -Imodules/B -fmodules -fmodules-cache-path=DIR/module-cache -fimplicit-module-maps -ivfsoverlay build/unused-vfs.yaml -ivfsoverlay build/vfs.yaml",
88  "file": "DIR/B.m"
89},
90{
91  "directory": "DIR",
92  "command": "clang -c DIR/C.m -Imodules/A -Imodules/B -Imodules/C -fmodules -fmodules-cache-path=DIR/module-cache -fimplicit-module-maps -ivfsoverlay build/vfs.yaml -ivfsoverlay build/unused-vfs.yaml",
93  "file": "DIR/C.m"
94}
95]
96
97//--- build/vfs.yaml.in
98
99{
100   "version":0,
101   "case-sensitive":"false",
102   "roots":[
103      {
104         "contents":[
105            {
106               "external-contents":"DIR/build/module.modulemap",
107               "name":"module.modulemap",
108               "type":"file"
109            },
110            {
111               "external-contents":"DIR/build/A.h",
112               "name":"A.h",
113               "type":"file"
114            }
115         ],
116         "name":"DIR/modules/A",
117         "type":"directory"
118      }
119   ]
120}
121
122//--- build/unused-vfs.yaml.in
123
124{
125   "version":0,
126   "case-sensitive":"false",
127   "roots":[
128      {
129         "contents":[
130            {
131               "external-contents":"DIR/build/module.modulemap",
132               "name":"module.modulemap",
133               "type":"file"
134            }
135         ],
136         "name":"DIR/modules/D",
137         "type":"directory"
138      }
139   ]
140}
141
142//--- build/module.modulemap
143
144module A {
145  umbrella header "A.h"
146}
147
148//--- build/A.h
149
150typedef int A_t;
151
152//--- modules/B/module.modulemap
153
154module B {
155  umbrella header "B.h"
156}
157
158//--- modules/B/B.h
159
160typedef int B_t;
161
162//--- modules/C/module.modulemap
163
164module C {
165  umbrella header "C.h"
166}
167
168//--- modules/C/C.h
169
170@import B;
171
172typedef B_t C_t;
173
174//--- 0.m
175
176#include <A.h>
177
178A_t a = 0;
179
180//--- A.m
181
182#include <A.h>
183
184A_t a = 0;
185
186//--- B.m
187
188#include <B.h>
189
190B_t b = 0;
191
192//--- C.m
193
194#include <C.h>
195
196C_t b = 0;
197