1 /* Structure layout test generator.
2 Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
3 Contributed by Jakub Jelinek <jakub@redhat.com>.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
22 /* Compile with gcc -o struct-layout-1_generate{,.c} generate_random{,_r}.c */
24 /* N.B. -- This program cannot use libiberty as that will not work
25 when testing an installed compiler. */
31 /* We use our own pseudo-random number generator, so that it gives the same
32 values on all hosts. */
33 #include "../../gcc.dg/compat/generate-random.h"
35 #if LLONG_MAX != 9223372036854775807LL && __LONG_LONG_MAX__ != 9223372036854775807LL
36 # error Need 64-bit long long
39 #if defined __MSVCRT__
40 #define COMPAT_PRLL "I64"
42 #define COMPAT_PRLL "ll"
45 const char *dg_options
[] = {
46 "/* { dg-options \"%s-I%s\" } */\n",
47 "/* { dg-options \"%s-I%s -mno-mmx -Wno-abi\" { target i?86-*-* x86_64-*-* } } */\n",
48 "/* { dg-options \"%s-I%s -fno-common\" { target hppa*-*-hpux* powerpc*-*-darwin* *-*-mingw32* *-*-cygwin* } } */\n",
49 "/* { dg-options \"%s-I%s -mno-mmx -fno-common -Wno-abi\" { target i?86-*-darwin* x86_64-*-darwin* } } */\n",
50 "/* { dg-options \"%s-I%s -mno-base-addresses\" { target mmix-*-* } } */\n",
51 "/* { dg-options \"%s-I%s -mlongcalls -mtext-section-literals\" { target xtensa*-*-* } } */\n"
52 #define NDG_OPTIONS (sizeof (dg_options) / sizeof (dg_options[0]))
55 typedef unsigned int hashval_t
;
73 unsigned long long int maxval
;
77 struct types base_types
[] = {
78 /* As we don't know whether char will be signed or not, just limit ourselves
79 to unsigned values less than maximum signed char value. */
80 { "char", TYPE_UINT
, 127, 'C' },
81 { "signed char", TYPE_INT
, 127, 'C' },
82 { "unsigned char", TYPE_UINT
, 255, 'C' },
83 { "short int", TYPE_INT
, 32767, 'S' },
84 { "unsigned short int", TYPE_UINT
, 65535, 'S' },
85 { "int", TYPE_INT
, 2147483647, 'I' },
86 { "unsigned int", TYPE_UINT
, 4294967295U, 'I' },
87 { "long int", TYPE_INT
, 9223372036854775807LL, 'L' },
88 { "unsigned long int", TYPE_UINT
, 18446744073709551615ULL, 'L' },
89 { "long long int", TYPE_INT
, 9223372036854775807LL, 'Q' },
90 { "unsigned long long int", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
91 { "bool", TYPE_UINT
, 1, 'B' },
92 { "void *", TYPE_PTR
, 0, 0 },
93 { "char *", TYPE_PTR
, 0, 0 },
94 { "int *", TYPE_PTR
, 0, 0 },
95 { "float", TYPE_FLOAT
, 0, 0 },
96 { "double", TYPE_FLOAT
, 0, 0 },
97 { "long double", TYPE_FLOAT
, 0, 0 },
99 { "Tchar", TYPE_UINT
, 127, 'C' },
100 { "Tschar", TYPE_INT
, 127, 'C' },
101 { "Tuchar", TYPE_UINT
, 255, 'C' },
102 { "Tshort", TYPE_INT
, 32767, 'S' },
103 { "Tushort", TYPE_UINT
, 65535, 'S' },
104 { "Tint", TYPE_INT
, 2147483647, 'I' },
105 { "Tuint", TYPE_UINT
, 4294967295U, 'I' },
106 { "Tlong", TYPE_INT
, 9223372036854775807LL, 'L' },
107 { "Tulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
108 { "Tllong", TYPE_INT
, 9223372036854775807LL, 'Q' },
109 { "Tullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
110 { "Tbool", TYPE_UINT
, 1, 'B' },
111 { "size_t", TYPE_UINT
, 18446744073709551615ULL, 0 },
112 { "Tptr", TYPE_PTR
, 0, 0 },
113 { "Tcptr", TYPE_PTR
, 0, 0 },
114 { "Tiptr", TYPE_PTR
, 0, 0 },
115 { "Tfnptr", TYPE_FNPTR
, 0, 0 },
116 { "Tfloat", TYPE_FLOAT
, 0, 0 },
117 { "Tdouble", TYPE_FLOAT
, 0, 0 },
118 { "Tldouble", TYPE_FLOAT
, 0, 0 },
119 { "enum E0", TYPE_UENUM
, 0, ' ' },
120 { "enum E1", TYPE_UENUM
, 1, ' ' },
121 { "enum E2", TYPE_SENUM
, 3, ' ' },
122 { "enum E3", TYPE_SENUM
, 127, ' ' },
123 { "enum E4", TYPE_UENUM
, 255, ' ' },
124 { "enum E5", TYPE_SENUM
, 32767, ' ' },
125 { "enum E6", TYPE_UENUM
, 65535, ' ' },
126 { "enum E7", TYPE_SENUM
, 2147483647, ' ' },
127 { "enum E8", TYPE_UENUM
, 4294967295U, ' ' },
128 { "enum E9", TYPE_SENUM
, 1099511627775LL, ' ' },
129 { "TE0", TYPE_UENUM
, 0, ' ' },
130 { "TE1", TYPE_UENUM
, 1, ' ' },
131 { "TE2", TYPE_SENUM
, 3, ' ' },
132 { "TE3", TYPE_SENUM
, 127, ' ' },
133 { "TE4", TYPE_UENUM
, 255, ' ' },
134 { "TE5", TYPE_SENUM
, 32767, ' ' },
135 { "TE6", TYPE_UENUM
, 65535, ' ' },
136 { "TE7", TYPE_SENUM
, 2147483647, ' ' },
137 { "TE8", TYPE_UENUM
, 4294967295U, ' ' },
138 { "TE9", TYPE_SENUM
, 1099511627775LL, ' ' },
139 /* vector-defs.h typedefs */
140 { "qi", TYPE_INT
, 127, 0 },
141 { "hi", TYPE_INT
, 32767, 0 },
142 { "si", TYPE_INT
, 2147483647, 0 },
143 { "di", TYPE_INT
, 9223372036854775807LL, 0 },
144 { "sf", TYPE_FLOAT
, 0, 0 },
145 { "df", TYPE_FLOAT
, 0, 0 }
146 #define NTYPES2 (sizeof (base_types) / sizeof (base_types[0]))
148 struct types vector_types
[] = {
149 /* vector-defs.h typedefs */
150 { "v8qi", TYPE_OTHER
, 0, 0 },
151 { "v16qi", TYPE_OTHER
, 0, 0 },
152 { "v2hi", TYPE_OTHER
, 0, 0 },
153 { "v4hi", TYPE_OTHER
, 0, 0 },
154 { "v8hi", TYPE_OTHER
, 0, 0 },
155 { "v2si", TYPE_OTHER
, 0, 0 },
156 { "v4si", TYPE_OTHER
, 0, 0 },
157 { "v1di", TYPE_OTHER
, 0, 0 },
158 { "v2di", TYPE_OTHER
, 0, 0 },
159 { "v2sf", TYPE_OTHER
, 0, 0 },
160 { "v4sf", TYPE_OTHER
, 0, 0 },
161 { "v16sf", TYPE_OTHER
, 0, 0 },
162 { "v2df", TYPE_OTHER
, 0, 0 },
163 { "u8qi", TYPE_OTHER
, 0, 0 },
164 { "u16qi", TYPE_OTHER
, 0, 0 },
165 { "u2hi", TYPE_OTHER
, 0, 0 },
166 { "u4hi", TYPE_OTHER
, 0, 0 },
167 { "u8hi", TYPE_OTHER
, 0, 0 },
168 { "u2si", TYPE_OTHER
, 0, 0 },
169 { "u4si", TYPE_OTHER
, 0, 0 },
170 { "u1di", TYPE_OTHER
, 0, 0 },
171 { "u2di", TYPE_OTHER
, 0, 0 },
172 { "u2sf", TYPE_OTHER
, 0, 0 },
173 { "u4sf", TYPE_OTHER
, 0, 0 },
174 { "u16sf", TYPE_OTHER
, 0, 0 },
175 { "u2df", TYPE_OTHER
, 0, 0 },
176 { "__m64", TYPE_OTHER
, 0, 0 },
177 { "__m128", TYPE_OTHER
, 0, 0 }
178 #define NVTYPES2 (sizeof (vector_types) / sizeof (vector_types[0]))
180 struct types attrib_types
[] = {
181 { "Talchar", TYPE_UINT
, 127, 'C' },
182 { "Talschar", TYPE_INT
, 127, 'C' },
183 { "Taluchar", TYPE_UINT
, 255, 'C' },
184 { "Talshort", TYPE_INT
, 32767, 'S' },
185 { "Talushort", TYPE_UINT
, 65535, 'S' },
186 { "Talint", TYPE_INT
, 2147483647, 'I' },
187 { "Taluint", TYPE_UINT
, 4294967295U, 'I' },
188 { "Tallong", TYPE_INT
, 9223372036854775807LL, 'L' },
189 { "Talulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
190 { "Talllong", TYPE_INT
, 9223372036854775807LL, 'Q' },
191 { "Talullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
192 { "Talbool", TYPE_UINT
, 1, 'B' },
193 { "Talptr", TYPE_PTR
, 0, 0 },
194 { "Talcptr", TYPE_PTR
, 0, 0 },
195 { "Taliptr", TYPE_PTR
, 0, 0 },
196 { "Talfloat", TYPE_FLOAT
, 0, 0 },
197 { "Taldouble", TYPE_FLOAT
, 0, 0 },
198 { "Talldouble", TYPE_FLOAT
, 0, 0 },
199 { "TalE0", TYPE_UENUM
, 0, ' ' },
200 { "TalE1", TYPE_UENUM
, 1, ' ' },
201 { "TalE2", TYPE_SENUM
, 3, ' ' },
202 { "TalE3", TYPE_SENUM
, 127, ' ' },
203 { "TalE4", TYPE_UENUM
, 255, ' ' },
204 { "TalE5", TYPE_SENUM
, 32767, ' ' },
205 { "TalE6", TYPE_UENUM
, 65535, ' ' },
206 { "TalE7", TYPE_SENUM
, 2147483647, ' ' },
207 { "TalE8", TYPE_UENUM
, 4294967295U, ' ' },
208 { "TalE9", TYPE_SENUM
, 1099511627775LL, ' ' },
209 { "Tal1char", TYPE_UINT
, 127, 'C' },
210 { "Tal1schar", TYPE_INT
, 127, 'C' },
211 { "Tal1uchar", TYPE_UINT
, 255, 'C' },
212 { "Tal1short", TYPE_INT
, 32767, 'S' },
213 { "Tal1ushort", TYPE_UINT
, 65535, 'S' },
214 { "Tal1int", TYPE_INT
, 2147483647, 'I' },
215 { "Tal1uint", TYPE_UINT
, 4294967295U, 'I' },
216 { "Tal1long", TYPE_INT
, 9223372036854775807LL, 'L' },
217 { "Tal1ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
218 { "Tal1llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
219 { "Tal1ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
220 { "Tal1bool", TYPE_UINT
, 1, 'B' },
221 { "Tal1ptr", TYPE_PTR
, 0, 0 },
222 { "Tal1cptr", TYPE_PTR
, 0, 0 },
223 { "Tal1iptr", TYPE_PTR
, 0, 0 },
224 { "Tal1float", TYPE_FLOAT
, 0, 0 },
225 { "Tal1double", TYPE_FLOAT
, 0, 0 },
226 { "Tal1ldouble", TYPE_FLOAT
, 0, 0 },
227 { "Tal1E0", TYPE_UENUM
, 0, ' ' },
228 { "Tal1E1", TYPE_UENUM
, 1, ' ' },
229 { "Tal1E2", TYPE_SENUM
, 3, ' ' },
230 { "Tal1E3", TYPE_SENUM
, 127, ' ' },
231 { "Tal1E4", TYPE_UENUM
, 255, ' ' },
232 { "Tal1E5", TYPE_SENUM
, 32767, ' ' },
233 { "Tal1E6", TYPE_UENUM
, 65535, ' ' },
234 { "Tal1E7", TYPE_SENUM
, 2147483647, ' ' },
235 { "Tal1E8", TYPE_UENUM
, 4294967295U, ' ' },
236 { "Tal1E9", TYPE_SENUM
, 1099511627775LL, ' ' },
237 { "Tal2char", TYPE_UINT
, 127, 'C' },
238 { "Tal2schar", TYPE_INT
, 127, 'C' },
239 { "Tal2uchar", TYPE_UINT
, 255, 'C' },
240 { "Tal2short", TYPE_INT
, 32767, 'S' },
241 { "Tal2ushort", TYPE_UINT
, 65535, 'S' },
242 { "Tal2int", TYPE_INT
, 2147483647, 'I' },
243 { "Tal2uint", TYPE_UINT
, 4294967295U, 'I' },
244 { "Tal2long", TYPE_INT
, 9223372036854775807LL, 'L' },
245 { "Tal2ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
246 { "Tal2llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
247 { "Tal2ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
248 { "Tal2bool", TYPE_UINT
, 1, 'B' },
249 { "Tal2ptr", TYPE_PTR
, 0, 0 },
250 { "Tal2cptr", TYPE_PTR
, 0, 0 },
251 { "Tal2iptr", TYPE_PTR
, 0, 0 },
252 { "Tal2float", TYPE_FLOAT
, 0, 0 },
253 { "Tal2double", TYPE_FLOAT
, 0, 0 },
254 { "Tal2ldouble", TYPE_FLOAT
, 0, 0 },
255 { "Tal2E0", TYPE_UENUM
, 0, ' ' },
256 { "Tal2E1", TYPE_UENUM
, 1, ' ' },
257 { "Tal2E2", TYPE_SENUM
, 3, ' ' },
258 { "Tal2E3", TYPE_SENUM
, 127, ' ' },
259 { "Tal2E4", TYPE_UENUM
, 255, ' ' },
260 { "Tal2E5", TYPE_SENUM
, 32767, ' ' },
261 { "Tal2E6", TYPE_UENUM
, 65535, ' ' },
262 { "Tal2E7", TYPE_SENUM
, 2147483647, ' ' },
263 { "Tal2E8", TYPE_UENUM
, 4294967295U, ' ' },
264 { "Tal2E9", TYPE_SENUM
, 1099511627775LL, ' ' },
265 { "Tal4char", TYPE_UINT
, 127, 'C' },
266 { "Tal4schar", TYPE_INT
, 127, 'C' },
267 { "Tal4uchar", TYPE_UINT
, 255, 'C' },
268 { "Tal4short", TYPE_INT
, 32767, 'S' },
269 { "Tal4ushort", TYPE_UINT
, 65535, 'S' },
270 { "Tal4int", TYPE_INT
, 2147483647, 'I' },
271 { "Tal4uint", TYPE_UINT
, 4294967295U, 'I' },
272 { "Tal4long", TYPE_INT
, 9223372036854775807LL, 'L' },
273 { "Tal4ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
274 { "Tal4llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
275 { "Tal4ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
276 { "Tal4bool", TYPE_UINT
, 1, 'B' },
277 { "Tal4ptr", TYPE_PTR
, 0, 0 },
278 { "Tal4cptr", TYPE_PTR
, 0, 0 },
279 { "Tal4iptr", TYPE_PTR
, 0, 0 },
280 { "Tal4float", TYPE_FLOAT
, 0, 0 },
281 { "Tal4double", TYPE_FLOAT
, 0, 0 },
282 { "Tal4ldouble", TYPE_FLOAT
, 0, 0 },
283 { "Tal4E0", TYPE_UENUM
, 0, ' ' },
284 { "Tal4E1", TYPE_UENUM
, 1, ' ' },
285 { "Tal4E2", TYPE_SENUM
, 3, ' ' },
286 { "Tal4E3", TYPE_SENUM
, 127, ' ' },
287 { "Tal4E4", TYPE_UENUM
, 255, ' ' },
288 { "Tal4E5", TYPE_SENUM
, 32767, ' ' },
289 { "Tal4E6", TYPE_UENUM
, 65535, ' ' },
290 { "Tal4E7", TYPE_SENUM
, 2147483647, ' ' },
291 { "Tal4E8", TYPE_UENUM
, 4294967295U, ' ' },
292 { "Tal4E9", TYPE_SENUM
, 1099511627775LL, ' ' },
293 { "Tal8char", TYPE_UINT
, 127, 'C' },
294 { "Tal8schar", TYPE_INT
, 127, 'C' },
295 { "Tal8uchar", TYPE_UINT
, 255, 'C' },
296 { "Tal8short", TYPE_INT
, 32767, 'S' },
297 { "Tal8ushort", TYPE_UINT
, 65535, 'S' },
298 { "Tal8int", TYPE_INT
, 2147483647, 'I' },
299 { "Tal8uint", TYPE_UINT
, 4294967295U, 'I' },
300 { "Tal8long", TYPE_INT
, 9223372036854775807LL, 'L' },
301 { "Tal8ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
302 { "Tal8llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
303 { "Tal8ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
304 { "Tal8bool", TYPE_UINT
, 1, 'B' },
305 { "Tal8ptr", TYPE_PTR
, 0, 0 },
306 { "Tal8cptr", TYPE_PTR
, 0, 0 },
307 { "Tal8iptr", TYPE_PTR
, 0, 0 },
308 { "Tal8float", TYPE_FLOAT
, 0, 0 },
309 { "Tal8double", TYPE_FLOAT
, 0, 0 },
310 { "Tal8ldouble", TYPE_FLOAT
, 0, 0 },
311 { "Tal8E0", TYPE_UENUM
, 0, ' ' },
312 { "Tal8E1", TYPE_UENUM
, 1, ' ' },
313 { "Tal8E2", TYPE_SENUM
, 3, ' ' },
314 { "Tal8E3", TYPE_SENUM
, 127, ' ' },
315 { "Tal8E4", TYPE_UENUM
, 255, ' ' },
316 { "Tal8E5", TYPE_SENUM
, 32767, ' ' },
317 { "Tal8E6", TYPE_UENUM
, 65535, ' ' },
318 { "Tal8E7", TYPE_SENUM
, 2147483647, ' ' },
319 { "Tal8E8", TYPE_UENUM
, 4294967295U, ' ' },
320 { "Tal8E9", TYPE_SENUM
, 1099511627775LL, ' ' },
321 { "Tal16char", TYPE_UINT
, 127, 'C' },
322 { "Tal16schar", TYPE_INT
, 127, 'C' },
323 { "Tal16uchar", TYPE_UINT
, 255, 'C' },
324 { "Tal16short", TYPE_INT
, 32767, 'S' },
325 { "Tal16ushort", TYPE_UINT
, 65535, 'S' },
326 { "Tal16int", TYPE_INT
, 2147483647, 'I' },
327 { "Tal16uint", TYPE_UINT
, 4294967295U, 'I' },
328 { "Tal16long", TYPE_INT
, 9223372036854775807LL, 'L' },
329 { "Tal16ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
330 { "Tal16llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
331 { "Tal16ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
332 { "Tal16bool", TYPE_UINT
, 1, 'B' },
333 { "Tal16ptr", TYPE_PTR
, 0, 0 },
334 { "Tal16cptr", TYPE_PTR
, 0, 0 },
335 { "Tal16iptr", TYPE_PTR
, 0, 0 },
336 { "Tal16float", TYPE_FLOAT
, 0, 0 },
337 { "Tal16double", TYPE_FLOAT
, 0, 0 },
338 { "Tal16ldouble", TYPE_FLOAT
, 0, 0 },
339 { "Tal16E0", TYPE_UENUM
, 0, ' ' },
340 { "Tal16E1", TYPE_UENUM
, 1, ' ' },
341 { "Tal16E2", TYPE_SENUM
, 3, ' ' },
342 { "Tal16E3", TYPE_SENUM
, 127, ' ' },
343 { "Tal16E4", TYPE_UENUM
, 255, ' ' },
344 { "Tal16E5", TYPE_SENUM
, 32767, ' ' },
345 { "Tal16E6", TYPE_UENUM
, 65535, ' ' },
346 { "Tal16E7", TYPE_SENUM
, 2147483647, ' ' },
347 { "Tal16E8", TYPE_UENUM
, 4294967295U, ' ' },
348 { "Tal16E9", TYPE_SENUM
, 1099511627775LL, ' ' }
349 #define NATYPES2 (sizeof (attrib_types) / sizeof (attrib_types[0]))
352 struct types bitfld_types
[NTYPES2
];
354 struct types aligned_bitfld_types
[NATYPES2
];
355 int n_aligned_bitfld_types
;
357 const char *attributes
[] = {
378 #define NATTRIBS2 (sizeof (attributes) / sizeof (attributes[0]))
395 enum ETYPE etype
: 8;
400 unsigned char arr_len
;
403 /* Used to chain together entries in the hash table. */
406 struct types attrib_array_types
[] = {
407 { "Talx1char", TYPE_UINT
, 127, 'C' },
408 { "Talx1schar", TYPE_INT
, 127, 'C' },
409 { "Talx1uchar", TYPE_UINT
, 255, 'C' },
410 { "Talx1short", TYPE_INT
, 32767, 'S' },
411 { "Talx1ushort", TYPE_UINT
, 65535, 'S' },
412 { "Talx1int", TYPE_INT
, 2147483647, 'I' },
413 { "Talx1uint", TYPE_UINT
, 4294967295U, 'I' },
414 { "Talx1long", TYPE_INT
, 9223372036854775807LL, 'L' },
415 { "Talx1ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
416 { "Talx1llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
417 { "Talx1ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
418 { "Talx1bool", TYPE_UINT
, 1, 'B' },
419 { "Talx1ptr", TYPE_PTR
, 0, 0 },
420 { "Talx1cptr", TYPE_PTR
, 0, 0 },
421 { "Talx1iptr", TYPE_PTR
, 0, 0 },
422 { "Talx1float", TYPE_FLOAT
, 0, 0 },
423 { "Talx1double", TYPE_FLOAT
, 0, 0 },
424 { "Talx1ldouble", TYPE_FLOAT
, 0, 0 },
425 { "Talx1E0", TYPE_UENUM
, 0, ' ' },
426 { "Talx1E1", TYPE_UENUM
, 1, ' ' },
427 { "Talx1E2", TYPE_SENUM
, 3, ' ' },
428 { "Talx1E3", TYPE_SENUM
, 127, ' ' },
429 { "Talx1E4", TYPE_UENUM
, 255, ' ' },
430 { "Talx1E5", TYPE_SENUM
, 32767, ' ' },
431 { "Talx1E6", TYPE_UENUM
, 65535, ' ' },
432 { "Talx1E7", TYPE_SENUM
, 2147483647, ' ' },
433 { "Talx1E8", TYPE_UENUM
, 4294967295U, ' ' },
434 { "Talx1E9", TYPE_SENUM
, 1099511627775LL, ' ' },
435 { "Talx2short", TYPE_INT
, 32767, 'S' },
436 { "Talx2ushort", TYPE_UINT
, 65535, 'S' },
437 { "Talx2int", TYPE_INT
, 2147483647, 'I' },
438 { "Talx2uint", TYPE_UINT
, 4294967295U, 'I' },
439 { "Talx2long", TYPE_INT
, 9223372036854775807LL, 'L' },
440 { "Talx2ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
441 { "Talx2llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
442 { "Talx2ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
443 { "Talx2ptr", TYPE_PTR
, 0, 0 },
444 { "Talx2cptr", TYPE_PTR
, 0, 0 },
445 { "Talx2iptr", TYPE_PTR
, 0, 0 },
446 { "Talx2float", TYPE_FLOAT
, 0, 0 },
447 { "Talx2double", TYPE_FLOAT
, 0, 0 },
448 { "Talx2ldouble", TYPE_FLOAT
, 0, 0 },
449 { "Talx2E0", TYPE_UENUM
, 0, ' ' },
450 { "Talx2E1", TYPE_UENUM
, 1, ' ' },
451 { "Talx2E2", TYPE_SENUM
, 3, ' ' },
452 { "Talx2E3", TYPE_SENUM
, 127, ' ' },
453 { "Talx2E4", TYPE_UENUM
, 255, ' ' },
454 { "Talx2E5", TYPE_SENUM
, 32767, ' ' },
455 { "Talx2E6", TYPE_UENUM
, 65535, ' ' },
456 { "Talx2E7", TYPE_SENUM
, 2147483647, ' ' },
457 { "Talx2E8", TYPE_UENUM
, 4294967295U, ' ' },
458 { "Talx2E9", TYPE_SENUM
, 1099511627775LL, ' ' },
459 { "Talx4int", TYPE_INT
, 2147483647, 'I' },
460 { "Talx4uint", TYPE_UINT
, 4294967295U, 'I' },
461 { "Talx4long", TYPE_INT
, 9223372036854775807LL, 'L' },
462 { "Talx4ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
463 { "Talx4llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
464 { "Talx4ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
465 { "Talx4ptr", TYPE_PTR
, 0, 0 },
466 { "Talx4cptr", TYPE_PTR
, 0, 0 },
467 { "Talx4iptr", TYPE_PTR
, 0, 0 },
468 { "Talx4float", TYPE_FLOAT
, 0, 0 },
469 { "Talx4double", TYPE_FLOAT
, 0, 0 },
470 { "Talx4ldouble", TYPE_FLOAT
, 0, 0 },
471 { "Talx4E0", TYPE_UENUM
, 0, ' ' },
472 { "Talx4E1", TYPE_UENUM
, 1, ' ' },
473 { "Talx4E2", TYPE_SENUM
, 3, ' ' },
474 { "Talx4E3", TYPE_SENUM
, 127, ' ' },
475 { "Talx4E4", TYPE_UENUM
, 255, ' ' },
476 { "Talx4E5", TYPE_SENUM
, 32767, ' ' },
477 { "Talx4E6", TYPE_UENUM
, 65535, ' ' },
478 { "Talx4E7", TYPE_SENUM
, 2147483647, ' ' },
479 { "Talx4E8", TYPE_UENUM
, 4294967295U, ' ' },
480 { "Talx4E9", TYPE_SENUM
, 1099511627775LL, ' ' },
481 { "Taly8long", TYPE_INT
, 9223372036854775807LL, 'L' },
482 { "Taly8ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
483 { "Talx8llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
484 { "Talx8ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
485 { "Taly8ptr", TYPE_PTR
, 0, 0 },
486 { "Taly8cptr", TYPE_PTR
, 0, 0 },
487 { "Taly8iptr", TYPE_PTR
, 0, 0 },
488 { "Talx8double", TYPE_FLOAT
, 0, 0 },
489 { "Talx8ldouble", TYPE_FLOAT
, 0, 0 }
490 #define NAATYPES2 (sizeof (attrib_array_types) / sizeof (attrib_array_types[0]))
493 /* A prime number giving the number of slots in the hash table. */
494 #define HASH_SIZE 32749
495 static struct entry
*hash_table
[HASH_SIZE
];
497 static int idx
, limidx
, output_one
, short_enums
;
498 static const char *destdir
;
499 static const char *srcdir
;
500 static const char *srcdir_safe
;
504 switchfiles (int fields
)
507 static char *destbuf
, *destptr
;
520 size_t len
= strlen (destdir
);
521 destbuf
= malloc (len
+ 20);
524 memcpy (destbuf
, destdir
, len
);
525 if (!len
|| destbuf
[len
- 1] != '/')
526 destbuf
[len
++] = '/';
527 destptr
= destbuf
+ len
;
529 sprintf (destptr
, "t%03d_main.C", filecnt
);
530 outfile
= fopen (destbuf
, "w");
534 fputs ("failed to create test files\n", stderr
);
537 for (i
= 0; i
< NDG_OPTIONS
; i
++)
538 fprintf (outfile
, dg_options
[i
], "", srcdir_safe
);
539 fprintf (outfile
, "\n\
540 #include \"struct-layout-1.h\"\n\
542 #define TX(n, type, attrs, fields, ops) extern void test##n (void);\n\
543 #include \"t%03d_test.h\"\n\
548 #define TX(n, type, attrs, fields, ops) test##n ();\n\
549 #include \"t%03d_test.h\"\n\
557 }\n", filecnt
, filecnt
);
559 sprintf (destptr
, "t%03d_x.C", filecnt
);
560 outfile
= fopen (destbuf
, "w");
563 for (i
= 0; i
< NDG_OPTIONS
; i
++)
564 fprintf (outfile
, dg_options
[i
], "-w ", srcdir_safe
);
565 fprintf (outfile
, "\n\
566 #include \"struct-layout-1_x1.h\"\n\
567 #include \"t%03d_test.h\"\n\
568 #include \"struct-layout-1_x2.h\"\n\
569 #include \"t%03d_test.h\"\n", filecnt
, filecnt
);
571 sprintf (destptr
, "t%03d_y.C", filecnt
);
572 outfile
= fopen (destbuf
, "w");
575 for (i
= 0; i
< NDG_OPTIONS
; i
++)
576 fprintf (outfile
, dg_options
[i
], "-w ", srcdir_safe
);
577 fprintf (outfile
, "\n\
578 #include \"struct-layout-1_y1.h\"\n\
579 #include \"t%03d_test.h\"\n\
580 #include \"struct-layout-1_y2.h\"\n\
581 #include \"t%03d_test.h\"\n", filecnt
, filecnt
);
583 sprintf (destptr
, "t%03d_test.h", filecnt
);
584 outfile
= fopen (destbuf
, "w");
589 else if (fields
<= 4)
591 else if (fields
<= 6)
597 unsigned long long int
600 unsigned long long int ret
;
601 ret
= generate_random () & 0xffffff;
602 ret
|= (generate_random () & 0xffffffLL
) << 24;
603 ret
|= ((unsigned long long int) generate_random ()) << 48;
608 subfield (struct entry
*e
, char *letter
)
617 case ETYPE_STRUCT_ARRAY
:
618 case ETYPE_UNION_ARRAY
:
619 type
= e
[0].attrib
? 1 + (generate_random () & 3) : 0;
620 if (e
[0].etype
== ETYPE_STRUCT
|| e
[0].etype
== ETYPE_STRUCT_ARRAY
)
624 if (e
[0].etype
== ETYPE_STRUCT_ARRAY
|| e
[0].etype
== ETYPE_UNION_ARRAY
)
626 if (e
[0].arr_len
== 255)
627 snprintf (buf
, 20, "%c[]", *letter
);
629 snprintf (buf
, 20, "%c[%d]", *letter
, e
[0].arr_len
);
630 /* If this is an array type, do not put aligned attributes on
631 elements. Aligning elements to a value greater than their
632 size will result in a compiler error. */
634 && ((strncmp (e
[0].attrib
, "atal", 4) == 0)
635 || strncmp (e
[0].attrib
, "atpaal", 6) == 0))
649 fprintf (outfile
, "%s{", p
);
652 fprintf (outfile
, "%s %s{", e
[0].attrib
, p
);
655 fprintf (outfile
, "%s %s{", p
, e
[0].attrib
);
659 for (i
= 1; i
<= e
[0].len
; )
660 i
+= subfield (e
+ i
, letter
);
667 fprintf (outfile
, "}%s;", buf
);
670 fprintf (outfile
, "}%s %s;", e
[0].attrib
, buf
);
673 fprintf (outfile
, "}%s %s;", buf
, e
[0].attrib
);
679 if (e
[0].etype
== ETYPE_ARRAY
)
681 if (e
[0].arr_len
== 255)
682 snprintf (buf
, 20, "%c[]", *letter
);
684 snprintf (buf
, 20, "%c[%d]", *letter
, e
[0].arr_len
);
694 /* If this is an array type, do not put aligned attributes on
695 elements. Aligning elements to a value greater than their
696 size will result in a compiler error. */
697 if (e
[0].etype
== ETYPE_ARRAY
698 && ((strncmp (e
[0].attrib
, "atal", 4) == 0)
699 || strncmp (e
[0].attrib
, "atpaal", 6) == 0))
702 type
= generate_random () % 3;
706 fprintf (outfile
, "%s %s %s;", e
[0].attrib
, e
[0].type
->name
,
710 fprintf (outfile
, "%s %s %s;", e
[0].type
->name
, e
[0].attrib
,
714 fprintf (outfile
, "%s %s %s;", e
[0].type
->name
, buf
,
720 fprintf (outfile
, "%s %s;", e
[0].type
->name
, buf
);
726 switch (generate_random () % 3)
729 fprintf (outfile
, "%s %s:0;", e
[0].attrib
, e
[0].type
->name
);
732 fprintf (outfile
, "%s %s:0;", e
[0].type
->name
, e
[0].attrib
);
735 fprintf (outfile
, "%s:0 %s;", e
[0].type
->name
, e
[0].attrib
);
739 fprintf (outfile
, "%s:0;", e
[0].type
->name
);
743 snprintf (buf
, 20, "%d", e
[0].len
);
745 switch (generate_random () % 3)
748 fprintf (outfile
, "%s %s %c:%s;", e
[0].attrib
, e
[0].type
->name
,
752 fprintf (outfile
, "%s %s %c:%s;", e
[0].type
->name
, e
[0].attrib
,
756 fprintf (outfile
, "%s %c:%s %s;", e
[0].type
->name
, *letter
,
761 fprintf (outfile
, "%s %c:%s;", e
[0].type
->name
, *letter
, buf
);
772 output_FNB (char mode
, struct entry
*e
)
774 unsigned long long int l1
, l2
, m
;
778 if (e
->type
->type
== TYPE_OTHER
)
782 fprintf (outfile
, "N(%d,%s)", idx
, namebuf
);
785 fprintf (outfile
, "%c(%d,%s,", mode
, idx
, namebuf
);
788 switch (e
->type
->type
)
791 signs
= generate_random () & 3;
794 m
&= e
->len
> 1 ? (1ULL << (e
->len
- 1)) - 1 : 1;
797 fprintf (outfile
, "%s%" COMPAT_PRLL
"u%s,%s%" COMPAT_PRLL
"u%s",
798 (signs
& 1) ? "-" : "", l1
, l1
> 2147483647 ? "LL" : "",
799 (signs
& 2) ? "-" : "", l2
, l2
> 2147483647 ? "LL" : "");
804 m
&= (1ULL << e
->len
) - 1;
807 fprintf (outfile
,"%" COMPAT_PRLL
"uU%s,%" COMPAT_PRLL
"uU%s",
808 l1
, l1
> 4294967295U ? "LL" : "",
809 l2
, l2
> 4294967295U ? "LL" : "");
814 signs
= generate_random () & 3;
815 fprintf (outfile
, "%s%f,%s%f", (signs
& 1) ? "-" : "",
816 ((double) l1
) / 64, (signs
& 2) ? "-" : "", ((double) l2
) / 64);
819 if (e
->type
->maxval
== 0)
820 fputs ("e0_0,e0_0", outfile
);
821 else if (e
->type
->maxval
== 1)
822 fprintf (outfile
, "e1_%" COMPAT_PRLL
"d,e1_%" COMPAT_PRLL
"d",
826 p
= strchr (e
->type
->name
, '\0');
827 while (--p
>= e
->type
->name
&& *p
>= '0' && *p
<= '9');
832 l1
+= e
->type
->maxval
- 6;
834 l2
+= e
->type
->maxval
- 6;
835 fprintf (outfile
, "e%s_%" COMPAT_PRLL
"d,e%s_%" COMPAT_PRLL
"d",
840 p
= strchr (e
->type
->name
, '\0');
841 while (--p
>= e
->type
->name
&& *p
>= '0' && *p
<= '9');
845 fprintf (outfile
, "e%s_%s%" COMPAT_PRLL
"d,e%s_%s%" COMPAT_PRLL
"d",
846 p
, l1
< 3 ? "m" : "",
847 l1
== 3 ? 0LL : e
->type
->maxval
- (l1
& 3),
848 p
, l2
< 3 ? "m" : "",
849 l2
== 3 ? 0LL : e
->type
->maxval
- (l2
& 3));
855 "(%s)&intarray[%" COMPAT_PRLL
"d], (%s)&intarray[%" COMPAT_PRLL
"d]",
856 e
->type
->name
, l1
, e
->type
->name
, l2
);
862 "fn%" COMPAT_PRLL
"d,fn%" COMPAT_PRLL
"d", l1
, l2
);
867 fputs (")", outfile
);
871 subvalues (struct entry
*e
, char *p
, char *letter
)
875 if (p
>= namebuf
+ sizeof (namebuf
) - 32)
882 case ETYPE_STRUCT_ARRAY
:
883 case ETYPE_UNION_ARRAY
:
884 if (e
[0].arr_len
== 0 || e
[0].arr_len
== 255)
886 *letter
+= 1 + e
[0].len
;
889 i
= generate_random () % e
[0].arr_len
;
890 snprintf (p
, sizeof (namebuf
) - (p
- namebuf
) - 1,
891 "%c[%d]", *letter
, i
);
892 q
= strchr (p
, '\0');
898 for (i
= 1; i
<= e
[0].len
; )
900 i
+= subvalues (e
+ i
, q
, letter
);
901 if (e
[0].etype
== ETYPE_UNION
|| e
[0].etype
== ETYPE_UNION_ARRAY
)
903 *letter
+= e
[0].len
- i
+ 1;
913 if (e
[0].arr_len
== 0 || e
[0].arr_len
== 255)
918 i
= generate_random () % e
[0].arr_len
;
919 snprintf (p
, sizeof (namebuf
) - (p
- namebuf
),
920 "%c[%d]", *letter
, i
);
922 if ((generate_random () & 7) == 0)
924 j
= generate_random () % e
[0].arr_len
;
927 snprintf (p
, sizeof (namebuf
) - (p
- namebuf
),
928 "%c[%d]", *letter
, j
);
943 --------------------------------------------------------------------
944 lookup2.c, by Bob Jenkins, December 1996, Public Domain.
945 hash(), hash2(), hash3, and mix() are externally useful functions.
946 Routines to test the hash are included if SELF_TEST is defined.
947 You can use this free for any purpose. It has no warranty.
948 --------------------------------------------------------------------
952 --------------------------------------------------------------------
953 mix -- mix 3 32-bit values reversibly.
954 For every delta with one or two bit set, and the deltas of all three
955 high bits or all three low bits, whether the original value of a,b,c
956 is almost all zero or is uniformly distributed,
957 * If mix() is run forward or backward, at least 32 bits in a,b,c
958 have at least 1/4 probability of changing.
959 * If mix() is run forward, every bit of c will change between 1/3 and
960 2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.)
961 mix() was built out of 36 single-cycle latency instructions in a
962 structure that could supported 2x parallelism, like so:
970 Unfortunately, superscalar Pentiums and Sparcs can't take advantage
971 of that parallelism. They've also turned some of those single-cycle
972 latency instructions into multi-cycle latency instructions. Still,
973 this is the fastest good hash I could find. There were about 2^^68
974 to choose from. I only looked at a billion or so.
975 --------------------------------------------------------------------
977 /* same, but slower, works on systems that might have 8 byte hashval_t's */
980 a -= b; a -= c; a ^= (c>>13); \
981 b -= c; b -= a; b ^= (a<< 8); \
982 c -= a; c -= b; c ^= ((b&0xffffffff)>>13); \
983 a -= b; a -= c; a ^= ((c&0xffffffff)>>12); \
984 b -= c; b -= a; b = (b ^ (a<<16)) & 0xffffffff; \
985 c -= a; c -= b; c = (c ^ (b>> 5)) & 0xffffffff; \
986 a -= b; a -= c; a = (a ^ (c>> 3)) & 0xffffffff; \
987 b -= c; b -= a; b = (b ^ (a<<10)) & 0xffffffff; \
988 c -= a; c -= b; c = (c ^ (b>>15)) & 0xffffffff; \
992 --------------------------------------------------------------------
993 hash() -- hash a variable-length key into a 32-bit value
994 k : the key (the unaligned variable-length array of bytes)
995 len : the length of the key, counting by bytes
996 level : can be any 4-byte value
997 Returns a 32-bit value. Every bit of the key affects every bit of
998 the return value. Every 1-bit and 2-bit delta achieves avalanche.
999 About 36+6len instructions.
1001 The best hash table sizes are powers of 2. There is no need to do
1002 mod a prime (mod is sooo slow!). If you need less than 32 bits,
1003 use a bitmask. For example, if you need only 10 bits, do
1004 h = (h & hashmask(10));
1005 In which case, the hash table should have hashsize(10) elements.
1007 If you are hashing n strings (ub1 **)k, do it like this:
1008 for (i=0, h=0; i<n; ++i) h = hash( k[i], len[i], h);
1010 By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
1011 code any way you wish, private, educational, or commercial. It's free.
1013 See http://burtleburtle.net/bob/hash/evahash.html
1014 Use for hash table lookup, or anything where one collision in 2^32 is
1015 acceptable. Do NOT use for cryptographic purposes.
1016 --------------------------------------------------------------------
1020 iterative_hash (const void *k_in
/* the key */,
1021 register size_t length
/* the length of the key */,
1022 register hashval_t initval
/* the previous hash, or
1023 an arbitrary value */)
1025 register const unsigned char *k
= (const unsigned char *)k_in
;
1026 register hashval_t a
,b
,c
,len
;
1028 /* Set up the internal state */
1030 a
= b
= 0x9e3779b9; /* the golden ratio; an arbitrary value */
1031 c
= initval
; /* the previous hash value */
1033 /*---------------------------------------- handle most of the key */
1036 a
+= (k
[0] +((hashval_t
)k
[1]<<8) +((hashval_t
)k
[2]<<16) +((hashval_t
)k
[3]<<24));
1037 b
+= (k
[4] +((hashval_t
)k
[5]<<8) +((hashval_t
)k
[6]<<16) +((hashval_t
)k
[7]<<24));
1038 c
+= (k
[8] +((hashval_t
)k
[9]<<8) +((hashval_t
)k
[10]<<16)+((hashval_t
)k
[11]<<24));
1043 /*------------------------------------- handle the last 11 bytes */
1045 switch(len
) /* all the case statements fall through */
1047 case 11: c
+=((hashval_t
)k
[10]<<24);
1048 case 10: c
+=((hashval_t
)k
[9]<<16);
1049 case 9 : c
+=((hashval_t
)k
[8]<<8);
1050 /* the first byte of c is reserved for the length */
1051 case 8 : b
+=((hashval_t
)k
[7]<<24);
1052 case 7 : b
+=((hashval_t
)k
[6]<<16);
1053 case 6 : b
+=((hashval_t
)k
[5]<<8);
1055 case 4 : a
+=((hashval_t
)k
[3]<<24);
1056 case 3 : a
+=((hashval_t
)k
[2]<<16);
1057 case 2 : a
+=((hashval_t
)k
[1]<<8);
1059 /* case 0: nothing left to add */
1062 /*-------------------------------------------- report the result */
1067 e_hash (const void *a
)
1069 const struct entry
*e
= a
;
1073 if (e
[0].etype
!= ETYPE_STRUCT
&& e
[0].etype
!= ETYPE_UNION
)
1075 for (i
= 0; i
<= e
[0].len
; ++i
)
1078 ret
= iterative_hash (&e
[i
], offsetof (struct entry
, attrib
), ret
);
1079 attriblen
= e
[i
].attrib
? strlen (e
[i
].attrib
) : -1;
1080 ret
= iterative_hash (&attriblen
, sizeof (int), ret
);
1082 ret
= iterative_hash (e
[i
].attrib
, attriblen
, ret
);
1088 e_eq (const void *a
, const void *b
)
1090 const struct entry
*ea
= a
, *eb
= b
;
1092 if (ea
[0].etype
!= ETYPE_STRUCT
&& ea
[0].etype
!= ETYPE_UNION
)
1094 if (ea
[0].len
!= eb
[0].len
)
1096 for (i
= 0; i
<= ea
[0].len
; ++i
)
1098 if (ea
[i
].etype
!= eb
[i
].etype
1099 || ea
[i
].len
!= eb
[i
].len
1100 || ea
[i
].arr_len
!= eb
[i
].arr_len
1101 || ea
[i
].type
!= eb
[i
].type
)
1103 if ((ea
[i
].attrib
== NULL
) ^ (eb
[i
].attrib
== NULL
))
1105 if (ea
[i
].attrib
&& strcmp (ea
[i
].attrib
, eb
[i
].attrib
) != 0)
1112 e_exists (const struct entry
*e
)
1118 for (h
= hash_table
[hval
% HASH_SIZE
]; h
; h
= h
->next
)
1125 e_insert (struct entry
*e
)
1130 e
->next
= hash_table
[hval
% HASH_SIZE
];
1131 hash_table
[hval
% HASH_SIZE
] = e
;
1135 output (struct entry
*e
)
1141 if (e
[0].etype
!= ETYPE_STRUCT
&& e
[0].etype
!= ETYPE_UNION
)
1147 n
= (struct entry
*) malloc ((e
[0].len
+ 1) * sizeof (struct entry
));
1148 memcpy (n
, e
, (e
[0].len
+ 1) * sizeof (struct entry
));
1152 switchfiles (e
[0].len
);
1154 if (e
[0].etype
== ETYPE_STRUCT
)
1155 fprintf (outfile
, "T(%d,", idx
);
1157 fprintf (outfile
, "U(%d,", idx
);
1159 for (i
= 1; i
<= e
[0].len
; )
1160 i
+= subfield (e
+ i
, &c
);
1161 fputs (",", outfile
);
1163 for (i
= 1; i
<= e
[0].len
; )
1165 i
+= subvalues (e
+ i
, namebuf
, &c
);
1166 if (e
[0].etype
== ETYPE_UNION
)
1169 fputs (")\n", outfile
);
1170 if (output_one
&& idx
== limidx
)
1178 FEATURE_ALIGNEDPACKED
= 2,
1179 FEATURE_ZEROARRAY
= 4,
1180 FEATURE_ZEROBITFLD
= 8,
1181 ALL_FEATURES
= FEATURE_VECTOR
| FEATURE_ZEROARRAY
1182 | FEATURE_ALIGNEDPACKED
| FEATURE_ZEROBITFLD
1186 singles (enum FEATURE features
)
1190 memset (e
, 0, sizeof (e
));
1191 e
[0].etype
= ETYPE_STRUCT
;
1193 e
[0].etype
= ETYPE_UNION
;
1196 for (i
= 0; i
< NTYPES2
; ++i
)
1198 e
[0].etype
= ETYPE_STRUCT
;
1199 e
[1].etype
= ETYPE_TYPE
;
1200 e
[1].type
= &base_types
[i
];
1202 e
[0].etype
= ETYPE_UNION
;
1205 if (features
& FEATURE_VECTOR
)
1206 for (i
= 0; i
< NVTYPES2
; ++i
)
1208 e
[0].etype
= ETYPE_STRUCT
;
1209 e
[1].etype
= ETYPE_TYPE
;
1210 e
[1].type
= &vector_types
[i
];
1212 e
[0].etype
= ETYPE_UNION
;
1218 choose_type (enum FEATURE features
, struct entry
*e
, int r
, int in_array
)
1222 i
= NTYPES2
- NTYPES1
;
1223 if (features
& FEATURE_VECTOR
)
1234 if (r
< NTYPES2
- NTYPES1
)
1235 e
->type
= &base_types
[r
+ NTYPES1
];
1236 r
-= NTYPES2
- NTYPES1
;
1237 if (e
->type
== NULL
&& (features
& FEATURE_VECTOR
))
1240 e
->type
= &vector_types
[r
];
1243 if (e
->type
== NULL
&& !in_array
)
1246 e
->type
= &attrib_types
[r
];
1249 if (e
->type
== NULL
&& in_array
)
1252 e
->type
= &attrib_array_types
[r
];
1255 if (e
->type
== NULL
)
1259 /* This is from gcc.c-torture/execute/builtin-bitops-1.c. */
1261 my_ffsll (unsigned long long x
)
1266 /* We've tested LLONG_MAX for 64 bits so this should be safe. */
1267 for (i
= 0; i
< 64; i
++)
1268 if (x
& (1ULL << i
))
1274 generate_fields (enum FEATURE features
, struct entry
*e
, struct entry
*parent
,
1277 int r
, i
, j
, ret
= 1, n
, incr
, sametype
;
1279 for (n
= 0; n
< len
; n
+= incr
)
1281 r
= generate_random ();
1282 /* 50% ETYPE_TYPE base_types NTYPES1
1283 12.5% ETYPE_TYPE other
1286 12.5% ETYPE_STRUCT|ETYPE_UNION|ETYPE_STRUCT_ARRAY|ETYPE_UNION_ARRAY */
1296 e
[n
].etype
= ETYPE_TYPE
;
1297 e
[n
].type
= &base_types
[r
% NTYPES1
];
1300 e
[n
].etype
= ETYPE_TYPE
;
1301 choose_type (features
, &e
[n
], r
, 0);
1304 e
[n
].etype
= ETYPE_ARRAY
;
1308 e
[n
].type
= &base_types
[r
% NTYPES1
];
1310 choose_type (features
, &e
[n
], r
, 1);
1311 r
= generate_random ();
1312 if ((features
& FEATURE_ZEROARRAY
) && (r
& 3) == 0)
1315 if (n
== len
- 1 && (r
& 4)
1316 && (parent
->etype
== ETYPE_STRUCT
1317 || parent
->etype
== ETYPE_STRUCT_ARRAY
))
1320 for (k
= 0; k
< n
; ++k
)
1321 if (e
[k
].etype
!= ETYPE_BITFLD
|| e
[k
].len
)
1328 else if ((r
& 3) != 3)
1329 e
[n
].arr_len
= (r
>> 2) & 7;
1331 e
[n
].arr_len
= (r
>> 2) & 31;
1344 incr
= 1 + (r
>> 3) % (len
- n
);
1349 incr
= 1 + (r
>> 3) % (len
- n
);
1352 for (j
= n
; j
< n
+ incr
; ++j
)
1356 e
[j
].etype
= ETYPE_BITFLD
;
1357 if (j
== n
|| !sametype
)
1360 r
= generate_random ();
1365 = &aligned_bitfld_types
[r
% n_aligned_bitfld_types
];
1368 = &bitfld_types
[r
% n_bitfld_types
];
1371 e
[j
].type
= e
[n
].type
;
1372 r
= generate_random ();
1375 switch (e
[j
].type
->bitfld
)
1377 case 'C': ma
= 8; break;
1378 case 'S': ma
= 16; break;
1379 case 'I': ma
= 32; break;
1381 case 'Q': ma
= 64; break;
1382 case 'B': ma
= 1; break;
1384 if (e
[j
].type
->type
== TYPE_UENUM
)
1385 mi
= my_ffsll (e
[j
].type
->maxval
+ 1) - 1;
1386 else if (e
[j
].type
->type
== TYPE_SENUM
)
1387 mi
= my_ffsll (e
[j
].type
->maxval
+ 1);
1394 else if (mi
> 16 || !short_enums
)
1405 if (sametype
&& (r
& 3) == 0 && ma
> 1)
1408 for (k
= n
; k
< j
; ++k
)
1411 e
[j
].len
= sum
? ma
- sum
: ma
;
1414 if (!sametype
&& (r
& 7) == 0)
1417 if (! (features
& FEATURE_ZEROBITFLD
) && mi
== 0)
1419 if (e
[j
].len
< mi
|| e
[j
].len
> ma
)
1420 e
[j
].len
= mi
+ (r
% (ma
+ 1 - mi
));
1422 if ((features
& FEATURE_ZEROBITFLD
) && (r
& 3) == 0
1433 e
[n
].etype
= ETYPE_STRUCT
;
1437 e
[n
].etype
= ETYPE_UNION
;
1441 e
[n
].etype
= ETYPE_STRUCT_ARRAY
;
1444 e
[n
].etype
= ETYPE_UNION_ARRAY
;
1448 e
[n
].len
= r
% (len
- n
);
1449 incr
= 1 + e
[n
].len
;
1450 generate_fields (features
, &e
[n
+ 1], &e
[n
], e
[n
].len
);
1451 if (e
[n
].etype
== ETYPE_STRUCT_ARRAY
1452 || e
[n
].etype
== ETYPE_UNION_ARRAY
)
1454 r
= generate_random ();
1455 if ((features
& FEATURE_ZEROARRAY
) && (r
& 3) == 0)
1458 if (n
+ incr
== len
&& (r
& 4)
1459 && (parent
->etype
== ETYPE_STRUCT
1460 || parent
->etype
== ETYPE_STRUCT_ARRAY
))
1463 for (k
= 0; k
< n
; ++k
)
1464 if (e
[k
].etype
!= ETYPE_BITFLD
|| e
[k
].len
)
1471 else if ((r
& 3) != 3)
1472 e
[n
].arr_len
= (r
>> 2) & 7;
1474 e
[n
].arr_len
= (r
>> 2) & 31;
1478 r
= generate_random ();
1482 i
= (features
& FEATURE_ALIGNEDPACKED
) ? NATTRIBS2
: NATTRIBS1
;
1483 e
[n
].attrib
= attributes
[r
% i
];
1484 if (! (features
& FEATURE_ALIGNEDPACKED
)
1485 && strcmp (e
[n
].attrib
, "atpa") == 0
1486 && ((e
[n
].type
>= &attrib_types
[0]
1487 && e
[n
].type
< &attrib_types
[NATYPES2
])
1488 || (e
[n
].type
>= &attrib_array_types
[0]
1489 && e
[n
].type
< &attrib_array_types
[NAATYPES2
])
1490 || (e
[n
].type
>= &aligned_bitfld_types
[0]
1491 && e
[n
].type
< &aligned_bitfld_types
[n_aligned_bitfld_types
])))
1498 generate_random_tests (enum FEATURE features
, int len
)
1500 struct entry e
[len
+ 1];
1502 if (len
> 'z' - 'a' + 1)
1504 memset (e
, 0, sizeof (e
));
1505 r
= generate_random ();
1507 e
[0].etype
= ETYPE_UNION
;
1509 e
[0].etype
= ETYPE_STRUCT
;
1512 generate_fields (features
, &e
[1], &e
[0], len
);
1516 struct { const char *name
; enum FEATURE f
; }
1519 { "vector", FEATURE_VECTOR
},
1520 { "[0] :0", FEATURE_ZEROARRAY
| FEATURE_ZEROBITFLD
},
1522 FEATURE_VECTOR
| FEATURE_ZEROARRAY
},
1523 { "aligned packed vector [0] :0",
1524 FEATURE_VECTOR
| FEATURE_ZEROARRAY
1525 | FEATURE_ALIGNEDPACKED
| FEATURE_ZEROBITFLD
},
1529 main (int argc
, char **argv
)
1531 int i
, j
, count
, c
, n
= 3000;
1534 if (sizeof (int) != 4 || sizeof (long long) != 8)
1541 if (argv
[i
][0] == '-' && argv
[i
][2] == '\0')
1543 optarg
= argv
[i
+ 1];
1559 limidx
= atoi (optarg
);
1566 fprintf (stderr
, "unrecognized option %s\n", argv
[i
]);
1574 outfile
= fopen ("/dev/null", "w");
1575 if (outfile
== NULL
)
1577 fputs ("could not open /dev/null", stderr
);
1583 if (destdir
== NULL
&& !output_one
)
1586 fprintf (stderr
, "Usage:\n\
1587 %s [-e] [-s srcdir -d destdir] [-n count] [-i idx]\n\
1588 Either -s srcdir -d destdir or -i idx must be used\n", argv
[0]);
1592 if (srcdir
== NULL
&& !output_one
)
1597 const char *s
= srcdir
;
1599 t
= ss
= malloc (strlen (srcdir
) + 1);
1611 for (i
= 0; i
< NTYPES2
; ++i
)
1612 if (base_types
[i
].bitfld
)
1613 bitfld_types
[n_bitfld_types
++] = base_types
[i
];
1614 for (i
= 0; i
< NATYPES2
; ++i
)
1615 if (attrib_types
[i
].bitfld
)
1616 aligned_bitfld_types
[n_aligned_bitfld_types
++] = attrib_types
[i
];
1617 for (i
= 0; i
< sizeof (features
) / sizeof (features
[0]); ++i
)
1626 for (j
= 1; j
<= 9; ++j
)
1627 while (idx
< startidx
+ j
* count
)
1628 generate_random_tests (features
[i
].f
, j
);
1629 while (idx
< startidx
+ count
* 10)
1630 generate_random_tests (features
[i
].f
, 10 + (generate_random () % 16));
1632 for (i
= 0; n
> 3000 && i
< sizeof (features
) / sizeof (features
[0]); ++i
)
1638 singles (features
[i
].f
);
1642 while (idx
< startidx
+ 1000)
1643 generate_random_tests (features
[i
].f
, 1);
1649 while (idx
< startidx
+ 100)
1650 generate_random_tests (features
[i
].f
, 1);
1653 for (j
= 2; j
<= 9; ++j
)
1654 while (idx
< startidx
+ (j
- 1) * count
)
1655 generate_random_tests (features
[i
].f
, j
);
1656 while (idx
< startidx
+ count
* 9)
1657 generate_random_tests (features
[i
].f
, 10 + (generate_random () % 16));
1662 generate_random_tests (ALL_FEATURES
, 1 + (generate_random () % 25));