xref: /illumos-gate/usr/src/test/util-tests/tests/ctf/check-qualifiers.c (revision 35c005f243fafd7cad624b8a3a64298cab8ac172)
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 }
319