1 /* Structure layout test generator.
2 Copyright (C) 2004-2014
3 Free Software Foundation, Inc.
4 Contributed by Jakub Jelinek <jakub@redhat.com>.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
23 /* Compile with gcc -o struct-layout-1_generate{,.c} generate_random{,_r}.c */
25 /* N.B. -- This program cannot use libiberty as that will not work
26 when testing an installed compiler. */
32 /* We use our own pseudo-random number generator, so that it gives the same
33 values on all hosts. */
34 #include "../../gcc.dg/compat/generate-random.h"
36 #if LLONG_MAX != 9223372036854775807LL && __LONG_LONG_MAX__ != 9223372036854775807LL
37 # error Need 64-bit long long
40 #if defined __MSVCRT__
41 #define COMPAT_PRLL "I64"
43 #define COMPAT_PRLL "ll"
46 const char *dg_options
[] = {
47 "/* { dg-options \"%s-I%s -Wno-abi\" } */\n",
48 "/* { dg-options \"%s-I%s -mno-mmx -Wno-abi\" { target i?86-*-* x86_64-*-* } } */\n",
49 "/* { dg-options \"%s-I%s -fno-common\" { target hppa*-*-hpux* powerpc*-*-darwin* *-*-mingw32* *-*-cygwin* } } */\n",
50 "/* { dg-options \"%s-I%s -mno-mmx -fno-common -Wno-abi\" { target i?86-*-darwin* x86_64-*-darwin* i?86-*-mingw32* x86_64-*-mingw32* i?86-*-cygwin* } } */\n",
51 "/* { dg-options \"%s-I%s -mno-base-addresses\" { target mmix-*-* } } */\n",
52 "/* { dg-options \"%s-I%s -mlongcalls -mtext-section-literals\" { target xtensa*-*-* } } */\n"
53 #define NDG_OPTIONS (sizeof (dg_options) / sizeof (dg_options[0]))
56 typedef unsigned int hashval_t
;
74 unsigned long long int maxval
;
78 struct types base_types
[] = {
79 /* As we don't know whether char will be signed or not, just limit ourselves
80 to unsigned values less than maximum signed char value. */
81 { "char", TYPE_UINT
, 127, 'C' },
82 { "signed char", TYPE_INT
, 127, 'C' },
83 { "unsigned char", TYPE_UINT
, 255, 'C' },
84 { "short int", TYPE_INT
, 32767, 'S' },
85 { "unsigned short int", TYPE_UINT
, 65535, 'S' },
86 { "int", TYPE_INT
, 2147483647, 'I' },
87 { "unsigned int", TYPE_UINT
, 4294967295U, 'I' },
88 { "long int", TYPE_INT
, 9223372036854775807LL, 'L' },
89 { "unsigned long int", TYPE_UINT
, 18446744073709551615ULL, 'L' },
90 { "long long int", TYPE_INT
, 9223372036854775807LL, 'Q' },
91 { "unsigned long long int", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
92 { "bool", TYPE_UINT
, 1, 'B' },
93 { "void *", TYPE_PTR
, 0, 0 },
94 { "char *", TYPE_PTR
, 0, 0 },
95 { "int *", TYPE_PTR
, 0, 0 },
96 { "float", TYPE_FLOAT
, 0, 0 },
97 { "double", TYPE_FLOAT
, 0, 0 },
98 { "long double", TYPE_FLOAT
, 0, 0 },
100 { "Tchar", TYPE_UINT
, 127, 'C' },
101 { "Tschar", TYPE_INT
, 127, 'C' },
102 { "Tuchar", TYPE_UINT
, 255, 'C' },
103 { "Tshort", TYPE_INT
, 32767, 'S' },
104 { "Tushort", TYPE_UINT
, 65535, 'S' },
105 { "Tint", TYPE_INT
, 2147483647, 'I' },
106 { "Tuint", TYPE_UINT
, 4294967295U, 'I' },
107 { "Tlong", TYPE_INT
, 9223372036854775807LL, 'L' },
108 { "Tulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
109 { "Tllong", TYPE_INT
, 9223372036854775807LL, 'Q' },
110 { "Tullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
111 { "Tbool", TYPE_UINT
, 1, 'B' },
112 { "size_t", TYPE_UINT
, 18446744073709551615ULL, 0 },
113 { "Tptr", TYPE_PTR
, 0, 0 },
114 { "Tcptr", TYPE_PTR
, 0, 0 },
115 { "Tiptr", TYPE_PTR
, 0, 0 },
116 { "Tfnptr", TYPE_FNPTR
, 0, 0 },
117 { "Tfloat", TYPE_FLOAT
, 0, 0 },
118 { "Tdouble", TYPE_FLOAT
, 0, 0 },
119 { "Tldouble", TYPE_FLOAT
, 0, 0 },
120 { "enum E0", TYPE_UENUM
, 0, ' ' },
121 { "enum E1", TYPE_UENUM
, 1, ' ' },
122 { "enum E2", TYPE_SENUM
, 3, ' ' },
123 { "enum E3", TYPE_SENUM
, 127, ' ' },
124 { "enum E4", TYPE_UENUM
, 255, ' ' },
125 { "enum E5", TYPE_SENUM
, 32767, ' ' },
126 { "enum E6", TYPE_UENUM
, 65535, ' ' },
127 { "enum E7", TYPE_SENUM
, 2147483647, ' ' },
128 { "enum E8", TYPE_UENUM
, 4294967295U, ' ' },
129 { "enum E9", TYPE_SENUM
, 1099511627775LL, ' ' },
130 { "TE0", TYPE_UENUM
, 0, ' ' },
131 { "TE1", TYPE_UENUM
, 1, ' ' },
132 { "TE2", TYPE_SENUM
, 3, ' ' },
133 { "TE3", TYPE_SENUM
, 127, ' ' },
134 { "TE4", TYPE_UENUM
, 255, ' ' },
135 { "TE5", TYPE_SENUM
, 32767, ' ' },
136 { "TE6", TYPE_UENUM
, 65535, ' ' },
137 { "TE7", TYPE_SENUM
, 2147483647, ' ' },
138 { "TE8", TYPE_UENUM
, 4294967295U, ' ' },
139 { "TE9", TYPE_SENUM
, 1099511627775LL, ' ' },
140 /* vector-defs.h typedefs */
141 { "qi", TYPE_INT
, 127, 0 },
142 { "hi", TYPE_INT
, 32767, 0 },
143 { "si", TYPE_INT
, 2147483647, 0 },
144 { "di", TYPE_INT
, 9223372036854775807LL, 0 },
145 { "sf", TYPE_FLOAT
, 0, 0 },
146 { "df", TYPE_FLOAT
, 0, 0 }
147 #define NTYPES2 (sizeof (base_types) / sizeof (base_types[0]))
149 struct types vector_types
[] = {
150 /* vector-defs.h typedefs */
151 { "v8qi", TYPE_OTHER
, 0, 0 },
152 { "v16qi", TYPE_OTHER
, 0, 0 },
153 { "v2hi", TYPE_OTHER
, 0, 0 },
154 { "v4hi", TYPE_OTHER
, 0, 0 },
155 { "v8hi", TYPE_OTHER
, 0, 0 },
156 { "v2si", TYPE_OTHER
, 0, 0 },
157 { "v4si", TYPE_OTHER
, 0, 0 },
158 { "v1di", TYPE_OTHER
, 0, 0 },
159 { "v2di", TYPE_OTHER
, 0, 0 },
160 { "v2sf", TYPE_OTHER
, 0, 0 },
161 { "v4sf", TYPE_OTHER
, 0, 0 },
162 { "v16sf", TYPE_OTHER
, 0, 0 },
163 { "v2df", TYPE_OTHER
, 0, 0 },
164 { "u8qi", TYPE_OTHER
, 0, 0 },
165 { "u16qi", TYPE_OTHER
, 0, 0 },
166 { "u2hi", TYPE_OTHER
, 0, 0 },
167 { "u4hi", TYPE_OTHER
, 0, 0 },
168 { "u8hi", TYPE_OTHER
, 0, 0 },
169 { "u2si", TYPE_OTHER
, 0, 0 },
170 { "u4si", TYPE_OTHER
, 0, 0 },
171 { "u1di", TYPE_OTHER
, 0, 0 },
172 { "u2di", TYPE_OTHER
, 0, 0 },
173 { "u2sf", TYPE_OTHER
, 0, 0 },
174 { "u4sf", TYPE_OTHER
, 0, 0 },
175 { "u16sf", TYPE_OTHER
, 0, 0 },
176 { "u2df", TYPE_OTHER
, 0, 0 },
177 { "__m64", TYPE_OTHER
, 0, 0 },
178 { "__m128", TYPE_OTHER
, 0, 0 }
179 #define NVTYPES2 (sizeof (vector_types) / sizeof (vector_types[0]))
181 struct types attrib_types
[] = {
182 { "Talchar", TYPE_UINT
, 127, 'C' },
183 { "Talschar", TYPE_INT
, 127, 'C' },
184 { "Taluchar", TYPE_UINT
, 255, 'C' },
185 { "Talshort", TYPE_INT
, 32767, 'S' },
186 { "Talushort", TYPE_UINT
, 65535, 'S' },
187 { "Talint", TYPE_INT
, 2147483647, 'I' },
188 { "Taluint", TYPE_UINT
, 4294967295U, 'I' },
189 { "Tallong", TYPE_INT
, 9223372036854775807LL, 'L' },
190 { "Talulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
191 { "Talllong", TYPE_INT
, 9223372036854775807LL, 'Q' },
192 { "Talullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
193 { "Talbool", TYPE_UINT
, 1, 'B' },
194 { "Talptr", TYPE_PTR
, 0, 0 },
195 { "Talcptr", TYPE_PTR
, 0, 0 },
196 { "Taliptr", TYPE_PTR
, 0, 0 },
197 { "Talfloat", TYPE_FLOAT
, 0, 0 },
198 { "Taldouble", TYPE_FLOAT
, 0, 0 },
199 { "Talldouble", TYPE_FLOAT
, 0, 0 },
200 { "TalE0", TYPE_UENUM
, 0, ' ' },
201 { "TalE1", TYPE_UENUM
, 1, ' ' },
202 { "TalE2", TYPE_SENUM
, 3, ' ' },
203 { "TalE3", TYPE_SENUM
, 127, ' ' },
204 { "TalE4", TYPE_UENUM
, 255, ' ' },
205 { "TalE5", TYPE_SENUM
, 32767, ' ' },
206 { "TalE6", TYPE_UENUM
, 65535, ' ' },
207 { "TalE7", TYPE_SENUM
, 2147483647, ' ' },
208 { "TalE8", TYPE_UENUM
, 4294967295U, ' ' },
209 { "TalE9", TYPE_SENUM
, 1099511627775LL, ' ' },
210 { "Tal1char", TYPE_UINT
, 127, 'C' },
211 { "Tal1schar", TYPE_INT
, 127, 'C' },
212 { "Tal1uchar", TYPE_UINT
, 255, 'C' },
213 { "Tal1short", TYPE_INT
, 32767, 'S' },
214 { "Tal1ushort", TYPE_UINT
, 65535, 'S' },
215 { "Tal1int", TYPE_INT
, 2147483647, 'I' },
216 { "Tal1uint", TYPE_UINT
, 4294967295U, 'I' },
217 { "Tal1long", TYPE_INT
, 9223372036854775807LL, 'L' },
218 { "Tal1ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
219 { "Tal1llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
220 { "Tal1ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
221 { "Tal1bool", TYPE_UINT
, 1, 'B' },
222 { "Tal1ptr", TYPE_PTR
, 0, 0 },
223 { "Tal1cptr", TYPE_PTR
, 0, 0 },
224 { "Tal1iptr", TYPE_PTR
, 0, 0 },
225 { "Tal1float", TYPE_FLOAT
, 0, 0 },
226 { "Tal1double", TYPE_FLOAT
, 0, 0 },
227 { "Tal1ldouble", TYPE_FLOAT
, 0, 0 },
228 { "Tal1E0", TYPE_UENUM
, 0, ' ' },
229 { "Tal1E1", TYPE_UENUM
, 1, ' ' },
230 { "Tal1E2", TYPE_SENUM
, 3, ' ' },
231 { "Tal1E3", TYPE_SENUM
, 127, ' ' },
232 { "Tal1E4", TYPE_UENUM
, 255, ' ' },
233 { "Tal1E5", TYPE_SENUM
, 32767, ' ' },
234 { "Tal1E6", TYPE_UENUM
, 65535, ' ' },
235 { "Tal1E7", TYPE_SENUM
, 2147483647, ' ' },
236 { "Tal1E8", TYPE_UENUM
, 4294967295U, ' ' },
237 { "Tal1E9", TYPE_SENUM
, 1099511627775LL, ' ' },
238 { "Tal2char", TYPE_UINT
, 127, 'C' },
239 { "Tal2schar", TYPE_INT
, 127, 'C' },
240 { "Tal2uchar", TYPE_UINT
, 255, 'C' },
241 { "Tal2short", TYPE_INT
, 32767, 'S' },
242 { "Tal2ushort", TYPE_UINT
, 65535, 'S' },
243 { "Tal2int", TYPE_INT
, 2147483647, 'I' },
244 { "Tal2uint", TYPE_UINT
, 4294967295U, 'I' },
245 { "Tal2long", TYPE_INT
, 9223372036854775807LL, 'L' },
246 { "Tal2ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
247 { "Tal2llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
248 { "Tal2ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
249 { "Tal2bool", TYPE_UINT
, 1, 'B' },
250 { "Tal2ptr", TYPE_PTR
, 0, 0 },
251 { "Tal2cptr", TYPE_PTR
, 0, 0 },
252 { "Tal2iptr", TYPE_PTR
, 0, 0 },
253 { "Tal2float", TYPE_FLOAT
, 0, 0 },
254 { "Tal2double", TYPE_FLOAT
, 0, 0 },
255 { "Tal2ldouble", TYPE_FLOAT
, 0, 0 },
256 { "Tal2E0", TYPE_UENUM
, 0, ' ' },
257 { "Tal2E1", TYPE_UENUM
, 1, ' ' },
258 { "Tal2E2", TYPE_SENUM
, 3, ' ' },
259 { "Tal2E3", TYPE_SENUM
, 127, ' ' },
260 { "Tal2E4", TYPE_UENUM
, 255, ' ' },
261 { "Tal2E5", TYPE_SENUM
, 32767, ' ' },
262 { "Tal2E6", TYPE_UENUM
, 65535, ' ' },
263 { "Tal2E7", TYPE_SENUM
, 2147483647, ' ' },
264 { "Tal2E8", TYPE_UENUM
, 4294967295U, ' ' },
265 { "Tal2E9", TYPE_SENUM
, 1099511627775LL, ' ' },
266 { "Tal4char", TYPE_UINT
, 127, 'C' },
267 { "Tal4schar", TYPE_INT
, 127, 'C' },
268 { "Tal4uchar", TYPE_UINT
, 255, 'C' },
269 { "Tal4short", TYPE_INT
, 32767, 'S' },
270 { "Tal4ushort", TYPE_UINT
, 65535, 'S' },
271 { "Tal4int", TYPE_INT
, 2147483647, 'I' },
272 { "Tal4uint", TYPE_UINT
, 4294967295U, 'I' },
273 { "Tal4long", TYPE_INT
, 9223372036854775807LL, 'L' },
274 { "Tal4ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
275 { "Tal4llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
276 { "Tal4ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
277 { "Tal4bool", TYPE_UINT
, 1, 'B' },
278 { "Tal4ptr", TYPE_PTR
, 0, 0 },
279 { "Tal4cptr", TYPE_PTR
, 0, 0 },
280 { "Tal4iptr", TYPE_PTR
, 0, 0 },
281 { "Tal4float", TYPE_FLOAT
, 0, 0 },
282 { "Tal4double", TYPE_FLOAT
, 0, 0 },
283 { "Tal4ldouble", TYPE_FLOAT
, 0, 0 },
284 { "Tal4E0", TYPE_UENUM
, 0, ' ' },
285 { "Tal4E1", TYPE_UENUM
, 1, ' ' },
286 { "Tal4E2", TYPE_SENUM
, 3, ' ' },
287 { "Tal4E3", TYPE_SENUM
, 127, ' ' },
288 { "Tal4E4", TYPE_UENUM
, 255, ' ' },
289 { "Tal4E5", TYPE_SENUM
, 32767, ' ' },
290 { "Tal4E6", TYPE_UENUM
, 65535, ' ' },
291 { "Tal4E7", TYPE_SENUM
, 2147483647, ' ' },
292 { "Tal4E8", TYPE_UENUM
, 4294967295U, ' ' },
293 { "Tal4E9", TYPE_SENUM
, 1099511627775LL, ' ' },
294 { "Tal8char", TYPE_UINT
, 127, 'C' },
295 { "Tal8schar", TYPE_INT
, 127, 'C' },
296 { "Tal8uchar", TYPE_UINT
, 255, 'C' },
297 { "Tal8short", TYPE_INT
, 32767, 'S' },
298 { "Tal8ushort", TYPE_UINT
, 65535, 'S' },
299 { "Tal8int", TYPE_INT
, 2147483647, 'I' },
300 { "Tal8uint", TYPE_UINT
, 4294967295U, 'I' },
301 { "Tal8long", TYPE_INT
, 9223372036854775807LL, 'L' },
302 { "Tal8ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
303 { "Tal8llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
304 { "Tal8ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
305 { "Tal8bool", TYPE_UINT
, 1, 'B' },
306 { "Tal8ptr", TYPE_PTR
, 0, 0 },
307 { "Tal8cptr", TYPE_PTR
, 0, 0 },
308 { "Tal8iptr", TYPE_PTR
, 0, 0 },
309 { "Tal8float", TYPE_FLOAT
, 0, 0 },
310 { "Tal8double", TYPE_FLOAT
, 0, 0 },
311 { "Tal8ldouble", TYPE_FLOAT
, 0, 0 },
312 { "Tal8E0", TYPE_UENUM
, 0, ' ' },
313 { "Tal8E1", TYPE_UENUM
, 1, ' ' },
314 { "Tal8E2", TYPE_SENUM
, 3, ' ' },
315 { "Tal8E3", TYPE_SENUM
, 127, ' ' },
316 { "Tal8E4", TYPE_UENUM
, 255, ' ' },
317 { "Tal8E5", TYPE_SENUM
, 32767, ' ' },
318 { "Tal8E6", TYPE_UENUM
, 65535, ' ' },
319 { "Tal8E7", TYPE_SENUM
, 2147483647, ' ' },
320 { "Tal8E8", TYPE_UENUM
, 4294967295U, ' ' },
321 { "Tal8E9", TYPE_SENUM
, 1099511627775LL, ' ' },
322 { "Tal16char", TYPE_UINT
, 127, 'C' },
323 { "Tal16schar", TYPE_INT
, 127, 'C' },
324 { "Tal16uchar", TYPE_UINT
, 255, 'C' },
325 { "Tal16short", TYPE_INT
, 32767, 'S' },
326 { "Tal16ushort", TYPE_UINT
, 65535, 'S' },
327 { "Tal16int", TYPE_INT
, 2147483647, 'I' },
328 { "Tal16uint", TYPE_UINT
, 4294967295U, 'I' },
329 { "Tal16long", TYPE_INT
, 9223372036854775807LL, 'L' },
330 { "Tal16ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
331 { "Tal16llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
332 { "Tal16ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
333 { "Tal16bool", TYPE_UINT
, 1, 'B' },
334 { "Tal16ptr", TYPE_PTR
, 0, 0 },
335 { "Tal16cptr", TYPE_PTR
, 0, 0 },
336 { "Tal16iptr", TYPE_PTR
, 0, 0 },
337 { "Tal16float", TYPE_FLOAT
, 0, 0 },
338 { "Tal16double", TYPE_FLOAT
, 0, 0 },
339 { "Tal16ldouble", TYPE_FLOAT
, 0, 0 },
340 { "Tal16E0", TYPE_UENUM
, 0, ' ' },
341 { "Tal16E1", TYPE_UENUM
, 1, ' ' },
342 { "Tal16E2", TYPE_SENUM
, 3, ' ' },
343 { "Tal16E3", TYPE_SENUM
, 127, ' ' },
344 { "Tal16E4", TYPE_UENUM
, 255, ' ' },
345 { "Tal16E5", TYPE_SENUM
, 32767, ' ' },
346 { "Tal16E6", TYPE_UENUM
, 65535, ' ' },
347 { "Tal16E7", TYPE_SENUM
, 2147483647, ' ' },
348 { "Tal16E8", TYPE_UENUM
, 4294967295U, ' ' },
349 { "Tal16E9", TYPE_SENUM
, 1099511627775LL, ' ' }
350 #define NATYPES2 (sizeof (attrib_types) / sizeof (attrib_types[0]))
353 struct types bitfld_types
[NTYPES2
];
355 struct types aligned_bitfld_types
[NATYPES2
];
356 int n_aligned_bitfld_types
;
358 const char *attributes
[] = {
379 #define NATTRIBS2 (sizeof (attributes) / sizeof (attributes[0]))
396 enum ETYPE etype
: 8;
401 unsigned char arr_len
;
404 /* Used to chain together entries in the hash table. */
407 struct types attrib_array_types
[] = {
408 { "Talx1char", TYPE_UINT
, 127, 'C' },
409 { "Talx1schar", TYPE_INT
, 127, 'C' },
410 { "Talx1uchar", TYPE_UINT
, 255, 'C' },
411 { "Talx1short", TYPE_INT
, 32767, 'S' },
412 { "Talx1ushort", TYPE_UINT
, 65535, 'S' },
413 { "Talx1int", TYPE_INT
, 2147483647, 'I' },
414 { "Talx1uint", TYPE_UINT
, 4294967295U, 'I' },
415 { "Talx1long", TYPE_INT
, 9223372036854775807LL, 'L' },
416 { "Talx1ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
417 { "Talx1llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
418 { "Talx1ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
419 { "Talx1bool", TYPE_UINT
, 1, 'B' },
420 { "Talx1ptr", TYPE_PTR
, 0, 0 },
421 { "Talx1cptr", TYPE_PTR
, 0, 0 },
422 { "Talx1iptr", TYPE_PTR
, 0, 0 },
423 { "Talx1float", TYPE_FLOAT
, 0, 0 },
424 { "Talx1double", TYPE_FLOAT
, 0, 0 },
425 { "Talx1ldouble", TYPE_FLOAT
, 0, 0 },
426 { "Talx1E0", TYPE_UENUM
, 0, ' ' },
427 { "Talx1E1", TYPE_UENUM
, 1, ' ' },
428 { "Talx1E2", TYPE_SENUM
, 3, ' ' },
429 { "Talx1E3", TYPE_SENUM
, 127, ' ' },
430 { "Talx1E4", TYPE_UENUM
, 255, ' ' },
431 { "Talx1E5", TYPE_SENUM
, 32767, ' ' },
432 { "Talx1E6", TYPE_UENUM
, 65535, ' ' },
433 { "Talx1E7", TYPE_SENUM
, 2147483647, ' ' },
434 { "Talx1E8", TYPE_UENUM
, 4294967295U, ' ' },
435 { "Talx1E9", TYPE_SENUM
, 1099511627775LL, ' ' },
436 { "Talx2short", TYPE_INT
, 32767, 'S' },
437 { "Talx2ushort", TYPE_UINT
, 65535, 'S' },
438 { "Talx2int", TYPE_INT
, 2147483647, 'I' },
439 { "Talx2uint", TYPE_UINT
, 4294967295U, 'I' },
440 { "Talx2long", TYPE_INT
, 9223372036854775807LL, 'L' },
441 { "Talx2ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
442 { "Talx2llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
443 { "Talx2ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
444 { "Talx2ptr", TYPE_PTR
, 0, 0 },
445 { "Talx2cptr", TYPE_PTR
, 0, 0 },
446 { "Talx2iptr", TYPE_PTR
, 0, 0 },
447 { "Talx2float", TYPE_FLOAT
, 0, 0 },
448 { "Talx2double", TYPE_FLOAT
, 0, 0 },
449 { "Talx2ldouble", TYPE_FLOAT
, 0, 0 },
450 { "Talx2E0", TYPE_UENUM
, 0, ' ' },
451 { "Talx2E1", TYPE_UENUM
, 1, ' ' },
452 { "Talx2E2", TYPE_SENUM
, 3, ' ' },
453 { "Talx2E3", TYPE_SENUM
, 127, ' ' },
454 { "Talx2E4", TYPE_UENUM
, 255, ' ' },
455 { "Talx2E5", TYPE_SENUM
, 32767, ' ' },
456 { "Talx2E6", TYPE_UENUM
, 65535, ' ' },
457 { "Talx2E7", TYPE_SENUM
, 2147483647, ' ' },
458 { "Talx2E8", TYPE_UENUM
, 4294967295U, ' ' },
459 { "Talx2E9", TYPE_SENUM
, 1099511627775LL, ' ' },
460 { "Talx4int", TYPE_INT
, 2147483647, 'I' },
461 { "Talx4uint", TYPE_UINT
, 4294967295U, 'I' },
462 { "Talx4long", TYPE_INT
, 9223372036854775807LL, 'L' },
463 { "Talx4ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
464 { "Talx4llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
465 { "Talx4ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
466 { "Talx4ptr", TYPE_PTR
, 0, 0 },
467 { "Talx4cptr", TYPE_PTR
, 0, 0 },
468 { "Talx4iptr", TYPE_PTR
, 0, 0 },
469 { "Talx4float", TYPE_FLOAT
, 0, 0 },
470 { "Talx4double", TYPE_FLOAT
, 0, 0 },
471 { "Talx4ldouble", TYPE_FLOAT
, 0, 0 },
472 { "Talx4E0", TYPE_UENUM
, 0, ' ' },
473 { "Talx4E1", TYPE_UENUM
, 1, ' ' },
474 { "Talx4E2", TYPE_SENUM
, 3, ' ' },
475 { "Talx4E3", TYPE_SENUM
, 127, ' ' },
476 { "Talx4E4", TYPE_UENUM
, 255, ' ' },
477 { "Talx4E5", TYPE_SENUM
, 32767, ' ' },
478 { "Talx4E6", TYPE_UENUM
, 65535, ' ' },
479 { "Talx4E7", TYPE_SENUM
, 2147483647, ' ' },
480 { "Talx4E8", TYPE_UENUM
, 4294967295U, ' ' },
481 { "Talx4E9", TYPE_SENUM
, 1099511627775LL, ' ' },
482 { "Taly8long", TYPE_INT
, 9223372036854775807LL, 'L' },
483 { "Taly8ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
484 { "Talx8llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
485 { "Talx8ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
486 { "Taly8ptr", TYPE_PTR
, 0, 0 },
487 { "Taly8cptr", TYPE_PTR
, 0, 0 },
488 { "Taly8iptr", TYPE_PTR
, 0, 0 },
489 { "Talx8double", TYPE_FLOAT
, 0, 0 },
490 { "Talx8ldouble", TYPE_FLOAT
, 0, 0 }
491 #define NAATYPES2 (sizeof (attrib_array_types) / sizeof (attrib_array_types[0]))
494 /* A prime number giving the number of slots in the hash table. */
495 #define HASH_SIZE 32749
496 static struct entry
*hash_table
[HASH_SIZE
];
498 /* The index of the current type being output. */
501 /* The maximum index of the type(s) to output. */
504 /* Set to non-zero to output a single type in response to the -i option
505 (which sets LIMIDX to the index of the type to output. */
506 static int output_one
;
507 static int short_enums
;
508 static const char *destdir
;
509 static const char *srcdir
;
510 static const char *srcdir_safe
;
514 switchfiles (int fields
)
517 static char *destbuf
, *destptr
;
530 size_t len
= strlen (destdir
);
531 destbuf
= malloc (len
+ 20);
534 memcpy (destbuf
, destdir
, len
);
535 if (!len
|| destbuf
[len
- 1] != '/')
536 destbuf
[len
++] = '/';
537 destptr
= destbuf
+ len
;
539 sprintf (destptr
, "t%03d_main.C", filecnt
);
540 outfile
= fopen (destbuf
, "w");
544 fputs ("failed to create test files\n", stderr
);
548 for (i
= 0; i
< NDG_OPTIONS
; i
++)
549 fprintf (outfile
, dg_options
[i
], "", srcdir_safe
);
550 fprintf (outfile
, "\n\
551 #include \"struct-layout-1.h\"\n\
553 #define TX(n, type, attrs, fields, ops) extern void test##n (void);\n\
554 #include \"t%03d_test.h\"\n\
559 #define TX(n, type, attrs, fields, ops) test##n ();\n\
560 #include \"t%03d_test.h\"\n\
568 }\n", filecnt
, filecnt
);
570 sprintf (destptr
, "t%03d_x.C", filecnt
);
571 outfile
= fopen (destbuf
, "w");
574 for (i
= 0; i
< NDG_OPTIONS
; i
++)
575 fprintf (outfile
, dg_options
[i
], "-w ", srcdir_safe
);
576 fprintf (outfile
, "\n\
577 #include \"struct-layout-1_x1.h\"\n\
578 #include \"t%03d_test.h\"\n\
579 #include \"struct-layout-1_x2.h\"\n\
580 #include \"t%03d_test.h\"\n", filecnt
, filecnt
);
582 sprintf (destptr
, "t%03d_y.C", filecnt
);
583 outfile
= fopen (destbuf
, "w");
586 for (i
= 0; i
< NDG_OPTIONS
; i
++)
587 fprintf (outfile
, dg_options
[i
], "-w ", srcdir_safe
);
588 fprintf (outfile
, "\n\
589 #include \"struct-layout-1_y1.h\"\n\
590 #include \"t%03d_test.h\"\n\
591 #include \"struct-layout-1_y2.h\"\n\
592 #include \"t%03d_test.h\"\n", filecnt
, filecnt
);
594 sprintf (destptr
, "t%03d_test.h", filecnt
);
595 outfile
= fopen (destbuf
, "w");
600 else if (fields
<= 4)
602 else if (fields
<= 6)
608 unsigned long long int
611 unsigned long long int ret
;
612 ret
= generate_random () & 0xffffff;
613 ret
|= (generate_random () & 0xffffffLL
) << 24;
614 ret
|= ((unsigned long long int) generate_random ()) << 48;
618 /* Generate a subfield. The object pointed to by FLEX is set to a non-zero
619 value when the generated field is a flexible array member. When set, it
620 prevents subsequent fields from being generated (a flexible array member
621 must be the last member of the struct it's defined in). ARRAY is non-
622 zero when the enclosing structure is part of an array. In that case,
623 avoid generating a flexible array member as a subfield (such a member
624 would be invalid). */
627 subfield (struct entry
*e
, char *letter
, int *flex
, int array
)
636 case ETYPE_STRUCT_ARRAY
:
637 case ETYPE_UNION_ARRAY
:
638 type
= e
[0].attrib
? 1 + (generate_random () & 3) : 0;
639 if (e
[0].etype
== ETYPE_STRUCT
|| e
[0].etype
== ETYPE_STRUCT_ARRAY
)
643 if (e
[0].etype
== ETYPE_STRUCT_ARRAY
|| e
[0].etype
== ETYPE_UNION_ARRAY
)
645 if (e
[0].arr_len
== 255)
648 snprintf (buf
, 20, "%c[]", *letter
);
651 snprintf (buf
, 20, "%c[%d]", *letter
, e
[0].arr_len
);
652 /* If this is an array type, do not put aligned attributes on
653 elements. Aligning elements to a value greater than their
654 size will result in a compiler error. */
656 && ((strncmp (e
[0].attrib
, "atal", 4) == 0)
657 || strncmp (e
[0].attrib
, "atpaal", 6) == 0))
671 fprintf (outfile
, "%s{", p
);
674 fprintf (outfile
, "%s %s{", e
[0].attrib
, p
);
677 fprintf (outfile
, "%s %s{", p
, e
[0].attrib
);
681 for (i
= 1; !*flex
&& i
<= e
[0].len
; )
683 /* Avoid generating flexible array members if the enclosing
686 = (e
[0].etype
== ETYPE_STRUCT_ARRAY
687 || e
[0].etype
== ETYPE_UNION_ARRAY
);
688 i
+= subfield (e
+ i
, letter
, flex
, array
);
696 fprintf (outfile
, "}%s;", buf
);
699 fprintf (outfile
, "}%s %s;", e
[0].attrib
, buf
);
702 fprintf (outfile
, "}%s %s;", buf
, e
[0].attrib
);
708 if (e
[0].etype
== ETYPE_ARRAY
)
710 if (!array
&& e
[0].arr_len
== 255)
713 snprintf (buf
, 20, "%c[]", *letter
);
716 snprintf (buf
, 20, "%c[%d]", *letter
, e
[0].arr_len
);
726 /* If this is an array type, do not put aligned attributes on
727 elements. Aligning elements to a value greater than their
728 size will result in a compiler error. */
729 if (e
[0].etype
== ETYPE_ARRAY
730 && ((strncmp (e
[0].attrib
, "atal", 4) == 0)
731 || strncmp (e
[0].attrib
, "atpaal", 6) == 0))
734 type
= generate_random () % 3;
738 fprintf (outfile
, "%s %s %s;", e
[0].attrib
, e
[0].type
->name
,
742 fprintf (outfile
, "%s %s %s;", e
[0].type
->name
, e
[0].attrib
,
746 fprintf (outfile
, "%s %s %s;", e
[0].type
->name
, buf
,
752 fprintf (outfile
, "%s %s;", e
[0].type
->name
, buf
);
758 switch (generate_random () % 3)
761 fprintf (outfile
, "%s %s:0;", e
[0].attrib
, e
[0].type
->name
);
764 fprintf (outfile
, "%s %s:0;", e
[0].type
->name
, e
[0].attrib
);
767 fprintf (outfile
, "%s:0 %s;", e
[0].type
->name
, e
[0].attrib
);
771 fprintf (outfile
, "%s:0;", e
[0].type
->name
);
775 snprintf (buf
, 20, "%d", e
[0].len
);
777 switch (generate_random () % 3)
780 fprintf (outfile
, "%s %s %c:%s;", e
[0].attrib
, e
[0].type
->name
,
784 fprintf (outfile
, "%s %s %c:%s;", e
[0].type
->name
, e
[0].attrib
,
788 fprintf (outfile
, "%s %c:%s %s;", e
[0].type
->name
, *letter
,
793 fprintf (outfile
, "%s %c:%s;", e
[0].type
->name
, *letter
, buf
);
804 output_FNB (char mode
, struct entry
*e
)
806 unsigned long long int l1
, l2
, m
;
810 if (e
->type
->type
== TYPE_OTHER
)
814 fprintf (outfile
, "N(%d,%s)", idx
, namebuf
);
817 fprintf (outfile
, "%c(%d,%s,", mode
, idx
, namebuf
);
820 switch (e
->type
->type
)
823 signs
= generate_random () & 3;
826 m
&= e
->len
> 1 ? (1ULL << (e
->len
- 1)) - 1 : 1;
829 fprintf (outfile
, "%s%" COMPAT_PRLL
"u%s,%s%" COMPAT_PRLL
"u%s",
830 (signs
& 1) ? "-" : "", l1
, l1
> 2147483647 ? "LL" : "",
831 (signs
& 2) ? "-" : "", l2
, l2
> 2147483647 ? "LL" : "");
836 m
&= (1ULL << e
->len
) - 1;
839 fprintf (outfile
,"%" COMPAT_PRLL
"uU%s,%" COMPAT_PRLL
"uU%s",
840 l1
, l1
> 4294967295U ? "LL" : "",
841 l2
, l2
> 4294967295U ? "LL" : "");
846 signs
= generate_random () & 3;
847 fprintf (outfile
, "%s%f,%s%f", (signs
& 1) ? "-" : "",
848 ((double) l1
) / 64, (signs
& 2) ? "-" : "", ((double) l2
) / 64);
851 if (e
->type
->maxval
== 0)
852 fputs ("e0_0,e0_0", outfile
);
853 else if (e
->type
->maxval
== 1)
854 fprintf (outfile
, "e1_%" COMPAT_PRLL
"d,e1_%" COMPAT_PRLL
"d",
858 p
= strchr (e
->type
->name
, '\0');
859 while (--p
>= e
->type
->name
&& *p
>= '0' && *p
<= '9');
864 l1
+= e
->type
->maxval
- 6;
866 l2
+= e
->type
->maxval
- 6;
867 fprintf (outfile
, "e%s_%" COMPAT_PRLL
"d,e%s_%" COMPAT_PRLL
"d",
872 p
= strchr (e
->type
->name
, '\0');
873 while (--p
>= e
->type
->name
&& *p
>= '0' && *p
<= '9');
877 fprintf (outfile
, "e%s_%s%" COMPAT_PRLL
"d,e%s_%s%" COMPAT_PRLL
"d",
878 p
, l1
< 3 ? "m" : "",
879 l1
== 3 ? 0LL : e
->type
->maxval
- (l1
& 3),
880 p
, l2
< 3 ? "m" : "",
881 l2
== 3 ? 0LL : e
->type
->maxval
- (l2
& 3));
887 "(%s)&intarray[%" COMPAT_PRLL
"d], (%s)&intarray[%" COMPAT_PRLL
"d]",
888 e
->type
->name
, l1
, e
->type
->name
, l2
);
894 "fn%" COMPAT_PRLL
"d,fn%" COMPAT_PRLL
"d", l1
, l2
);
899 fputs (")", outfile
);
903 subvalues (struct entry
*e
, char *p
, char *letter
)
907 if (p
>= namebuf
+ sizeof (namebuf
) - 32)
914 case ETYPE_STRUCT_ARRAY
:
915 case ETYPE_UNION_ARRAY
:
916 if (e
[0].arr_len
== 0 || e
[0].arr_len
== 255)
918 *letter
+= 1 + e
[0].len
;
921 i
= generate_random () % e
[0].arr_len
;
922 snprintf (p
, sizeof (namebuf
) - (p
- namebuf
) - 1,
923 "%c[%d]", *letter
, i
);
924 q
= strchr (p
, '\0');
930 for (i
= 1; i
<= e
[0].len
; )
932 i
+= subvalues (e
+ i
, q
, letter
);
933 if (e
[0].etype
== ETYPE_UNION
|| e
[0].etype
== ETYPE_UNION_ARRAY
)
935 *letter
+= e
[0].len
- i
+ 1;
945 if (e
[0].arr_len
== 0 || e
[0].arr_len
== 255)
950 i
= generate_random () % e
[0].arr_len
;
951 snprintf (p
, sizeof (namebuf
) - (p
- namebuf
),
952 "%c[%d]", *letter
, i
);
954 if ((generate_random () & 7) == 0)
956 j
= generate_random () % e
[0].arr_len
;
959 snprintf (p
, sizeof (namebuf
) - (p
- namebuf
),
960 "%c[%d]", *letter
, j
);
975 --------------------------------------------------------------------
976 lookup2.c, by Bob Jenkins, December 1996, Public Domain.
977 hash(), hash2(), hash3, and mix() are externally useful functions.
978 Routines to test the hash are included if SELF_TEST is defined.
979 You can use this free for any purpose. It has no warranty.
980 --------------------------------------------------------------------
984 --------------------------------------------------------------------
985 mix -- mix 3 32-bit values reversibly.
986 For every delta with one or two bit set, and the deltas of all three
987 high bits or all three low bits, whether the original value of a,b,c
988 is almost all zero or is uniformly distributed,
989 * If mix() is run forward or backward, at least 32 bits in a,b,c
990 have at least 1/4 probability of changing.
991 * If mix() is run forward, every bit of c will change between 1/3 and
992 2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.)
993 mix() was built out of 36 single-cycle latency instructions in a
994 structure that could supported 2x parallelism, like so:
1000 c -= b; x = (b>>13);
1002 Unfortunately, superscalar Pentiums and Sparcs can't take advantage
1003 of that parallelism. They've also turned some of those single-cycle
1004 latency instructions into multi-cycle latency instructions. Still,
1005 this is the fastest good hash I could find. There were about 2^^68
1006 to choose from. I only looked at a billion or so.
1007 --------------------------------------------------------------------
1009 /* same, but slower, works on systems that might have 8 byte hashval_t's */
1010 #define mix(a,b,c) \
1012 a -= b; a -= c; a ^= (c>>13); \
1013 b -= c; b -= a; b ^= (a<< 8); \
1014 c -= a; c -= b; c ^= ((b&0xffffffff)>>13); \
1015 a -= b; a -= c; a ^= ((c&0xffffffff)>>12); \
1016 b -= c; b -= a; b = (b ^ (a<<16)) & 0xffffffff; \
1017 c -= a; c -= b; c = (c ^ (b>> 5)) & 0xffffffff; \
1018 a -= b; a -= c; a = (a ^ (c>> 3)) & 0xffffffff; \
1019 b -= c; b -= a; b = (b ^ (a<<10)) & 0xffffffff; \
1020 c -= a; c -= b; c = (c ^ (b>>15)) & 0xffffffff; \
1024 --------------------------------------------------------------------
1025 hash() -- hash a variable-length key into a 32-bit value
1026 k : the key (the unaligned variable-length array of bytes)
1027 len : the length of the key, counting by bytes
1028 level : can be any 4-byte value
1029 Returns a 32-bit value. Every bit of the key affects every bit of
1030 the return value. Every 1-bit and 2-bit delta achieves avalanche.
1031 About 36+6len instructions.
1033 The best hash table sizes are powers of 2. There is no need to do
1034 mod a prime (mod is sooo slow!). If you need less than 32 bits,
1035 use a bitmask. For example, if you need only 10 bits, do
1036 h = (h & hashmask(10));
1037 In which case, the hash table should have hashsize(10) elements.
1039 If you are hashing n strings (ub1 **)k, do it like this:
1040 for (i=0, h=0; i<n; ++i) h = hash( k[i], len[i], h);
1042 By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
1043 code any way you wish, private, educational, or commercial. It's free.
1045 See http://burtleburtle.net/bob/hash/evahash.html
1046 Use for hash table lookup, or anything where one collision in 2^32 is
1047 acceptable. Do NOT use for cryptographic purposes.
1048 --------------------------------------------------------------------
1052 iterative_hash (const void *k_in
/* the key */,
1053 size_t length
/* the length of the key */,
1054 hashval_t initval
/* the previous hash, or
1055 an arbitrary value */)
1057 const unsigned char *k
= (const unsigned char *)k_in
;
1058 hashval_t a
,b
,c
,len
;
1060 /* Set up the internal state */
1062 a
= b
= 0x9e3779b9; /* the golden ratio; an arbitrary value */
1063 c
= initval
; /* the previous hash value */
1065 /*---------------------------------------- handle most of the key */
1068 a
+= (k
[0] +((hashval_t
)k
[1]<<8) +((hashval_t
)k
[2]<<16) +((hashval_t
)k
[3]<<24));
1069 b
+= (k
[4] +((hashval_t
)k
[5]<<8) +((hashval_t
)k
[6]<<16) +((hashval_t
)k
[7]<<24));
1070 c
+= (k
[8] +((hashval_t
)k
[9]<<8) +((hashval_t
)k
[10]<<16)+((hashval_t
)k
[11]<<24));
1075 /*------------------------------------- handle the last 11 bytes */
1077 switch(len
) /* all the case statements fall through */
1079 case 11: c
+=((hashval_t
)k
[10]<<24);
1080 case 10: c
+=((hashval_t
)k
[9]<<16);
1081 case 9 : c
+=((hashval_t
)k
[8]<<8);
1082 /* the first byte of c is reserved for the length */
1083 case 8 : b
+=((hashval_t
)k
[7]<<24);
1084 case 7 : b
+=((hashval_t
)k
[6]<<16);
1085 case 6 : b
+=((hashval_t
)k
[5]<<8);
1087 case 4 : a
+=((hashval_t
)k
[3]<<24);
1088 case 3 : a
+=((hashval_t
)k
[2]<<16);
1089 case 2 : a
+=((hashval_t
)k
[1]<<8);
1091 /* case 0: nothing left to add */
1094 /*-------------------------------------------- report the result */
1099 e_hash (const void *a
)
1101 const struct entry
*e
= a
;
1105 if (e
[0].etype
!= ETYPE_STRUCT
&& e
[0].etype
!= ETYPE_UNION
)
1107 for (i
= 0; i
<= e
[0].len
; ++i
)
1110 ret
= iterative_hash (&e
[i
], offsetof (struct entry
, attrib
), ret
);
1111 attriblen
= e
[i
].attrib
? strlen (e
[i
].attrib
) : -1;
1112 ret
= iterative_hash (&attriblen
, sizeof (int), ret
);
1114 ret
= iterative_hash (e
[i
].attrib
, attriblen
, ret
);
1120 e_eq (const void *a
, const void *b
)
1122 const struct entry
*ea
= a
, *eb
= b
;
1124 if (ea
[0].etype
!= ETYPE_STRUCT
&& ea
[0].etype
!= ETYPE_UNION
)
1126 if (ea
[0].len
!= eb
[0].len
)
1128 for (i
= 0; i
<= ea
[0].len
; ++i
)
1130 if (ea
[i
].etype
!= eb
[i
].etype
1131 || ea
[i
].len
!= eb
[i
].len
1132 || ea
[i
].arr_len
!= eb
[i
].arr_len
1133 || ea
[i
].type
!= eb
[i
].type
)
1135 if ((ea
[i
].attrib
== NULL
) ^ (eb
[i
].attrib
== NULL
))
1137 if (ea
[i
].attrib
&& strcmp (ea
[i
].attrib
, eb
[i
].attrib
) != 0)
1144 e_exists (const struct entry
*e
)
1150 for (h
= hash_table
[hval
% HASH_SIZE
]; h
; h
= h
->next
)
1157 e_insert (struct entry
*e
)
1162 e
->next
= hash_table
[hval
% HASH_SIZE
];
1163 hash_table
[hval
% HASH_SIZE
] = e
;
1166 /* Output a single type. */
1168 output (struct entry
*e
)
1174 if (e
[0].etype
!= ETYPE_STRUCT
&& e
[0].etype
!= ETYPE_UNION
)
1180 n
= (struct entry
*) malloc ((e
[0].len
+ 1) * sizeof (struct entry
));
1181 memcpy (n
, e
, (e
[0].len
+ 1) * sizeof (struct entry
));
1185 switchfiles (e
[0].len
);
1187 if (e
[0].etype
== ETYPE_STRUCT
)
1188 fprintf (outfile
, "T(%d,", idx
);
1190 fprintf (outfile
, "U(%d,", idx
);
1194 for (i
= 1; i
<= e
[0].len
; )
1195 i
+= subfield (e
+ i
, &c
, &flex
, 0);
1197 fputs (",", outfile
);
1199 for (i
= 1; i
<= e
[0].len
; )
1201 i
+= subvalues (e
+ i
, namebuf
, &c
);
1202 if (e
[0].etype
== ETYPE_UNION
)
1205 fputs (")\n", outfile
);
1206 if (output_one
&& idx
== limidx
)
1214 FEATURE_ALIGNEDPACKED
= 2,
1215 FEATURE_ZEROARRAY
= 4,
1216 FEATURE_ZEROBITFLD
= 8,
1217 ALL_FEATURES
= FEATURE_VECTOR
| FEATURE_ZEROARRAY
1218 | FEATURE_ALIGNEDPACKED
| FEATURE_ZEROBITFLD
1222 singles (enum FEATURE features
)
1226 memset (e
, 0, sizeof (e
));
1227 e
[0].etype
= ETYPE_STRUCT
;
1229 e
[0].etype
= ETYPE_UNION
;
1232 for (i
= 0; i
< NTYPES2
; ++i
)
1234 e
[0].etype
= ETYPE_STRUCT
;
1235 e
[1].etype
= ETYPE_TYPE
;
1236 e
[1].type
= &base_types
[i
];
1238 e
[0].etype
= ETYPE_UNION
;
1241 if (features
& FEATURE_VECTOR
)
1242 for (i
= 0; i
< NVTYPES2
; ++i
)
1244 e
[0].etype
= ETYPE_STRUCT
;
1245 e
[1].etype
= ETYPE_TYPE
;
1246 e
[1].type
= &vector_types
[i
];
1248 e
[0].etype
= ETYPE_UNION
;
1254 choose_type (enum FEATURE features
, struct entry
*e
, int r
, int in_array
)
1258 i
= NTYPES2
- NTYPES1
;
1259 if (features
& FEATURE_VECTOR
)
1270 if (r
< NTYPES2
- NTYPES1
)
1271 e
->type
= &base_types
[r
+ NTYPES1
];
1272 r
-= NTYPES2
- NTYPES1
;
1273 if (e
->type
== NULL
&& (features
& FEATURE_VECTOR
))
1276 e
->type
= &vector_types
[r
];
1279 if (e
->type
== NULL
&& !in_array
)
1282 e
->type
= &attrib_types
[r
];
1285 if (e
->type
== NULL
&& in_array
)
1288 e
->type
= &attrib_array_types
[r
];
1291 if (e
->type
== NULL
)
1295 /* This is from gcc.c-torture/execute/builtin-bitops-1.c. */
1297 my_ffsll (unsigned long long x
)
1302 /* We've tested LLONG_MAX for 64 bits so this should be safe. */
1303 for (i
= 0; i
< 64; i
++)
1304 if (x
& (1ULL << i
))
1310 generate_fields (enum FEATURE features
, struct entry
*e
, struct entry
*parent
,
1313 int r
, i
, j
, ret
= 1, n
, incr
, sametype
;
1315 for (n
= 0; n
< len
; n
+= incr
)
1317 r
= generate_random ();
1318 /* 50% ETYPE_TYPE base_types NTYPES1
1319 12.5% ETYPE_TYPE other
1322 12.5% ETYPE_STRUCT|ETYPE_UNION|ETYPE_STRUCT_ARRAY|ETYPE_UNION_ARRAY */
1332 e
[n
].etype
= ETYPE_TYPE
;
1333 e
[n
].type
= &base_types
[r
% NTYPES1
];
1336 e
[n
].etype
= ETYPE_TYPE
;
1337 choose_type (features
, &e
[n
], r
, 0);
1340 e
[n
].etype
= ETYPE_ARRAY
;
1344 e
[n
].type
= &base_types
[r
% NTYPES1
];
1346 choose_type (features
, &e
[n
], r
, 1);
1347 r
= generate_random ();
1348 if ((features
& FEATURE_ZEROARRAY
) && (r
& 3) == 0)
1351 if (n
== len
- 1 && (r
& 4)
1352 && (parent
->etype
== ETYPE_STRUCT
1353 || parent
->etype
== ETYPE_STRUCT_ARRAY
))
1356 for (k
= 0; k
< n
; ++k
)
1357 if (e
[k
].etype
!= ETYPE_BITFLD
|| e
[k
].len
)
1364 else if ((r
& 3) != 3)
1365 e
[n
].arr_len
= (r
>> 2) & 7;
1367 e
[n
].arr_len
= (r
>> 2) & 31;
1380 incr
= 1 + (r
>> 3) % (len
- n
);
1385 incr
= 1 + (r
>> 3) % (len
- n
);
1388 for (j
= n
; j
< n
+ incr
; ++j
)
1392 e
[j
].etype
= ETYPE_BITFLD
;
1393 if (j
== n
|| !sametype
)
1396 r
= generate_random ();
1401 = &aligned_bitfld_types
[r
% n_aligned_bitfld_types
];
1404 = &bitfld_types
[r
% n_bitfld_types
];
1407 e
[j
].type
= e
[n
].type
;
1408 r
= generate_random ();
1411 switch (e
[j
].type
->bitfld
)
1413 case 'C': ma
= 8; break;
1414 case 'S': ma
= 16; break;
1415 case 'I': ma
= 32; break;
1417 case 'Q': ma
= 64; break;
1418 case 'B': ma
= 1; break;
1420 if (e
[j
].type
->type
== TYPE_UENUM
)
1421 mi
= my_ffsll (e
[j
].type
->maxval
+ 1) - 1;
1422 else if (e
[j
].type
->type
== TYPE_SENUM
)
1423 mi
= my_ffsll (e
[j
].type
->maxval
+ 1);
1430 else if (mi
> 16 || !short_enums
)
1441 if (sametype
&& (r
& 3) == 0 && ma
> 1)
1444 for (k
= n
; k
< j
; ++k
)
1447 e
[j
].len
= sum
? ma
- sum
: ma
;
1450 if (!sametype
&& (r
& 7) == 0)
1453 if (! (features
& FEATURE_ZEROBITFLD
) && mi
== 0)
1455 if (e
[j
].len
< mi
|| e
[j
].len
> ma
)
1456 e
[j
].len
= mi
+ (r
% (ma
+ 1 - mi
));
1458 if ((features
& FEATURE_ZEROBITFLD
) && (r
& 3) == 0
1469 e
[n
].etype
= ETYPE_STRUCT
;
1473 e
[n
].etype
= ETYPE_UNION
;
1477 e
[n
].etype
= ETYPE_STRUCT_ARRAY
;
1480 e
[n
].etype
= ETYPE_UNION_ARRAY
;
1484 e
[n
].len
= r
% (len
- n
);
1485 incr
= 1 + e
[n
].len
;
1486 generate_fields (features
, &e
[n
+ 1], &e
[n
], e
[n
].len
);
1487 if (e
[n
].etype
== ETYPE_STRUCT_ARRAY
1488 || e
[n
].etype
== ETYPE_UNION_ARRAY
)
1490 r
= generate_random ();
1491 if ((features
& FEATURE_ZEROARRAY
) && (r
& 3) == 0)
1494 if (n
+ incr
== len
&& (r
& 4)
1495 && (parent
->etype
== ETYPE_STRUCT
1496 || parent
->etype
== ETYPE_STRUCT_ARRAY
))
1499 for (k
= 0; k
< n
; ++k
)
1500 if (e
[k
].etype
!= ETYPE_BITFLD
|| e
[k
].len
)
1507 else if ((r
& 3) != 3)
1508 e
[n
].arr_len
= (r
>> 2) & 7;
1510 e
[n
].arr_len
= (r
>> 2) & 31;
1514 r
= generate_random ();
1518 i
= (features
& FEATURE_ALIGNEDPACKED
) ? NATTRIBS2
: NATTRIBS1
;
1519 e
[n
].attrib
= attributes
[r
% i
];
1520 if (! (features
& FEATURE_ALIGNEDPACKED
)
1521 && strcmp (e
[n
].attrib
, "atpa") == 0
1522 && ((e
[n
].type
>= &attrib_types
[0]
1523 && e
[n
].type
< &attrib_types
[NATYPES2
])
1524 || (e
[n
].type
>= &attrib_array_types
[0]
1525 && e
[n
].type
< &attrib_array_types
[NAATYPES2
])
1526 || (e
[n
].type
>= &aligned_bitfld_types
[0]
1527 && e
[n
].type
< &aligned_bitfld_types
[n_aligned_bitfld_types
])))
1534 generate_random_tests (enum FEATURE features
, int len
)
1536 struct entry e
[len
+ 1];
1538 if (len
> 'z' - 'a' + 1)
1540 memset (e
, 0, sizeof (e
));
1541 r
= generate_random ();
1543 e
[0].etype
= ETYPE_UNION
;
1545 e
[0].etype
= ETYPE_STRUCT
;
1548 generate_fields (features
, &e
[1], &e
[0], len
);
1552 struct { const char *name
; enum FEATURE f
; }
1555 { "vector", FEATURE_VECTOR
},
1556 { "[0] :0", FEATURE_ZEROARRAY
| FEATURE_ZEROBITFLD
},
1558 FEATURE_VECTOR
| FEATURE_ZEROARRAY
},
1559 { "aligned packed vector [0] :0",
1560 FEATURE_VECTOR
| FEATURE_ZEROARRAY
1561 | FEATURE_ALIGNEDPACKED
| FEATURE_ZEROBITFLD
},
1565 main (int argc
, char **argv
)
1567 int i
, j
, count
, c
, n
= 3000;
1570 if (sizeof (int) != 4 || sizeof (long long) != 8)
1577 if (argv
[i
][0] == '-' && argv
[i
][2] == '\0')
1579 optarg
= argv
[i
+ 1];
1595 limidx
= atoi (optarg
);
1602 fprintf (stderr
, "unrecognized option %s\n", argv
[i
]);
1610 outfile
= fopen ("/dev/null", "w");
1611 if (outfile
== NULL
)
1613 fputs ("could not open /dev/null", stderr
);
1619 if (destdir
== NULL
&& !output_one
)
1622 fprintf (stderr
, "Usage:\n\
1623 %s [-e] [-s srcdir -d destdir] [-n count] [-i idx]\n\
1624 Either -s srcdir -d destdir or -i idx must be used\n", argv
[0]);
1628 if (srcdir
== NULL
&& !output_one
)
1633 const char *s
= srcdir
;
1635 t
= ss
= malloc (strlen (srcdir
) + 1);
1647 for (i
= 0; i
< NTYPES2
; ++i
)
1648 if (base_types
[i
].bitfld
)
1649 bitfld_types
[n_bitfld_types
++] = base_types
[i
];
1650 for (i
= 0; i
< NATYPES2
; ++i
)
1651 if (attrib_types
[i
].bitfld
)
1652 aligned_bitfld_types
[n_aligned_bitfld_types
++] = attrib_types
[i
];
1653 for (i
= 0; i
< sizeof (features
) / sizeof (features
[0]); ++i
)
1662 for (j
= 1; j
<= 9; ++j
)
1663 while (idx
< startidx
+ j
* count
)
1664 generate_random_tests (features
[i
].f
, j
);
1665 while (idx
< startidx
+ count
* 10)
1666 generate_random_tests (features
[i
].f
, 10 + (generate_random () % 16));
1668 for (i
= 0; n
> 3000 && i
< sizeof (features
) / sizeof (features
[0]); ++i
)
1674 singles (features
[i
].f
);
1678 while (idx
< startidx
+ 1000)
1679 generate_random_tests (features
[i
].f
, 1);
1685 while (idx
< startidx
+ 100)
1686 generate_random_tests (features
[i
].f
, 1);
1689 for (j
= 2; j
<= 9; ++j
)
1690 while (idx
< startidx
+ (j
- 1) * count
)
1691 generate_random_tests (features
[i
].f
, j
);
1692 while (idx
< startidx
+ count
* 9)
1693 generate_random_tests (features
[i
].f
, 10 + (generate_random () % 16));
1698 generate_random_tests (ALL_FEATURES
, 1 + (generate_random () % 25));