1 /*
2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
5 * 1.0 of the CDDL.
6 *
7 * A full copy of the text of the CDDL should have accompanied this
8 * source. A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
10 */
11
12 /*
13 * Copyright 2019, Joyent, Inc.
14 */
15
16 /*
17 * Check qualifier encoding. Note that the needed_qualifier() workaround applies
18 * to most of these.
19 */
20
21 #include "check-common.h"
22
23 static check_descent_t check_descent_const_union_array_gcc4[] = {
24 { "const union const_union [5]", CTF_K_CONST },
25 { "union const_union [5]", CTF_K_ARRAY, "union const_union", 5 },
26 { "union const_union", CTF_K_UNION },
27 { NULL }
28 };
29
30 static check_descent_t check_descent_const_union_array_gcc7[] = {
31 { "const union const_union [5]", CTF_K_ARRAY,
32 "const union const_union", 5 },
33 { "const union const_union", CTF_K_CONST },
34 { "union const_union", CTF_K_UNION },
35 { NULL }
36 };
37
38 static check_descent_test_t alt_descents_const_union_array[] = {
39 { "const_union_array", check_descent_const_union_array_gcc4 },
40 { "const_union_array", check_descent_const_union_array_gcc7 },
41 { NULL }
42 };
43
44 static check_descent_t check_descent_const_struct_array_gcc4[] = {
45 { "const struct const_struct [7]", CTF_K_CONST },
46 { "struct const_struct [7]", CTF_K_ARRAY, "struct const_struct", 7 },
47 { "struct const_struct", CTF_K_STRUCT },
48 { NULL }
49 };
50
51 static check_descent_t check_descent_const_struct_array_gcc7[] = {
52 { "const struct const_struct [7]", CTF_K_ARRAY,
53 "const struct const_struct", 7 },
54 { "const struct const_struct", CTF_K_CONST },
55 { "struct const_struct", CTF_K_STRUCT },
56 { NULL }
57 };
58
59 static check_descent_test_t alt_descents_const_struct_array[] = {
60 { "const_struct_array", check_descent_const_struct_array_gcc4 },
61 { "const_struct_array", check_descent_const_struct_array_gcc7 },
62 { NULL }
63 };
64
65 static check_descent_t check_descent_volatile_struct_array_gcc4[] = {
66 { "volatile struct volatile_struct [9]", CTF_K_VOLATILE },
67 { "struct volatile_struct [9]", CTF_K_ARRAY,
68 "struct volatile_struct", 9 },
69 { "struct volatile_struct", CTF_K_STRUCT },
70 { NULL }
71 };
72
73 static check_descent_t check_descent_volatile_struct_array_gcc7[] = {
74 { "volatile struct volatile_struct [9]", CTF_K_ARRAY,
75 "volatile struct volatile_struct", 9 },
76 { "volatile struct volatile_struct", CTF_K_VOLATILE },
77 { "struct volatile_struct", CTF_K_STRUCT },
78 { NULL }
79 };
80
81 static check_descent_test_t alt_descents_volatile_struct_array[] = {
82 { "volatile_struct_array", check_descent_volatile_struct_array_gcc4 },
83 { "volatile_struct_array", check_descent_volatile_struct_array_gcc7 },
84 { NULL }
85 };
86
87 static check_descent_t check_descent_c_int_array_gcc4[] = {
88 { "const int [11]", CTF_K_CONST },
89 { "int [11]", CTF_K_ARRAY, "int", 11 },
90 { "int", CTF_K_INTEGER },
91 { NULL }
92 };
93
94 static check_descent_t check_descent_c_int_array_gcc7[] = {
95 { "const int [11]", CTF_K_ARRAY, "const int", 11 },
96 { "const int", CTF_K_CONST },
97 { "int", CTF_K_INTEGER },
98 { NULL }
99 };
100
101 static check_descent_test_t alt_descents_c_int_array[] = {
102 { "c_int_array", check_descent_c_int_array_gcc4 },
103 { "c_int_array", check_descent_c_int_array_gcc7 },
104 { NULL }
105 };
106
107 static check_descent_t check_descent_cv_int_array_gcc4[] = {
108 { "const volatile int [13]", CTF_K_CONST },
109 { "volatile int [13]", CTF_K_VOLATILE },
110 { "int [13]", CTF_K_ARRAY, "int", 13 },
111 { "int", CTF_K_INTEGER },
112 { NULL }
113 };
114
115 static check_descent_t check_descent_cv_int_array_gcc7[] = {
116 { "volatile const int [13]", CTF_K_ARRAY, "volatile const int", 13 },
117 { "volatile const int", CTF_K_VOLATILE },
118 { "const int", CTF_K_CONST },
119 { "int", CTF_K_INTEGER },
120 { NULL }
121 };
122
123 static check_descent_test_t alt_descents_cv_int_array[] = {
124 { "cv_int_array", check_descent_cv_int_array_gcc4 },
125 { "cv_int_array", check_descent_cv_int_array_gcc7 },
126 { NULL }
127 };
128
129 static check_descent_t check_descent_vc_int_array_gcc4[] = {
130 { "const volatile int [15]", CTF_K_CONST },
131 { "volatile int [15]", CTF_K_VOLATILE },
132 { "int [15]", CTF_K_ARRAY, "int", 15 },
133 { "int", CTF_K_INTEGER },
134 { NULL }
135 };
136
137 static check_descent_t check_descent_vc_int_array_gcc7[] = {
138 { "volatile const int [15]", CTF_K_ARRAY, "volatile const int", 15 },
139 { "volatile const int", CTF_K_VOLATILE },
140 { "const int", CTF_K_CONST },
141 { "int", CTF_K_INTEGER },
142 { NULL }
143 };
144
145 static check_descent_test_t alt_descents_vc_int_array[] = {
146 { "vc_int_array", check_descent_vc_int_array_gcc4 },
147 { "vc_int_array", check_descent_vc_int_array_gcc7 },
148 { NULL }
149 };
150
151 static check_descent_t check_descent_vc_int_array2_gcc4[] = {
152 { "const volatile int [17]", CTF_K_CONST },
153 { "volatile int [17]", CTF_K_VOLATILE },
154 { "int [17]", CTF_K_ARRAY, "int", 17 },
155 { "int", CTF_K_INTEGER },
156 { NULL }
157 };
158
159 static check_descent_t check_descent_vc_int_array2_gcc7[] = {
160 { "volatile const int [17]", CTF_K_ARRAY, "volatile const int", 17 },
161 { "volatile const int", CTF_K_VOLATILE },
162 { "const int", CTF_K_CONST },
163 { "int", CTF_K_INTEGER },
164 { NULL }
165 };
166
167 static check_descent_test_t alt_descents_vc_int_array2[] = {
168 { "vc_int_array2", check_descent_vc_int_array2_gcc4 },
169 { "vc_int_array2", check_descent_vc_int_array2_gcc7 },
170 { NULL }
171 };
172
173 static check_descent_t check_descent_c_2d_array_gcc4[] = {
174 { "const int [4][2]", CTF_K_CONST },
175 { "int [4][2]", CTF_K_ARRAY, "int [2]", 4 },
176 { "int [2]", CTF_K_ARRAY, "int", 2 },
177 { "int", CTF_K_INTEGER },
178 { NULL }
179 };
180
181 static check_descent_t check_descent_c_2d_array_gcc7[] = {
182 { "const int [4][2]", CTF_K_ARRAY, "const int [2]", 4 },
183 { "const int [2]", CTF_K_ARRAY, "const int", 2 },
184 { "const int", CTF_K_CONST },
185 { "int", CTF_K_INTEGER },
186 { NULL }
187 };
188
189 static check_descent_test_t alt_descents_c_2d_array[] = {
190 { "c_2d_array", check_descent_c_2d_array_gcc4 },
191 { "c_2d_array", check_descent_c_2d_array_gcc7 },
192 { NULL }
193 };
194
195 static check_descent_t check_descent_cv_3d_array_gcc4[] = {
196 { "const volatile int [3][2][1]", CTF_K_CONST },
197 { "volatile int [3][2][1]", CTF_K_VOLATILE },
198 { "int [3][2][1]", CTF_K_ARRAY, "int [2][1]", 3 },
199 { "int [2][1]", CTF_K_ARRAY, "int [1]", 2 },
200 { "int [1]", CTF_K_ARRAY, "int", 1 },
201 { "int", CTF_K_INTEGER },
202 { NULL }
203 };
204
205 static check_descent_t check_descent_cv_3d_array_gcc7[] = {
206 { "volatile const int [3][2][1]", CTF_K_ARRAY,
207 "volatile const int [2][1]", 3 },
208 { "volatile const int [2][1]", CTF_K_ARRAY,
209 "volatile const int [1]", 2 },
210 { "volatile const int [1]", CTF_K_ARRAY, "volatile const int", 1 },
211 { "volatile const int", CTF_K_VOLATILE },
212 { "const int", CTF_K_CONST },
213 { "int", CTF_K_INTEGER },
214 { NULL }
215 };
216
217 static check_descent_test_t alt_descents_cv_3d_array[] = {
218 { "cv_3d_array", check_descent_cv_3d_array_gcc4 },
219 { "cv_3d_array", check_descent_cv_3d_array_gcc7 },
220 { NULL }
221 };
222
223 static check_descent_t check_descent_ptr_to_const_int[] = {
224 { "const int *", CTF_K_POINTER },
225 { "const int", CTF_K_CONST },
226 { "int", CTF_K_INTEGER },
227 { NULL }
228 };
229
230 static check_descent_test_t alt_descents_ptr_to_const_int[] = {
231 { "ptr_to_const_int", check_descent_ptr_to_const_int },
232 { NULL }
233 };
234
235 static check_descent_t check_descent_const_ptr_to_int[] = {
236 { "int *const", CTF_K_CONST },
237 { "int *", CTF_K_POINTER },
238 { "int", CTF_K_INTEGER },
239 { NULL }
240 };
241
242 static check_descent_test_t alt_descents_const_ptr_to_int[] = {
243 { "const_ptr_to_int", check_descent_const_ptr_to_int },
244 { NULL }
245 };
246
247 static check_descent_t check_descent_const_ptr_to_const_int[] = {
248 { "const int *const", CTF_K_CONST },
249 { "const int *", CTF_K_POINTER },
250 { "const int", CTF_K_CONST },
251 { "int", CTF_K_INTEGER },
252 { NULL }
253 };
254
255 static check_descent_test_t alt_descents_const_ptr_to_const_int[] = {
256 { "const_ptr_to_const_int", check_descent_const_ptr_to_const_int },
257 { NULL }
258 };
259
260 static check_descent_test_t *alt_descents[] = {
261 alt_descents_const_union_array,
262 alt_descents_const_struct_array,
263 alt_descents_volatile_struct_array,
264 alt_descents_c_int_array,
265 alt_descents_cv_int_array,
266 alt_descents_vc_int_array,
267 alt_descents_vc_int_array2,
268 alt_descents_c_2d_array,
269 alt_descents_cv_3d_array,
270 alt_descents_ptr_to_const_int,
271 alt_descents_const_ptr_to_int,
272 alt_descents_const_ptr_to_const_int,
273 NULL
274 };
275
276 int
277 main(int argc, char *argv[])
278 {
279 int i, ret = 0;
280
281 if (argc < 2) {
282 errx(EXIT_FAILURE, "missing test files");
283 }
284
285 for (i = 1; i < argc; i++) {
286 ctf_file_t *fp;
287
288 if ((fp = ctf_open(argv[i], &ret)) == NULL) {
289 warnx("failed to open %s: %s", argv[i],
290 ctf_errmsg(ret));
291 ret = EXIT_FAILURE;
292 continue;
293 }
294
295 for (uint_t j = 0; alt_descents[j] != NULL; j++) {
296 check_descent_test_t *descents = alt_descents[j];
297 int alt_ok = 0;
298
299 for (uint_t k = 0; descents[k].cdt_sym != NULL; k++) {
300 if (ctftest_check_descent(descents[k].cdt_sym,
301 fp, descents[k].cdt_tests, B_TRUE)) {
302 alt_ok = 1;
303 break;
304 }
305 }
306
307 if (!alt_ok) {
308 warnx("all descents failed for %s",
309 descents[0].cdt_sym);
310 ret = EXIT_FAILURE;
311 }
312 }
313
314 ctf_close(fp);
315 }
316
317 return (ret);
318 }