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 "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 -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* } } */\n",
50 "/* { dg-options \"%s-I%s -mno-mmx -fno-common -Wno-abi\" { target i?86-*-darwin* x86_64-*-darwin* } } */\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
;
78 unsigned long long int maxval
;
82 struct types base_types
[] = {
83 /* As we don't know whether char will be signed or not, just limit ourselves
84 to unsigned values less than maximum signed char value. */
85 { "char", TYPE_UINT
, 127, 'C' },
86 { "signed char", TYPE_INT
, 127, 'C' },
87 { "unsigned char", TYPE_UINT
, 255, 'C' },
88 { "short int", TYPE_INT
, 32767, 'S' },
89 { "unsigned short int", TYPE_UINT
, 65535, 'S' },
90 { "int", TYPE_INT
, 2147483647, 'I' },
91 { "unsigned int", TYPE_UINT
, 4294967295U, 'I' },
92 { "long int", TYPE_INT
, 9223372036854775807LL, 'L' },
93 { "unsigned long int", TYPE_UINT
, 18446744073709551615ULL, 'L' },
94 { "long long int", TYPE_INT
, 9223372036854775807LL, 'Q' },
95 { "unsigned long long int", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
96 { "bool", TYPE_UINT
, 1, 'B' },
97 { "void *", TYPE_PTR
, 0, 0 },
98 { "char *", TYPE_PTR
, 0, 0 },
99 { "int *", TYPE_PTR
, 0, 0 },
100 { "float", TYPE_FLOAT
, 0, 0 },
101 { "double", TYPE_FLOAT
, 0, 0 },
102 { "long double", TYPE_FLOAT
, 0, 0 },
103 #ifndef SKIP_DECIMAL_FLOAT
104 { "_Decimal32", TYPE_DEC_FLOAT
, 0, 0 },
105 { "_Decimal64", TYPE_DEC_FLOAT
, 0, 0 },
106 { "_Decimal128", TYPE_DEC_FLOAT
, 0, 0 },
111 { "Tchar", TYPE_UINT
, 127, 'C' },
112 { "Tschar", TYPE_INT
, 127, 'C' },
113 { "Tuchar", TYPE_UINT
, 255, 'C' },
114 { "Tshort", TYPE_INT
, 32767, 'S' },
115 { "Tushort", TYPE_UINT
, 65535, 'S' },
116 { "Tint", TYPE_INT
, 2147483647, 'I' },
117 { "Tuint", TYPE_UINT
, 4294967295U, 'I' },
118 { "Tlong", TYPE_INT
, 9223372036854775807LL, 'L' },
119 { "Tulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
120 { "Tllong", TYPE_INT
, 9223372036854775807LL, 'Q' },
121 { "Tullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
122 { "Tbool", TYPE_UINT
, 1, 'B' },
123 { "size_t", TYPE_UINT
, 18446744073709551615ULL, 0 },
124 { "Tptr", TYPE_PTR
, 0, 0 },
125 { "Tcptr", TYPE_PTR
, 0, 0 },
126 { "Tiptr", TYPE_PTR
, 0, 0 },
127 { "Tfnptr", TYPE_FNPTR
, 0, 0 },
128 { "Tfloat", TYPE_FLOAT
, 0, 0 },
129 { "Tdouble", TYPE_FLOAT
, 0, 0 },
130 { "Tldouble", TYPE_FLOAT
, 0, 0 },
131 #ifndef SKIP_DECIMAL_FLOAT
132 { "TDecimal32", TYPE_DEC_FLOAT
, 0, 0 },
133 { "TDecimal64", TYPE_DEC_FLOAT
, 0, 0 },
134 { "TDecimal128", TYPE_DEC_FLOAT
, 0, 0 },
136 { "enum E0", TYPE_UENUM
, 0, ' ' },
137 { "enum E1", TYPE_UENUM
, 1, ' ' },
138 { "enum E2", TYPE_SENUM
, 3, ' ' },
139 { "enum E3", TYPE_SENUM
, 127, ' ' },
140 { "enum E4", TYPE_UENUM
, 255, ' ' },
141 { "enum E5", TYPE_SENUM
, 32767, ' ' },
142 { "enum E6", TYPE_UENUM
, 65535, ' ' },
143 { "enum E7", TYPE_SENUM
, 2147483647, ' ' },
144 { "enum E8", TYPE_UENUM
, 4294967295U, ' ' },
145 { "enum E9", TYPE_SENUM
, 1099511627775LL, ' ' },
146 { "TE0", TYPE_UENUM
, 0, ' ' },
147 { "TE1", TYPE_UENUM
, 1, ' ' },
148 { "TE2", TYPE_SENUM
, 3, ' ' },
149 { "TE3", TYPE_SENUM
, 127, ' ' },
150 { "TE4", TYPE_UENUM
, 255, ' ' },
151 { "TE5", TYPE_SENUM
, 32767, ' ' },
152 { "TE6", TYPE_UENUM
, 65535, ' ' },
153 { "TE7", TYPE_SENUM
, 2147483647, ' ' },
154 { "TE8", TYPE_UENUM
, 4294967295U, ' ' },
155 { "TE9", TYPE_SENUM
, 1099511627775LL, ' ' },
156 /* vector-defs.h typedefs */
157 { "qi", TYPE_INT
, 127, 0 },
158 { "hi", TYPE_INT
, 32767, 0 },
159 { "si", TYPE_INT
, 2147483647, 0 },
160 { "di", TYPE_INT
, 9223372036854775807LL, 0 },
161 { "sf", TYPE_FLOAT
, 0, 0 },
162 { "df", TYPE_FLOAT
, 0, 0 }
163 #define NTYPES2 (sizeof (base_types) / sizeof (base_types[0]))
165 struct types complex_types
[] = {
166 { "_Complex char", TYPE_CUINT
, 127, 0 },
167 { "_Complex signed char", TYPE_CINT
, 127, 0 },
168 { "_Complex unsigned char", TYPE_CUINT
, 255, 0 },
169 { "_Complex short int", TYPE_CINT
, 32767, 0 },
170 { "_Complex unsigned short int", TYPE_CUINT
, 65535, 0 },
171 { "_Complex int", TYPE_CINT
, 2147483647, 0 },
172 { "_Complex unsigned int", TYPE_CUINT
, 4294967295U, 0 },
173 { "_Complex long int", TYPE_CINT
, 9223372036854775807LL, 0 },
174 { "_Complex unsigned long int", TYPE_CUINT
, 18446744073709551615ULL, 0 },
175 { "_Complex long long int", TYPE_CINT
, 9223372036854775807LL, 0 },
176 { "_Complex unsigned long long int", TYPE_CUINT
, 18446744073709551615ULL, 0 },
177 { "_Complex float", TYPE_CFLOAT
, 0, 0 },
178 { "_Complex double", TYPE_CFLOAT
, 0, 0 },
179 { "_Complex long double", TYPE_CFLOAT
, 0, 0 },
180 { "Tcchar", TYPE_CUINT
, 127, 0 },
181 { "Tcschar", TYPE_CINT
, 127, 0 },
182 { "Tcuchar", TYPE_CUINT
, 255, 0 },
183 { "Tcshort", TYPE_CINT
, 32767, 0 },
184 { "Tcushort", TYPE_CUINT
, 65535, 0 },
185 { "Tcint", TYPE_CINT
, 2147483647, 0 },
186 { "Tcuint", TYPE_CUINT
, 4294967295U, 0 },
187 { "Tclong", TYPE_CINT
, 9223372036854775807LL, 0 },
188 { "Tculong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
189 { "Tcllong", TYPE_CINT
, 9223372036854775807LL, 0 },
190 { "Tcullong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
191 { "Tcfloat", TYPE_CFLOAT
, 0, 0 },
192 { "Tcdouble", TYPE_CFLOAT
, 0, 0 },
193 { "Tcldouble", TYPE_CFLOAT
, 0, 0 }
194 #define NCTYPES2 (sizeof (complex_types) / sizeof (complex_types[0]))
196 struct types vector_types
[] = {
197 /* vector-defs.h typedefs */
198 { "v8qi", TYPE_OTHER
, 0, 0 },
199 { "v16qi", TYPE_OTHER
, 0, 0 },
200 { "v32qi", TYPE_OTHER
, 0, 0 },
201 { "v2hi", TYPE_OTHER
, 0, 0 },
202 { "v4hi", TYPE_OTHER
, 0, 0 },
203 { "v8hi", TYPE_OTHER
, 0, 0 },
204 { "v16hi", TYPE_OTHER
, 0, 0 },
205 { "v2si", TYPE_OTHER
, 0, 0 },
206 { "v4si", TYPE_OTHER
, 0, 0 },
207 { "v8si", TYPE_OTHER
, 0, 0 },
208 { "v1di", TYPE_OTHER
, 0, 0 },
209 { "v2di", TYPE_OTHER
, 0, 0 },
210 { "v4di", TYPE_OTHER
, 0, 0 },
211 { "v2sf", TYPE_OTHER
, 0, 0 },
212 { "v4sf", TYPE_OTHER
, 0, 0 },
213 { "v8sf", TYPE_OTHER
, 0, 0 },
214 { "v16sf", TYPE_OTHER
, 0, 0 },
215 { "v2df", TYPE_OTHER
, 0, 0 },
216 { "v4df", TYPE_OTHER
, 0, 0 },
217 { "u8qi", TYPE_OTHER
, 0, 0 },
218 { "u16qi", TYPE_OTHER
, 0, 0 },
219 { "u32qi", TYPE_OTHER
, 0, 0 },
220 { "u2hi", TYPE_OTHER
, 0, 0 },
221 { "u4hi", TYPE_OTHER
, 0, 0 },
222 { "u8hi", TYPE_OTHER
, 0, 0 },
223 { "u16hi", TYPE_OTHER
, 0, 0 },
224 { "u2si", TYPE_OTHER
, 0, 0 },
225 { "u4si", TYPE_OTHER
, 0, 0 },
226 { "u8si", TYPE_OTHER
, 0, 0 },
227 { "u1di", TYPE_OTHER
, 0, 0 },
228 { "u2di", TYPE_OTHER
, 0, 0 },
229 { "u4di", TYPE_OTHER
, 0, 0 },
230 { "u2sf", TYPE_OTHER
, 0, 0 },
231 { "u4sf", TYPE_OTHER
, 0, 0 },
232 { "u8sf", TYPE_OTHER
, 0, 0 },
233 { "u16sf", TYPE_OTHER
, 0, 0 },
234 { "u2df", TYPE_OTHER
, 0, 0 },
235 { "u4df", TYPE_OTHER
, 0, 0 },
236 { "__m64", TYPE_OTHER
, 0, 0 },
237 { "__m128", TYPE_OTHER
, 0, 0 }
238 #define NVTYPES2 (sizeof (vector_types) / sizeof (vector_types[0]))
240 struct types attrib_types
[] = {
241 { "Talchar", TYPE_UINT
, 127, 'C' },
242 { "Talschar", TYPE_INT
, 127, 'C' },
243 { "Taluchar", TYPE_UINT
, 255, 'C' },
244 { "Talshort", TYPE_INT
, 32767, 'S' },
245 { "Talushort", TYPE_UINT
, 65535, 'S' },
246 { "Talint", TYPE_INT
, 2147483647, 'I' },
247 { "Taluint", TYPE_UINT
, 4294967295U, 'I' },
248 { "Tallong", TYPE_INT
, 9223372036854775807LL, 'L' },
249 { "Talulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
250 { "Talllong", TYPE_INT
, 9223372036854775807LL, 'Q' },
251 { "Talullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
252 { "Talbool", TYPE_UINT
, 1, 'B' },
253 { "Talptr", TYPE_PTR
, 0, 0 },
254 { "Talcptr", TYPE_PTR
, 0, 0 },
255 { "Taliptr", TYPE_PTR
, 0, 0 },
256 { "Talfloat", TYPE_FLOAT
, 0, 0 },
257 { "Taldouble", TYPE_FLOAT
, 0, 0 },
258 { "Talldouble", TYPE_FLOAT
, 0, 0 },
259 #ifndef SKIP_DECIMAL_FLOAT
260 { "TalDecimal32", TYPE_DEC_FLOAT
, 0, 0 },
261 { "TalDecimal64", TYPE_DEC_FLOAT
, 0, 0 },
262 { "TalDecimal128", TYPE_DEC_FLOAT
, 0, 0 },
264 { "TalE0", TYPE_UENUM
, 0, ' ' },
265 { "TalE1", TYPE_UENUM
, 1, ' ' },
266 { "TalE2", TYPE_SENUM
, 3, ' ' },
267 { "TalE3", TYPE_SENUM
, 127, ' ' },
268 { "TalE4", TYPE_UENUM
, 255, ' ' },
269 { "TalE5", TYPE_SENUM
, 32767, ' ' },
270 { "TalE6", TYPE_UENUM
, 65535, ' ' },
271 { "TalE7", TYPE_SENUM
, 2147483647, ' ' },
272 { "TalE8", TYPE_UENUM
, 4294967295U, ' ' },
273 { "TalE9", TYPE_SENUM
, 1099511627775LL, ' ' },
274 { "Tal1char", TYPE_UINT
, 127, 'C' },
275 { "Tal1schar", TYPE_INT
, 127, 'C' },
276 { "Tal1uchar", TYPE_UINT
, 255, 'C' },
277 { "Tal1short", TYPE_INT
, 32767, 'S' },
278 { "Tal1ushort", TYPE_UINT
, 65535, 'S' },
279 { "Tal1int", TYPE_INT
, 2147483647, 'I' },
280 { "Tal1uint", TYPE_UINT
, 4294967295U, 'I' },
281 { "Tal1long", TYPE_INT
, 9223372036854775807LL, 'L' },
282 { "Tal1ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
283 { "Tal1llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
284 { "Tal1ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
285 { "Tal1bool", TYPE_UINT
, 1, 'B' },
286 { "Tal1ptr", TYPE_PTR
, 0, 0 },
287 { "Tal1cptr", TYPE_PTR
, 0, 0 },
288 { "Tal1iptr", TYPE_PTR
, 0, 0 },
289 { "Tal1float", TYPE_FLOAT
, 0, 0 },
290 { "Tal1double", TYPE_FLOAT
, 0, 0 },
291 { "Tal1ldouble", TYPE_FLOAT
, 0, 0 },
292 #ifndef SKIP_DECIMAL_FLOAT
293 { "Tal1Decimal32", TYPE_DEC_FLOAT
, 0, 0},
294 { "Tal1Decimal64", TYPE_DEC_FLOAT
, 0, 0},
295 { "Tal1Decimal128", TYPE_DEC_FLOAT
, 0, 0},
297 { "Tal1E0", TYPE_UENUM
, 0, ' ' },
298 { "Tal1E1", TYPE_UENUM
, 1, ' ' },
299 { "Tal1E2", TYPE_SENUM
, 3, ' ' },
300 { "Tal1E3", TYPE_SENUM
, 127, ' ' },
301 { "Tal1E4", TYPE_UENUM
, 255, ' ' },
302 { "Tal1E5", TYPE_SENUM
, 32767, ' ' },
303 { "Tal1E6", TYPE_UENUM
, 65535, ' ' },
304 { "Tal1E7", TYPE_SENUM
, 2147483647, ' ' },
305 { "Tal1E8", TYPE_UENUM
, 4294967295U, ' ' },
306 { "Tal1E9", TYPE_SENUM
, 1099511627775LL, ' ' },
307 { "Tal2char", TYPE_UINT
, 127, 'C' },
308 { "Tal2schar", TYPE_INT
, 127, 'C' },
309 { "Tal2uchar", TYPE_UINT
, 255, 'C' },
310 { "Tal2short", TYPE_INT
, 32767, 'S' },
311 { "Tal2ushort", TYPE_UINT
, 65535, 'S' },
312 { "Tal2int", TYPE_INT
, 2147483647, 'I' },
313 { "Tal2uint", TYPE_UINT
, 4294967295U, 'I' },
314 { "Tal2long", TYPE_INT
, 9223372036854775807LL, 'L' },
315 { "Tal2ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
316 { "Tal2llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
317 { "Tal2ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
318 { "Tal2bool", TYPE_UINT
, 1, 'B' },
319 { "Tal2ptr", TYPE_PTR
, 0, 0 },
320 { "Tal2cptr", TYPE_PTR
, 0, 0 },
321 { "Tal2iptr", TYPE_PTR
, 0, 0 },
322 { "Tal2float", TYPE_FLOAT
, 0, 0 },
323 { "Tal2double", TYPE_FLOAT
, 0, 0 },
324 { "Tal2ldouble", TYPE_FLOAT
, 0, 0 },
325 #ifndef SKIP_DECIMAL_FLOAT
326 { "Tal2Decimal32", TYPE_DEC_FLOAT
, 0, 0 },
327 { "Tal2Decimal64", TYPE_DEC_FLOAT
, 0, 0 },
328 { "Tal2Decimal128", TYPE_DEC_FLOAT
, 0, 0 },
330 { "Tal2E0", TYPE_UENUM
, 0, ' ' },
331 { "Tal2E1", TYPE_UENUM
, 1, ' ' },
332 { "Tal2E2", TYPE_SENUM
, 3, ' ' },
333 { "Tal2E3", TYPE_SENUM
, 127, ' ' },
334 { "Tal2E4", TYPE_UENUM
, 255, ' ' },
335 { "Tal2E5", TYPE_SENUM
, 32767, ' ' },
336 { "Tal2E6", TYPE_UENUM
, 65535, ' ' },
337 { "Tal2E7", TYPE_SENUM
, 2147483647, ' ' },
338 { "Tal2E8", TYPE_UENUM
, 4294967295U, ' ' },
339 { "Tal2E9", TYPE_SENUM
, 1099511627775LL, ' ' },
340 { "Tal4char", TYPE_UINT
, 127, 'C' },
341 { "Tal4schar", TYPE_INT
, 127, 'C' },
342 { "Tal4uchar", TYPE_UINT
, 255, 'C' },
343 { "Tal4short", TYPE_INT
, 32767, 'S' },
344 { "Tal4ushort", TYPE_UINT
, 65535, 'S' },
345 { "Tal4int", TYPE_INT
, 2147483647, 'I' },
346 { "Tal4uint", TYPE_UINT
, 4294967295U, 'I' },
347 { "Tal4long", TYPE_INT
, 9223372036854775807LL, 'L' },
348 { "Tal4ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
349 { "Tal4llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
350 { "Tal4ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
351 { "Tal4bool", TYPE_UINT
, 1, 'B' },
352 { "Tal4ptr", TYPE_PTR
, 0, 0 },
353 { "Tal4cptr", TYPE_PTR
, 0, 0 },
354 { "Tal4iptr", TYPE_PTR
, 0, 0 },
355 { "Tal4float", TYPE_FLOAT
, 0, 0 },
356 { "Tal4double", TYPE_FLOAT
, 0, 0 },
357 { "Tal4ldouble", TYPE_FLOAT
, 0, 0 },
358 #ifndef SKIP_DECIMAL_FLOAT
359 { "Tal4Decimal32", TYPE_DEC_FLOAT
, 0, 0 },
360 { "Tal4Decimal64", TYPE_DEC_FLOAT
, 0, 0 },
361 { "Tal4Decimal128", TYPE_DEC_FLOAT
, 0, 0 },
363 { "Tal4E0", TYPE_UENUM
, 0, ' ' },
364 { "Tal4E1", TYPE_UENUM
, 1, ' ' },
365 { "Tal4E2", TYPE_SENUM
, 3, ' ' },
366 { "Tal4E3", TYPE_SENUM
, 127, ' ' },
367 { "Tal4E4", TYPE_UENUM
, 255, ' ' },
368 { "Tal4E5", TYPE_SENUM
, 32767, ' ' },
369 { "Tal4E6", TYPE_UENUM
, 65535, ' ' },
370 { "Tal4E7", TYPE_SENUM
, 2147483647, ' ' },
371 { "Tal4E8", TYPE_UENUM
, 4294967295U, ' ' },
372 { "Tal4E9", TYPE_SENUM
, 1099511627775LL, ' ' },
373 { "Tal8char", TYPE_UINT
, 127, 'C' },
374 { "Tal8schar", TYPE_INT
, 127, 'C' },
375 { "Tal8uchar", TYPE_UINT
, 255, 'C' },
376 { "Tal8short", TYPE_INT
, 32767, 'S' },
377 { "Tal8ushort", TYPE_UINT
, 65535, 'S' },
378 { "Tal8int", TYPE_INT
, 2147483647, 'I' },
379 { "Tal8uint", TYPE_UINT
, 4294967295U, 'I' },
380 { "Tal8long", TYPE_INT
, 9223372036854775807LL, 'L' },
381 { "Tal8ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
382 { "Tal8llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
383 { "Tal8ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
384 { "Tal8bool", TYPE_UINT
, 1, 'B' },
385 { "Tal8ptr", TYPE_PTR
, 0, 0 },
386 { "Tal8cptr", TYPE_PTR
, 0, 0 },
387 { "Tal8iptr", TYPE_PTR
, 0, 0 },
388 { "Tal8float", TYPE_FLOAT
, 0, 0 },
389 { "Tal8double", TYPE_FLOAT
, 0, 0 },
390 { "Tal8ldouble", TYPE_FLOAT
, 0, 0 },
391 #ifndef SKIP_DECIMAL_FLOAT
392 { "Tal8Decimal32", TYPE_DEC_FLOAT
, 0, 0 },
393 { "Tal8Decimal64", TYPE_DEC_FLOAT
, 0, 0 },
394 { "Tal8Decimal128", TYPE_DEC_FLOAT
, 0, 0 },
396 { "Tal8E0", TYPE_UENUM
, 0, ' ' },
397 { "Tal8E1", TYPE_UENUM
, 1, ' ' },
398 { "Tal8E2", TYPE_SENUM
, 3, ' ' },
399 { "Tal8E3", TYPE_SENUM
, 127, ' ' },
400 { "Tal8E4", TYPE_UENUM
, 255, ' ' },
401 { "Tal8E5", TYPE_SENUM
, 32767, ' ' },
402 { "Tal8E6", TYPE_UENUM
, 65535, ' ' },
403 { "Tal8E7", TYPE_SENUM
, 2147483647, ' ' },
404 { "Tal8E8", TYPE_UENUM
, 4294967295U, ' ' },
405 { "Tal8E9", TYPE_SENUM
, 1099511627775LL, ' ' },
406 { "Tal16char", TYPE_UINT
, 127, 'C' },
407 { "Tal16schar", TYPE_INT
, 127, 'C' },
408 { "Tal16uchar", TYPE_UINT
, 255, 'C' },
409 { "Tal16short", TYPE_INT
, 32767, 'S' },
410 { "Tal16ushort", TYPE_UINT
, 65535, 'S' },
411 { "Tal16int", TYPE_INT
, 2147483647, 'I' },
412 { "Tal16uint", TYPE_UINT
, 4294967295U, 'I' },
413 { "Tal16long", TYPE_INT
, 9223372036854775807LL, 'L' },
414 { "Tal16ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
415 { "Tal16llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
416 { "Tal16ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
417 { "Tal16bool", TYPE_UINT
, 1, 'B' },
418 { "Tal16ptr", TYPE_PTR
, 0, 0 },
419 { "Tal16cptr", TYPE_PTR
, 0, 0 },
420 { "Tal16iptr", TYPE_PTR
, 0, 0 },
421 { "Tal16float", TYPE_FLOAT
, 0, 0 },
422 { "Tal16double", TYPE_FLOAT
, 0, 0 },
423 { "Tal16ldouble", TYPE_FLOAT
, 0, 0 },
424 #ifndef SKIP_DECIMAL_FLOAT
425 { "Tal16Decimal32", TYPE_DEC_FLOAT
, 0, 0 },
426 { "Tal16Decimal64", TYPE_DEC_FLOAT
, 0, 0 },
427 { "Tal16Decimal128", TYPE_DEC_FLOAT
, 0, 0 },
429 { "Tal16E0", TYPE_UENUM
, 0, ' ' },
430 { "Tal16E1", TYPE_UENUM
, 1, ' ' },
431 { "Tal16E2", TYPE_SENUM
, 3, ' ' },
432 { "Tal16E3", TYPE_SENUM
, 127, ' ' },
433 { "Tal16E4", TYPE_UENUM
, 255, ' ' },
434 { "Tal16E5", TYPE_SENUM
, 32767, ' ' },
435 { "Tal16E6", TYPE_UENUM
, 65535, ' ' },
436 { "Tal16E7", TYPE_SENUM
, 2147483647, ' ' },
437 { "Tal16E8", TYPE_UENUM
, 4294967295U, ' ' },
438 { "Tal16E9", TYPE_SENUM
, 1099511627775LL, ' ' }
439 #define NATYPES2 (sizeof (attrib_types) / sizeof (attrib_types[0]))
441 struct types complex_attrib_types
[] = {
442 { "Talcchar", TYPE_CUINT
, 127, 0 },
443 { "Talcschar", TYPE_CINT
, 127, 0 },
444 { "Talcuchar", TYPE_CUINT
, 255, 0 },
445 { "Talcshort", TYPE_CINT
, 32767, 0 },
446 { "Talcushort", TYPE_CUINT
, 65535, 0 },
447 { "Talcint", TYPE_CINT
, 2147483647, 0 },
448 { "Talcuint", TYPE_CUINT
, 4294967295U, 0 },
449 { "Talclong", TYPE_CINT
, 9223372036854775807LL, 0 },
450 { "Talculong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
451 { "Talcllong", TYPE_CINT
, 9223372036854775807LL, 0 },
452 { "Talcullong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
453 { "Talcfloat", TYPE_CFLOAT
, 0, 0 },
454 { "Talcdouble", TYPE_CFLOAT
, 0, 0 },
455 { "Talcldouble", TYPE_CFLOAT
, 0, 0 },
456 { "Tal1cchar", TYPE_CUINT
, 127, 0 },
457 { "Tal1cschar", TYPE_CINT
, 127, 0 },
458 { "Tal1cuchar", TYPE_CUINT
, 255, 0 },
459 { "Tal1cshort", TYPE_CINT
, 32767, 0 },
460 { "Tal1cushort", TYPE_CUINT
, 65535, 0 },
461 { "Tal1cint", TYPE_CINT
, 2147483647, 0 },
462 { "Tal1cuint", TYPE_CUINT
, 4294967295U, 0 },
463 { "Tal1clong", TYPE_CINT
, 9223372036854775807LL, 0 },
464 { "Tal1culong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
465 { "Tal1cllong", TYPE_CINT
, 9223372036854775807LL, 0 },
466 { "Tal1cullong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
467 { "Tal1cfloat", TYPE_CFLOAT
, 0, 0 },
468 { "Tal1cdouble", TYPE_CFLOAT
, 0, 0 },
469 { "Tal1cldouble", TYPE_CFLOAT
, 0, 0 },
470 { "Tal2cchar", TYPE_CUINT
, 127, 0 },
471 { "Tal2cschar", TYPE_CINT
, 127, 0 },
472 { "Tal2cuchar", TYPE_CUINT
, 255, 0 },
473 { "Tal2cshort", TYPE_CINT
, 32767, 0 },
474 { "Tal2cushort", TYPE_CUINT
, 65535, 0 },
475 { "Tal2cint", TYPE_CINT
, 2147483647, 0 },
476 { "Tal2cuint", TYPE_CUINT
, 4294967295U, 0 },
477 { "Tal2clong", TYPE_CINT
, 9223372036854775807LL, 0 },
478 { "Tal2culong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
479 { "Tal2cllong", TYPE_CINT
, 9223372036854775807LL, 0 },
480 { "Tal2cullong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
481 { "Tal2cfloat", TYPE_CFLOAT
, 0, 0 },
482 { "Tal2cdouble", TYPE_CFLOAT
, 0, 0 },
483 { "Tal2cldouble", TYPE_CFLOAT
, 0, 0 },
484 { "Tal4cchar", TYPE_CUINT
, 127, 0 },
485 { "Tal4cschar", TYPE_CINT
, 127, 0 },
486 { "Tal4cuchar", TYPE_CUINT
, 255, 0 },
487 { "Tal4cshort", TYPE_CINT
, 32767, 0 },
488 { "Tal4cushort", TYPE_CUINT
, 65535, 0 },
489 { "Tal4cint", TYPE_CINT
, 2147483647, 0 },
490 { "Tal4cuint", TYPE_CUINT
, 4294967295U, 0 },
491 { "Tal4clong", TYPE_CINT
, 9223372036854775807LL, 0 },
492 { "Tal4culong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
493 { "Tal4cllong", TYPE_CINT
, 9223372036854775807LL, 0 },
494 { "Tal4cullong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
495 { "Tal4cfloat", TYPE_CFLOAT
, 0, 0 },
496 { "Tal4cdouble", TYPE_CFLOAT
, 0, 0 },
497 { "Tal4cldouble", TYPE_CFLOAT
, 0, 0 },
498 { "Tal8cchar", TYPE_CUINT
, 127, 0 },
499 { "Tal8cschar", TYPE_CINT
, 127, 0 },
500 { "Tal8cuchar", TYPE_CUINT
, 255, 0 },
501 { "Tal8cshort", TYPE_CINT
, 32767, 0 },
502 { "Tal8cushort", TYPE_CUINT
, 65535, 0 },
503 { "Tal8cint", TYPE_CINT
, 2147483647, 0 },
504 { "Tal8cuint", TYPE_CUINT
, 4294967295U, 0 },
505 { "Tal8clong", TYPE_CINT
, 9223372036854775807LL, 0 },
506 { "Tal8culong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
507 { "Tal8cllong", TYPE_CINT
, 9223372036854775807LL, 0 },
508 { "Tal8cullong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
509 { "Tal8cfloat", TYPE_CFLOAT
, 0, 0 },
510 { "Tal8cdouble", TYPE_CFLOAT
, 0, 0 },
511 { "Tal8cldouble", TYPE_CFLOAT
, 0, 0 },
512 { "Tal16cchar", TYPE_CUINT
, 127, 0 },
513 { "Tal16cschar", TYPE_CINT
, 127, 0 },
514 { "Tal16cuchar", TYPE_CUINT
, 255, 0 },
515 { "Tal16cshort", TYPE_CINT
, 32767, 0 },
516 { "Tal16cushort", TYPE_CUINT
, 65535, 0 },
517 { "Tal16cint", TYPE_CINT
, 2147483647, 0 },
518 { "Tal16cuint", TYPE_CUINT
, 4294967295U, 0 },
519 { "Tal16clong", TYPE_CINT
, 9223372036854775807LL, 0 },
520 { "Tal16culong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
521 { "Tal16cllong", TYPE_CINT
, 9223372036854775807LL, 0 },
522 { "Tal16cullong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
523 { "Tal16cfloat", TYPE_CFLOAT
, 0, 0 },
524 { "Tal16cdouble", TYPE_CFLOAT
, 0, 0 },
525 { "Tal16cldouble", TYPE_CFLOAT
, 0, 0 }
526 #define NCATYPES2 (sizeof (complex_attrib_types) / sizeof (complex_attrib_types[0]))
528 struct types attrib_array_types
[] = {
529 { "Talx1char", TYPE_UINT
, 127, 'C' },
530 { "Talx1schar", TYPE_INT
, 127, 'C' },
531 { "Talx1uchar", TYPE_UINT
, 255, 'C' },
532 { "Talx1short", TYPE_INT
, 32767, 'S' },
533 { "Talx1ushort", TYPE_UINT
, 65535, 'S' },
534 { "Talx1int", TYPE_INT
, 2147483647, 'I' },
535 { "Talx1uint", TYPE_UINT
, 4294967295U, 'I' },
536 { "Talx1long", TYPE_INT
, 9223372036854775807LL, 'L' },
537 { "Talx1ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
538 { "Talx1llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
539 { "Talx1ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
540 { "Talx1bool", TYPE_UINT
, 1, 'B' },
541 { "Talx1ptr", TYPE_PTR
, 0, 0 },
542 { "Talx1cptr", TYPE_PTR
, 0, 0 },
543 { "Talx1iptr", TYPE_PTR
, 0, 0 },
544 { "Talx1float", TYPE_FLOAT
, 0, 0 },
545 { "Talx1double", TYPE_FLOAT
, 0, 0 },
546 { "Talx1ldouble", TYPE_FLOAT
, 0, 0 },
547 #ifndef SKIP_DECIMAL_FLOAT
548 { "Talx1Decimal32", TYPE_DEC_FLOAT
, 0 ,0 },
549 { "Talx1Decimal64", TYPE_DEC_FLOAT
, 0 ,0 },
550 { "Talx1Decimal128", TYPE_DEC_FLOAT
, 0 ,0 },
552 { "Talx1E0", TYPE_UENUM
, 0, ' ' },
553 { "Talx1E1", TYPE_UENUM
, 1, ' ' },
554 { "Talx1E2", TYPE_SENUM
, 3, ' ' },
555 { "Talx1E3", TYPE_SENUM
, 127, ' ' },
556 { "Talx1E4", TYPE_UENUM
, 255, ' ' },
557 { "Talx1E5", TYPE_SENUM
, 32767, ' ' },
558 { "Talx1E6", TYPE_UENUM
, 65535, ' ' },
559 { "Talx1E7", TYPE_SENUM
, 2147483647, ' ' },
560 { "Talx1E8", TYPE_UENUM
, 4294967295U, ' ' },
561 { "Talx1E9", TYPE_SENUM
, 1099511627775LL, ' ' },
562 { "Talx2short", TYPE_INT
, 32767, 'S' },
563 { "Talx2ushort", TYPE_UINT
, 65535, 'S' },
564 { "Talx2int", TYPE_INT
, 2147483647, 'I' },
565 { "Talx2uint", TYPE_UINT
, 4294967295U, 'I' },
566 { "Talx2long", TYPE_INT
, 9223372036854775807LL, 'L' },
567 { "Talx2ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
568 { "Talx2llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
569 { "Talx2ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
570 { "Talx2ptr", TYPE_PTR
, 0, 0 },
571 { "Talx2cptr", TYPE_PTR
, 0, 0 },
572 { "Talx2iptr", TYPE_PTR
, 0, 0 },
573 { "Talx2float", TYPE_FLOAT
, 0, 0 },
574 { "Talx2double", TYPE_FLOAT
, 0, 0 },
575 { "Talx2ldouble", TYPE_FLOAT
, 0, 0 },
576 #ifndef SKIP_DECIMAL_FLOAT
577 { "Talx2Decimal32", TYPE_DEC_FLOAT
, 0 , 0 },
578 { "Talx2Decimal64", TYPE_DEC_FLOAT
, 0 , 0 },
579 { "Talx2Decimal128", TYPE_DEC_FLOAT
, 0 , 0 },
581 { "Talx2E0", TYPE_UENUM
, 0, ' ' },
582 { "Talx2E1", TYPE_UENUM
, 1, ' ' },
583 { "Talx2E2", TYPE_SENUM
, 3, ' ' },
584 { "Talx2E3", TYPE_SENUM
, 127, ' ' },
585 { "Talx2E4", TYPE_UENUM
, 255, ' ' },
586 { "Talx2E5", TYPE_SENUM
, 32767, ' ' },
587 { "Talx2E6", TYPE_UENUM
, 65535, ' ' },
588 { "Talx2E7", TYPE_SENUM
, 2147483647, ' ' },
589 { "Talx2E8", TYPE_UENUM
, 4294967295U, ' ' },
590 { "Talx2E9", TYPE_SENUM
, 1099511627775LL, ' ' },
591 { "Talx4int", TYPE_INT
, 2147483647, 'I' },
592 { "Talx4uint", TYPE_UINT
, 4294967295U, 'I' },
593 { "Talx4long", TYPE_INT
, 9223372036854775807LL, 'L' },
594 { "Talx4ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
595 { "Talx4llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
596 { "Talx4ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
597 { "Talx4ptr", TYPE_PTR
, 0, 0 },
598 { "Talx4cptr", TYPE_PTR
, 0, 0 },
599 { "Talx4iptr", TYPE_PTR
, 0, 0 },
600 { "Talx4float", TYPE_FLOAT
, 0, 0 },
601 { "Talx4double", TYPE_FLOAT
, 0, 0 },
602 { "Talx4ldouble", TYPE_FLOAT
, 0, 0 },
603 #ifndef SKIP_DECIMAL_FLOAT
604 { "Talx4Decimal32", TYPE_DEC_FLOAT
, 0 , 0 },
605 { "Talx4Decimal64", TYPE_DEC_FLOAT
, 0 , 0 },
606 { "Talx4Decimal128", TYPE_DEC_FLOAT
, 0 , 0 },
608 { "Talx4E0", TYPE_UENUM
, 0, ' ' },
609 { "Talx4E1", TYPE_UENUM
, 1, ' ' },
610 { "Talx4E2", TYPE_SENUM
, 3, ' ' },
611 { "Talx4E3", TYPE_SENUM
, 127, ' ' },
612 { "Talx4E4", TYPE_UENUM
, 255, ' ' },
613 { "Talx4E5", TYPE_SENUM
, 32767, ' ' },
614 { "Talx4E6", TYPE_UENUM
, 65535, ' ' },
615 { "Talx4E7", TYPE_SENUM
, 2147483647, ' ' },
616 { "Talx4E8", TYPE_UENUM
, 4294967295U, ' ' },
617 { "Talx4E9", TYPE_SENUM
, 1099511627775LL, ' ' },
618 { "Taly8long", TYPE_INT
, 9223372036854775807LL, 'L' },
619 { "Taly8ulong", TYPE_UINT
, 18446744073709551615ULL, 'L' },
620 { "Talx8llong", TYPE_INT
, 9223372036854775807LL, 'Q' },
621 { "Talx8ullong", TYPE_UINT
, 18446744073709551615ULL, 'Q' },
622 { "Taly8ptr", TYPE_PTR
, 0, 0 },
623 { "Taly8cptr", TYPE_PTR
, 0, 0 },
624 { "Taly8iptr", TYPE_PTR
, 0, 0 },
625 { "Talx8double", TYPE_FLOAT
, 0, 0 },
626 { "Talx8ldouble", TYPE_FLOAT
, 0, 0 },
627 #ifndef SKIP_DECIMAL_FLOAT
628 { "Talx8Decimal64", TYPE_DEC_FLOAT
, 0, 0 },
629 { "Talx8Decimal128", TYPE_DEC_FLOAT
, 0, 0 }
631 #define NAATYPES2 (sizeof (attrib_array_types) / sizeof (attrib_array_types[0]))
633 struct types complex_attrib_array_types
[] = {
634 { "Talx1cchar", TYPE_CUINT
, 127, 0 },
635 { "Talx1cschar", TYPE_CINT
, 127, 0 },
636 { "Talx1cuchar", TYPE_CUINT
, 255, 0 },
637 { "Talx1cshort", TYPE_CINT
, 32767, 0 },
638 { "Talx1cushort", TYPE_CUINT
, 65535, 0 },
639 { "Talx1cint", TYPE_CINT
, 2147483647, 0 },
640 { "Talx1cuint", TYPE_CUINT
, 4294967295U, 0 },
641 { "Talx1clong", TYPE_CINT
, 9223372036854775807LL, 0 },
642 { "Talx1culong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
643 { "Talx1cllong", TYPE_CINT
, 9223372036854775807LL, 0 },
644 { "Talx1cullong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
645 { "Talx1cfloat", TYPE_CFLOAT
, 0, 0 },
646 { "Talx1cdouble", TYPE_CFLOAT
, 0, 0 },
647 { "Talx1cldouble", TYPE_CFLOAT
, 0, 0 },
648 { "Talx2cchar", TYPE_CUINT
, 127, 0 },
649 { "Talx2cschar", TYPE_CINT
, 127, 0 },
650 { "Talx2cuchar", TYPE_CUINT
, 255, 0 },
651 { "Talx2cshort", TYPE_CINT
, 32767, 0 },
652 { "Talx2cushort", TYPE_CUINT
, 65535, 0 },
653 { "Talx2cint", TYPE_CINT
, 2147483647, 0 },
654 { "Talx2cuint", TYPE_CUINT
, 4294967295U, 0 },
655 { "Talx2clong", TYPE_CINT
, 9223372036854775807LL, 0 },
656 { "Talx2culong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
657 { "Talx2cllong", TYPE_CINT
, 9223372036854775807LL, 0 },
658 { "Talx2cullong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
659 { "Talx2cfloat", TYPE_CFLOAT
, 0, 0 },
660 { "Talx2cdouble", TYPE_CFLOAT
, 0, 0 },
661 { "Talx2cldouble", TYPE_CFLOAT
, 0, 0 },
662 { "Talx4cshort", TYPE_CINT
, 32767, 0 },
663 { "Talx4cushort", TYPE_CUINT
, 65535, 0 },
664 { "Talx4cint", TYPE_CINT
, 2147483647, 0 },
665 { "Talx4cuint", TYPE_CUINT
, 4294967295U, 0 },
666 { "Talx4clong", TYPE_CINT
, 9223372036854775807LL, 0 },
667 { "Talx4culong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
668 { "Talx4cllong", TYPE_CINT
, 9223372036854775807LL, 0 },
669 { "Talx4cullong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
670 { "Talx4cfloat", TYPE_CFLOAT
, 0, 0 },
671 { "Talx4cdouble", TYPE_CFLOAT
, 0, 0 },
672 { "Talx4cldouble", TYPE_CFLOAT
, 0, 0 },
673 { "Talx8cint", TYPE_CINT
, 2147483647, 0 },
674 { "Talx8cuint", TYPE_CUINT
, 4294967295U, 0 },
675 { "Talx8clong", TYPE_CINT
, 9223372036854775807LL, 0 },
676 { "Talx8culong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
677 { "Talx8cllong", TYPE_CINT
, 9223372036854775807LL, 0 },
678 { "Talx8cullong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
679 { "Talx8cfloat", TYPE_CFLOAT
, 0, 0 },
680 { "Talx8cdouble", TYPE_CFLOAT
, 0, 0 },
681 { "Talx8cldouble", TYPE_CFLOAT
, 0, 0 },
682 { "Taly16clong", TYPE_CINT
, 9223372036854775807LL, 0 },
683 { "Taly16culong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
684 { "Talx16cllong", TYPE_CINT
, 9223372036854775807LL, 0 },
685 { "Talx16cullong", TYPE_CUINT
, 18446744073709551615ULL, 0 },
686 { "Talx16cdouble", TYPE_CFLOAT
, 0, 0 },
687 { "Talx16cldouble", TYPE_CFLOAT
, 0, 0 }
688 #define NCAATYPES2 (sizeof (complex_attrib_array_types) / sizeof (complex_attrib_array_types[0]))
691 struct types bitfld_types
[NTYPES2
];
693 struct types aligned_bitfld_types
[NATYPES2
];
694 int n_aligned_bitfld_types
;
696 const char *attributes
[] = {
717 #define NATTRIBS2 (sizeof (attributes) / sizeof (attributes[0]))
734 enum ETYPE etype
: 8;
739 unsigned char arr_len
;
742 /* Used to chain together entries in the hash table. */
746 /* A prime number giving the number of slots in the hash table. */
747 #define HASH_SIZE 32749
748 static struct entry
*hash_table
[HASH_SIZE
];
750 static int idx
, limidx
, output_one
, short_enums
;
751 static const char *destdir
;
752 static const char *srcdir
;
753 static const char *srcdir_safe
;
757 switchfiles (int fields
)
760 static char *destbuf
, *destptr
;
773 size_t len
= strlen (destdir
);
774 destbuf
= malloc (len
+ 20);
777 memcpy (destbuf
, destdir
, len
);
778 if (!len
|| destbuf
[len
- 1] != '/')
779 destbuf
[len
++] = '/';
780 destptr
= destbuf
+ len
;
782 sprintf (destptr
, "t%03d_main.c", filecnt
);
783 outfile
= fopen (destbuf
, "w");
787 fputs ("failed to create test files\n", stderr
);
790 fprintf (outfile
, "/* { dg-require-effective-target int32plus } */\n");
791 for (i
= 0; i
< NDG_OPTIONS
; i
++)
792 fprintf (outfile
, dg_options
[i
], "", srcdir_safe
);
793 fprintf (outfile
, "/* { dg-prune-output \".*-Wno-abi.*\" } */\n");
794 fprintf (outfile
, "/* { dg-prune-output \".*Offset of packed bit-field.*\" } */\n");
796 #include \"struct-layout-1.h\"\n\
798 #define TX(n, type, attrs, fields, ops) extern void test##n (void);\n\
799 #include \"t%03d_test.h\"\n\
804 #define TX(n, type, attrs, fields, ops) test##n ();\n\
805 #include \"t%03d_test.h\"\n\
813 }\n", filecnt
, filecnt
);
815 sprintf (destptr
, "t%03d_x.c", filecnt
);
816 outfile
= fopen (destbuf
, "w");
819 for (i
= 0; i
< NDG_OPTIONS
; i
++)
820 fprintf (outfile
, dg_options
[i
], "-w ", srcdir_safe
);
822 #include \"struct-layout-1_x1.h\"\n\
823 #include \"t%03d_test.h\"\n\
824 #include \"struct-layout-1_x2.h\"\n\
825 #include \"t%03d_test.h\"\n", filecnt
, filecnt
);
827 sprintf (destptr
, "t%03d_y.c", filecnt
);
828 outfile
= fopen (destbuf
, "w");
831 for (i
= 0; i
< NDG_OPTIONS
; i
++)
832 fprintf (outfile
, dg_options
[i
], "-w ", srcdir_safe
);
834 #include \"struct-layout-1_y1.h\"\n\
835 #include \"t%03d_test.h\"\n\
836 #include \"struct-layout-1_y2.h\"\n\
837 #include \"t%03d_test.h\"\n", filecnt
, filecnt
);
839 sprintf (destptr
, "t%03d_test.h", filecnt
);
840 outfile
= fopen (destbuf
, "w");
845 else if (fields
<= 4)
847 else if (fields
<= 6)
853 unsigned long long int
856 unsigned long long int ret
;
857 ret
= generate_random () & 0xffffff;
858 ret
|= (generate_random () & 0xffffffLL
) << 24;
859 ret
|= ((unsigned long long int) generate_random ()) << 48;
864 subfield (struct entry
*e
, char *letter
)
873 case ETYPE_STRUCT_ARRAY
:
874 case ETYPE_UNION_ARRAY
:
875 type
= e
[0].attrib
? 1 + (generate_random () & 3) : 0;
876 if (e
[0].etype
== ETYPE_STRUCT
|| e
[0].etype
== ETYPE_STRUCT_ARRAY
)
880 if (e
[0].etype
== ETYPE_STRUCT_ARRAY
|| e
[0].etype
== ETYPE_UNION_ARRAY
)
882 if (e
[0].arr_len
== 255)
883 snprintf (buf
, 20, "%c[]", *letter
);
885 snprintf (buf
, 20, "%c[%d]", *letter
, e
[0].arr_len
);
886 /* If this is an array type, do not put aligned attributes on
887 elements. Aligning elements to a value greater than their
888 size will result in a compiler error. */
890 && ((strncmp (e
[0].attrib
, "atal", 4) == 0)
891 || strncmp (e
[0].attrib
, "atpaal", 6) == 0))
905 fprintf (outfile
, "%s{", p
);
908 fprintf (outfile
, "%s %s{", e
[0].attrib
, p
);
911 fprintf (outfile
, "%s %s{", p
, e
[0].attrib
);
915 for (i
= 1; i
<= e
[0].len
; )
916 i
+= subfield (e
+ i
, letter
);
923 fprintf (outfile
, "}%s;", buf
);
926 fprintf (outfile
, "}%s %s;", e
[0].attrib
, buf
);
929 fprintf (outfile
, "}%s %s;", buf
, e
[0].attrib
);
935 if (e
[0].etype
== ETYPE_ARRAY
)
937 if (e
[0].arr_len
== 255)
938 snprintf (buf
, 20, "%c[]", *letter
);
940 snprintf (buf
, 20, "%c[%d]", *letter
, e
[0].arr_len
);
950 /* If this is an array type, do not put aligned attributes on
951 elements. Aligning elements to a value greater than their
952 size will result in a compiler error. */
953 if (e
[0].etype
== ETYPE_ARRAY
954 && ((strncmp (e
[0].attrib
, "atal", 4) == 0)
955 || strncmp (e
[0].attrib
, "atpaal", 6) == 0))
958 type
= generate_random () % 3;
962 fprintf (outfile
, "%s %s %s;", e
[0].attrib
, e
[0].type
->name
,
966 fprintf (outfile
, "%s %s %s;", e
[0].type
->name
, e
[0].attrib
,
970 fprintf (outfile
, "%s %s %s;", e
[0].type
->name
, buf
,
976 fprintf (outfile
, "%s %s;", e
[0].type
->name
, buf
);
982 switch (generate_random () % 3)
985 fprintf (outfile
, "%s %s:0;", e
[0].attrib
, e
[0].type
->name
);
988 fprintf (outfile
, "%s %s:0;", e
[0].type
->name
, e
[0].attrib
);
991 fprintf (outfile
, "%s:0 %s;", e
[0].type
->name
, e
[0].attrib
);
995 fprintf (outfile
, "%s:0;", e
[0].type
->name
);
999 switch (e
[0].type
->bitfld
)
1006 snprintf (buf
, 20, "B%cN(%d)", e
[0].type
->bitfld
, e
[0].len
);
1010 snprintf (buf
, 20, "%d", e
[0].len
);
1016 switch (generate_random () % 3)
1019 fprintf (outfile
, "%s %s %c:%s;", e
[0].attrib
, e
[0].type
->name
,
1023 fprintf (outfile
, "%s %s %c:%s;", e
[0].type
->name
, e
[0].attrib
,
1027 fprintf (outfile
, "%s %c:%s %s;", e
[0].type
->name
, *letter
,
1032 fprintf (outfile
, "%s %c:%s;", e
[0].type
->name
, *letter
, buf
);
1043 output_FNB (char mode
, struct entry
*e
)
1045 unsigned long long int l1
, l2
, m
;
1047 #ifndef SKIP_DECIMAL_FLOAT
1049 char DEC_SUFFIX
[3][3]={"DF","DD","DL"};
1054 if (e
->type
->type
== TYPE_OTHER
)
1058 fprintf (outfile
, "N(%d,%s)", idx
, namebuf
);
1061 fprintf (outfile
, "%c(%d,%s,", mode
, idx
, namebuf
);
1064 switch (e
->type
->type
)
1067 signs
= generate_random () & 3;
1068 m
= e
->type
->maxval
;
1070 m
&= e
->len
> 1 ? (1ULL << (e
->len
- 1)) - 1 : 1;
1073 fprintf (outfile
, "%s%" COMPAT_PRLL
"u%s,%s%" COMPAT_PRLL
"u%s",
1074 (signs
& 1) ? "-" : "", l1
, l1
> 2147483647 ? "LL" : "",
1075 (signs
& 2) ? "-" : "", l2
, l2
> 2147483647 ? "LL" : "");
1078 m
= e
->type
->maxval
;
1080 m
&= (1ULL << e
->len
) - 1;
1083 fprintf (outfile
, "%" COMPAT_PRLL
"uU%s,%" COMPAT_PRLL
"uU%s",
1084 l1
, l1
> 4294967295U ? "LL" : "",
1085 l2
, l2
> 4294967295U ? "LL" : "");
1090 signs
= generate_random () & 3;
1091 fprintf (outfile
, "%s%f,%s%f", (signs
& 1) ? "-" : "",
1092 ((double) l1
) / 64, (signs
& 2) ? "-" : "", ((double) l2
) / 64);
1094 #ifndef SKIP_DECIMAL_FLOAT
1095 case TYPE_DEC_FLOAT
:
1098 signs
= generate_random () & 3;
1100 /* Get the suffix of Decimal Floting Points per
1101 e->type->name. Distinguish these three DFP types by
1103 if (strstr(e
->type
->name
, "Decimal32")) suffix
=0;
1104 else if (strstr(e
->type
->name
, "Decimal64")) suffix
=1;
1105 else if (strstr(e
->type
->name
, "Decimal128")) suffix
=2;
1109 /* Formatted input/output specifiers for DFP types have not been
1110 implemented in GLIBC. %f here used in fprintf is just to
1111 dump the numbers to outfile. */
1112 fprintf (outfile
, "%s%f%s,%s%f%s",
1113 (signs
& 1) ? "-" : "", ((double) l1
) / 64, DEC_SUFFIX
[suffix
],
1114 (signs
& 2) ? "-" : "", ((double) l2
) / 64, DEC_SUFFIX
[suffix
]);
1118 signs
= generate_random () & 3;
1119 l1
&= e
->type
->maxval
;
1120 l2
&= e
->type
->maxval
;
1122 "CINT(%s%" COMPAT_PRLL
"u%s,%s%" COMPAT_PRLL
"u%s),",
1123 (signs
& 1) ? "-" : "", l1
, l1
> 2147483647 ? "LL" : "",
1124 (signs
& 2) ? "-" : "", l2
, l2
> 2147483647 ? "LL" : "");
1125 signs
= generate_random () & 3;
1128 l1
&= e
->type
->maxval
;
1129 l2
&= e
->type
->maxval
;
1131 "CINT(%s%" COMPAT_PRLL
"u%s,%s%" COMPAT_PRLL
"u%s)",
1132 (signs
& 1) ? "-" : "", l1
, l1
> 2147483647 ? "LL" : "",
1133 (signs
& 2) ? "-" : "", l2
, l2
> 2147483647 ? "LL" : "");
1136 l1
&= e
->type
->maxval
;
1137 l2
&= e
->type
->maxval
;
1139 "CINT(%" COMPAT_PRLL
"uU%s,%" COMPAT_PRLL
"uU%s),",
1140 l1
, l1
> 4294967295U ? "LL" : "",
1141 l2
, l2
> 4294967295U ? "LL" : "");
1144 l1
&= e
->type
->maxval
;
1145 l2
&= e
->type
->maxval
;
1147 "CINT(%" COMPAT_PRLL
"uU%s,%" COMPAT_PRLL
"uU%s)",
1148 l1
, l1
> 4294967295U ? "LL" : "",
1149 l2
, l2
> 4294967295U ? "LL" : "");
1154 signs
= generate_random () & 3;
1155 fprintf (outfile
, "CDBL(%s%f,%s%f),",
1156 (signs
& 1) ? "-" : "", ((double) l1
) / 64,
1157 (signs
& 2) ? "-" : "", ((double) l2
) / 64);
1162 signs
= generate_random () & 3;
1163 fprintf (outfile
, "CDBL(%s%f,%s%f)",
1164 (signs
& 1) ? "-" : "", ((double) l1
) / 64,
1165 (signs
& 2) ? "-" : "", ((double) l2
) / 64);
1168 if (e
->type
->maxval
== 0)
1169 fputs ("e0_0,e0_0", outfile
);
1170 else if (e
->type
->maxval
== 1)
1171 fprintf (outfile
, "e1_%" COMPAT_PRLL
"d,e1_%" COMPAT_PRLL
"d",
1175 p
= strchr (e
->type
->name
, '\0');
1176 while (--p
>= e
->type
->name
&& *p
>= '0' && *p
<= '9');
1181 l1
+= e
->type
->maxval
- 6;
1183 l2
+= e
->type
->maxval
- 6;
1184 fprintf (outfile
, "e%s_%" COMPAT_PRLL
"d,e%s_%" COMPAT_PRLL
"d",
1189 p
= strchr (e
->type
->name
, '\0');
1190 while (--p
>= e
->type
->name
&& *p
>= '0' && *p
<= '9');
1194 fprintf (outfile
, "e%s_%s%" COMPAT_PRLL
"d,e%s_%s%" COMPAT_PRLL
"d",
1195 p
, l1
< 3 ? "m" : "",
1196 l1
== 3 ? 0LL : e
->type
->maxval
- (l1
& 3),
1197 p
, l2
< 3 ? "m" : "",
1198 l2
== 3 ? 0LL : e
->type
->maxval
- (l2
& 3));
1204 "(%s)&intarray[%" COMPAT_PRLL
"d], (%s)&intarray[%" COMPAT_PRLL
"d]",
1205 e
->type
->name
, l1
, e
->type
->name
, l2
);
1210 fprintf (outfile
, "fn%" COMPAT_PRLL
"d,fn%" COMPAT_PRLL
"d", l1
, l2
);
1215 fputs (")", outfile
);
1219 subvalues (struct entry
*e
, char *p
, char *letter
)
1223 if (p
>= namebuf
+ sizeof (namebuf
) - 32)
1230 case ETYPE_STRUCT_ARRAY
:
1231 case ETYPE_UNION_ARRAY
:
1232 if (e
[0].arr_len
== 0 || e
[0].arr_len
== 255)
1234 *letter
+= 1 + e
[0].len
;
1235 return 1 + e
[0].len
;
1237 i
= generate_random () % e
[0].arr_len
;
1238 snprintf (p
, sizeof (namebuf
) - (p
- namebuf
) - 1,
1239 "%c[%d]", *letter
, i
);
1240 q
= strchr (p
, '\0');
1246 for (i
= 1; i
<= e
[0].len
; )
1248 i
+= subvalues (e
+ i
, q
, letter
);
1249 if (e
[0].etype
== ETYPE_UNION
|| e
[0].etype
== ETYPE_UNION_ARRAY
)
1251 *letter
+= e
[0].len
- i
+ 1;
1255 return 1 + e
[0].len
;
1258 output_FNB ('F', e
);
1261 if (e
[0].arr_len
== 0 || e
[0].arr_len
== 255)
1266 i
= generate_random () % e
[0].arr_len
;
1267 snprintf (p
, sizeof (namebuf
) - (p
- namebuf
),
1268 "%c[%d]", *letter
, i
);
1269 output_FNB ('F', e
);
1270 if ((generate_random () & 7) == 0)
1272 j
= generate_random () % e
[0].arr_len
;
1275 snprintf (p
, sizeof (namebuf
) - (p
- namebuf
),
1276 "%c[%d]", *letter
, j
);
1277 output_FNB ('F', e
);
1285 output_FNB ('B', e
);
1291 --------------------------------------------------------------------
1292 lookup2.c, by Bob Jenkins, December 1996, Public Domain.
1293 hash(), hash2(), hash3, and mix() are externally useful functions.
1294 Routines to test the hash are included if SELF_TEST is defined.
1295 You can use this free for any purpose. It has no warranty.
1296 --------------------------------------------------------------------
1300 --------------------------------------------------------------------
1301 mix -- mix 3 32-bit values reversibly.
1302 For every delta with one or two bit set, and the deltas of all three
1303 high bits or all three low bits, whether the original value of a,b,c
1304 is almost all zero or is uniformly distributed,
1305 * If mix() is run forward or backward, at least 32 bits in a,b,c
1306 have at least 1/4 probability of changing.
1307 * If mix() is run forward, every bit of c will change between 1/3 and
1308 2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.)
1309 mix() was built out of 36 single-cycle latency instructions in a
1310 structure that could supported 2x parallelism, like so:
1312 a -= c; x = (c>>13);
1316 c -= b; x = (b>>13);
1318 Unfortunately, superscalar Pentiums and Sparcs can't take advantage
1319 of that parallelism. They've also turned some of those single-cycle
1320 latency instructions into multi-cycle latency instructions. Still,
1321 this is the fastest good hash I could find. There were about 2^^68
1322 to choose from. I only looked at a billion or so.
1323 --------------------------------------------------------------------
1325 /* same, but slower, works on systems that might have 8 byte hashval_t's */
1326 #define mix(a,b,c) \
1328 a -= b; a -= c; a ^= (c>>13); \
1329 b -= c; b -= a; b ^= (a<< 8); \
1330 c -= a; c -= b; c ^= ((b&0xffffffff)>>13); \
1331 a -= b; a -= c; a ^= ((c&0xffffffff)>>12); \
1332 b -= c; b -= a; b = (b ^ (a<<16)) & 0xffffffff; \
1333 c -= a; c -= b; c = (c ^ (b>> 5)) & 0xffffffff; \
1334 a -= b; a -= c; a = (a ^ (c>> 3)) & 0xffffffff; \
1335 b -= c; b -= a; b = (b ^ (a<<10)) & 0xffffffff; \
1336 c -= a; c -= b; c = (c ^ (b>>15)) & 0xffffffff; \
1340 --------------------------------------------------------------------
1341 hash() -- hash a variable-length key into a 32-bit value
1342 k : the key (the unaligned variable-length array of bytes)
1343 len : the length of the key, counting by bytes
1344 level : can be any 4-byte value
1345 Returns a 32-bit value. Every bit of the key affects every bit of
1346 the return value. Every 1-bit and 2-bit delta achieves avalanche.
1347 About 36+6len instructions.
1349 The best hash table sizes are powers of 2. There is no need to do
1350 mod a prime (mod is sooo slow!). If you need less than 32 bits,
1351 use a bitmask. For example, if you need only 10 bits, do
1352 h = (h & hashmask(10));
1353 In which case, the hash table should have hashsize(10) elements.
1355 If you are hashing n strings (ub1 **)k, do it like this:
1356 for (i=0, h=0; i<n; ++i) h = hash( k[i], len[i], h);
1358 By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
1359 code any way you wish, private, educational, or commercial. It's free.
1361 See http://burtleburtle.net/bob/hash/evahash.html
1362 Use for hash table lookup, or anything where one collision in 2^32 is
1363 acceptable. Do NOT use for cryptographic purposes.
1364 --------------------------------------------------------------------
1368 iterative_hash (const void *k_in
/* the key */,
1369 register size_t length
/* the length of the key */,
1370 register hashval_t initval
/* the previous hash, or
1371 an arbitrary value */)
1373 register const unsigned char *k
= (const unsigned char *)k_in
;
1374 register hashval_t a
,b
,c
,len
;
1376 /* Set up the internal state */
1378 a
= b
= 0x9e3779b9; /* the golden ratio; an arbitrary value */
1379 c
= initval
; /* the previous hash value */
1381 /*---------------------------------------- handle most of the key */
1384 a
+= (k
[0] +((hashval_t
)k
[1]<<8) +((hashval_t
)k
[2]<<16) +((hashval_t
)k
[3]<<24));
1385 b
+= (k
[4] +((hashval_t
)k
[5]<<8) +((hashval_t
)k
[6]<<16) +((hashval_t
)k
[7]<<24));
1386 c
+= (k
[8] +((hashval_t
)k
[9]<<8) +((hashval_t
)k
[10]<<16)+((hashval_t
)k
[11]<<24));
1391 /*------------------------------------- handle the last 11 bytes */
1393 switch(len
) /* all the case statements fall through */
1395 case 11: c
+=((hashval_t
)k
[10]<<24);
1396 case 10: c
+=((hashval_t
)k
[9]<<16);
1397 case 9 : c
+=((hashval_t
)k
[8]<<8);
1398 /* the first byte of c is reserved for the length */
1399 case 8 : b
+=((hashval_t
)k
[7]<<24);
1400 case 7 : b
+=((hashval_t
)k
[6]<<16);
1401 case 6 : b
+=((hashval_t
)k
[5]<<8);
1403 case 4 : a
+=((hashval_t
)k
[3]<<24);
1404 case 3 : a
+=((hashval_t
)k
[2]<<16);
1405 case 2 : a
+=((hashval_t
)k
[1]<<8);
1407 /* case 0: nothing left to add */
1410 /*-------------------------------------------- report the result */
1415 e_hash (const void *a
)
1417 const struct entry
*e
= a
;
1421 if (e
[0].etype
!= ETYPE_STRUCT
&& e
[0].etype
!= ETYPE_UNION
)
1423 for (i
= 0; i
<= e
[0].len
; ++i
)
1426 ret
= iterative_hash (&e
[i
], offsetof (struct entry
, attrib
), ret
);
1427 attriblen
= e
[i
].attrib
? strlen (e
[i
].attrib
) : -1;
1428 ret
= iterative_hash (&attriblen
, sizeof (int), ret
);
1430 ret
= iterative_hash (e
[i
].attrib
, attriblen
, ret
);
1436 e_eq (const void *a
, const void *b
)
1438 const struct entry
*ea
= a
, *eb
= b
;
1440 if (ea
[0].etype
!= ETYPE_STRUCT
&& ea
[0].etype
!= ETYPE_UNION
)
1442 if (ea
[0].len
!= eb
[0].len
)
1444 for (i
= 0; i
<= ea
[0].len
; ++i
)
1446 if (ea
[i
].etype
!= eb
[i
].etype
1447 || ea
[i
].len
!= eb
[i
].len
1448 || ea
[i
].arr_len
!= eb
[i
].arr_len
1449 || ea
[i
].type
!= eb
[i
].type
)
1451 if ((ea
[i
].attrib
== NULL
) ^ (eb
[i
].attrib
== NULL
))
1453 if (ea
[i
].attrib
&& strcmp (ea
[i
].attrib
, eb
[i
].attrib
) != 0)
1460 e_exists (const struct entry
*e
)
1466 for (h
= hash_table
[hval
% HASH_SIZE
]; h
; h
= h
->next
)
1473 e_insert (struct entry
*e
)
1478 e
->next
= hash_table
[hval
% HASH_SIZE
];
1479 hash_table
[hval
% HASH_SIZE
] = e
;
1483 output (struct entry
*e
)
1488 const char *skip_cint
= "";
1490 if (e
[0].etype
!= ETYPE_STRUCT
&& e
[0].etype
!= ETYPE_UNION
)
1496 n
= (struct entry
*) malloc ((e
[0].len
+ 1) * sizeof (struct entry
));
1497 memcpy (n
, e
, (e
[0].len
+ 1) * sizeof (struct entry
));
1501 switchfiles (e
[0].len
);
1503 for (i
= 1; i
<= e
[0].len
; ++i
)
1504 if ((e
[i
].etype
== ETYPE_TYPE
|| e
[i
].etype
== ETYPE_ARRAY
)
1505 && (e
[i
].type
->type
== TYPE_CINT
|| e
[i
].type
->type
== TYPE_CUINT
))
1510 fprintf (outfile
, (generate_random () & 1)
1511 ? "TX%s(%d,%s %s,," : "TX%s(%d,%s,%s,", skip_cint
,
1512 idx
, e
[0].etype
== ETYPE_STRUCT
? "struct" : "union",
1514 else if (e
[0].etype
== ETYPE_STRUCT
)
1515 fprintf (outfile
, "T%s(%d,", skip_cint
, idx
);
1517 fprintf (outfile
, "U%s(%d,", skip_cint
, idx
);
1519 for (i
= 1; i
<= e
[0].len
; )
1520 i
+= subfield (e
+ i
, &c
);
1521 fputs (",", outfile
);
1523 for (i
= 1; i
<= e
[0].len
; )
1525 i
+= subvalues (e
+ i
, namebuf
, &c
);
1526 if (e
[0].etype
== ETYPE_UNION
)
1529 fputs (")\n", outfile
);
1530 if (output_one
&& idx
== limidx
)
1538 FEATURE_COMPLEX
= 2,
1539 FEATURE_ALIGNEDPACKED
= 4,
1540 FEATURE_ZEROARRAY
= 8,
1541 FEATURE_ZEROBITFLD
= 16,
1542 ALL_FEATURES
= FEATURE_COMPLEX
| FEATURE_VECTOR
| FEATURE_ZEROARRAY
1543 | FEATURE_ALIGNEDPACKED
| FEATURE_ZEROBITFLD
1547 singles (enum FEATURE features
)
1551 memset (e
, 0, sizeof (e
));
1552 e
[0].etype
= ETYPE_STRUCT
;
1554 e
[0].etype
= ETYPE_UNION
;
1557 i
< ((features
& FEATURE_ALIGNEDPACKED
) ? NATTRIBS2
: NATTRIBS1
);
1560 e
[0].attrib
= attributes
[i
];
1561 e
[0].etype
= ETYPE_STRUCT
;
1563 e
[0].etype
= ETYPE_UNION
;
1568 for (i
= 0; i
< NTYPES2
; ++i
)
1570 e
[0].etype
= ETYPE_STRUCT
;
1571 e
[1].etype
= ETYPE_TYPE
;
1572 e
[1].type
= &base_types
[i
];
1574 e
[0].etype
= ETYPE_UNION
;
1577 if (features
& FEATURE_COMPLEX
)
1578 for (i
= 0; i
< NCTYPES2
; ++i
)
1580 e
[0].etype
= ETYPE_STRUCT
;
1581 e
[1].etype
= ETYPE_TYPE
;
1582 e
[1].type
= &complex_types
[i
];
1584 e
[0].etype
= ETYPE_UNION
;
1587 if (features
& FEATURE_VECTOR
)
1588 for (i
= 0; i
< NVTYPES2
; ++i
)
1590 e
[0].etype
= ETYPE_STRUCT
;
1591 e
[1].etype
= ETYPE_TYPE
;
1592 e
[1].type
= &vector_types
[i
];
1594 e
[0].etype
= ETYPE_UNION
;
1600 choose_type (enum FEATURE features
, struct entry
*e
, int r
, int in_array
)
1604 i
= NTYPES2
- NTYPES1
;
1605 if (features
& FEATURE_COMPLEX
)
1607 if (features
& FEATURE_VECTOR
)
1614 if (features
& FEATURE_COMPLEX
)
1620 if (features
& FEATURE_COMPLEX
)
1626 if (r
< NTYPES2
- NTYPES1
)
1627 e
->type
= &base_types
[r
+ NTYPES1
];
1628 r
-= NTYPES2
- NTYPES1
;
1629 if (e
->type
== NULL
&& (features
& FEATURE_COMPLEX
))
1632 e
->type
= &complex_types
[r
];
1635 if (e
->type
== NULL
&& (features
& FEATURE_VECTOR
))
1638 e
->type
= &vector_types
[r
];
1641 if (e
->type
== NULL
&& !in_array
)
1644 e
->type
= &attrib_types
[r
];
1647 if (e
->type
== NULL
&& !in_array
&& (features
& FEATURE_COMPLEX
))
1650 e
->type
= &complex_attrib_types
[r
];
1653 if (e
->type
== NULL
&& in_array
)
1656 e
->type
= &attrib_array_types
[r
];
1659 if (e
->type
== NULL
&& in_array
&& (features
& FEATURE_COMPLEX
))
1662 e
->type
= &complex_attrib_array_types
[r
];
1665 if (e
->type
== NULL
)
1669 /* This is from gcc.c-torture/execute/builtin-bitops-1.c. */
1671 my_ffsll (unsigned long long x
)
1676 /* We've tested LLONG_MAX for 64 bits so this should be safe. */
1677 for (i
= 0; i
< 64; i
++)
1678 if (x
& (1ULL << i
))
1684 generate_fields (enum FEATURE features
, struct entry
*e
, struct entry
*parent
,
1687 int r
, i
, j
, ret
= 1, n
, incr
, sametype
;
1689 for (n
= 0; n
< len
; n
+= incr
)
1691 r
= generate_random ();
1692 /* 50% ETYPE_TYPE base_types NTYPES1
1693 12.5% ETYPE_TYPE other
1696 12.5% ETYPE_STRUCT|ETYPE_UNION|ETYPE_STRUCT_ARRAY|ETYPE_UNION_ARRAY */
1706 e
[n
].etype
= ETYPE_TYPE
;
1707 e
[n
].type
= &base_types
[r
% NTYPES1
];
1710 e
[n
].etype
= ETYPE_TYPE
;
1711 choose_type (features
, &e
[n
], r
, 0);
1714 e
[n
].etype
= ETYPE_ARRAY
;
1718 e
[n
].type
= &base_types
[r
% NTYPES1
];
1720 choose_type (features
, &e
[n
], r
, 1);
1721 r
= generate_random ();
1722 if ((features
& FEATURE_ZEROARRAY
) && (r
& 3) == 0)
1725 if (n
== len
- 1 && (r
& 4)
1726 && (parent
->etype
== ETYPE_STRUCT
1727 || parent
->etype
== ETYPE_STRUCT_ARRAY
))
1730 for (k
= 0; k
< n
; ++k
)
1731 if (e
[k
].etype
!= ETYPE_BITFLD
|| e
[k
].len
)
1738 else if ((r
& 3) != 3)
1739 e
[n
].arr_len
= (r
>> 2) & 7;
1741 e
[n
].arr_len
= (r
>> 2) & 31;
1754 incr
= 1 + (r
>> 3) % (len
- n
);
1759 incr
= 1 + (r
>> 3) % (len
- n
);
1762 for (j
= n
; j
< n
+ incr
; ++j
)
1766 e
[j
].etype
= ETYPE_BITFLD
;
1767 if (j
== n
|| !sametype
)
1770 r
= generate_random ();
1775 = &aligned_bitfld_types
[r
% n_aligned_bitfld_types
];
1778 = &bitfld_types
[r
% n_bitfld_types
];
1781 e
[j
].type
= e
[n
].type
;
1782 r
= generate_random ();
1785 switch (e
[j
].type
->bitfld
)
1787 case 'C': ma
= 8; break;
1788 case 'S': ma
= 16; break;
1789 case 'I': ma
= 32; break;
1791 case 'Q': ma
= 64; break;
1792 case 'B': ma
= 1; break;
1794 if (e
[j
].type
->type
== TYPE_UENUM
)
1795 mi
= my_ffsll (e
[j
].type
->maxval
+ 1) - 1;
1796 else if (e
[j
].type
->type
== TYPE_SENUM
)
1797 mi
= my_ffsll (e
[j
].type
->maxval
+ 1);
1804 else if (mi
> 16 || !short_enums
)
1815 if (sametype
&& (r
& 3) == 0 && ma
> 1)
1818 for (k
= n
; k
< j
; ++k
)
1821 e
[j
].len
= sum
? ma
- sum
: ma
;
1824 if (! (features
& FEATURE_ZEROBITFLD
) && mi
== 0)
1826 if (e
[j
].len
< mi
|| e
[j
].len
> ma
)
1827 e
[j
].len
= mi
+ (r
% (ma
+ 1 - mi
));
1829 if ((features
& FEATURE_ZEROBITFLD
) && (r
& 3) == 0
1840 e
[n
].etype
= ETYPE_STRUCT
;
1844 e
[n
].etype
= ETYPE_UNION
;
1848 e
[n
].etype
= ETYPE_STRUCT_ARRAY
;
1851 e
[n
].etype
= ETYPE_UNION_ARRAY
;
1855 e
[n
].len
= r
% (len
- n
);
1856 incr
= 1 + e
[n
].len
;
1857 generate_fields (features
, &e
[n
+ 1], &e
[n
], e
[n
].len
);
1858 if (e
[n
].etype
== ETYPE_STRUCT_ARRAY
1859 || e
[n
].etype
== ETYPE_UNION_ARRAY
)
1861 r
= generate_random ();
1862 if ((features
& FEATURE_ZEROARRAY
) && (r
& 3) == 0)
1865 if (n
+ incr
== len
&& (r
& 4)
1866 && (parent
->etype
== ETYPE_STRUCT
1867 || parent
->etype
== ETYPE_STRUCT_ARRAY
))
1870 for (k
= 0; k
< n
; ++k
)
1871 if (e
[k
].etype
!= ETYPE_BITFLD
|| e
[k
].len
)
1878 else if ((r
& 3) != 3)
1879 e
[n
].arr_len
= (r
>> 2) & 7;
1881 e
[n
].arr_len
= (r
>> 2) & 31;
1885 r
= generate_random ();
1889 i
= (features
& FEATURE_ALIGNEDPACKED
) ? NATTRIBS2
: NATTRIBS1
;
1890 e
[n
].attrib
= attributes
[r
% i
];
1891 if (! (features
& FEATURE_ALIGNEDPACKED
)
1892 && strcmp (e
[n
].attrib
, "atpa") == 0
1893 && ((e
[n
].type
>= &attrib_types
[0]
1894 && e
[n
].type
< &attrib_types
[NATYPES2
])
1895 || (e
[n
].type
>= &complex_attrib_types
[0]
1896 && e
[n
].type
< &complex_attrib_types
[NCATYPES2
])
1897 || (e
[n
].type
>= &attrib_array_types
[0]
1898 && e
[n
].type
< &attrib_array_types
[NAATYPES2
])
1899 || (e
[n
].type
>= &complex_attrib_array_types
[0]
1900 && e
[n
].type
< &complex_attrib_array_types
[NAATYPES2
])
1901 || (e
[n
].type
>= &aligned_bitfld_types
[0]
1902 && e
[n
].type
< &aligned_bitfld_types
[n_aligned_bitfld_types
])))
1909 generate_random_tests (enum FEATURE features
, int len
)
1911 struct entry e
[len
+ 1];
1913 if (len
> 'z' - 'a' + 1)
1915 memset (e
, 0, sizeof (e
));
1916 r
= generate_random ();
1918 e
[0].etype
= ETYPE_UNION
;
1920 e
[0].etype
= ETYPE_STRUCT
;
1926 if (features
& FEATURE_ALIGNEDPACKED
)
1930 e
[0].attrib
= attributes
[r
];
1932 generate_fields (features
, &e
[1], &e
[0], len
);
1936 struct { const char *name
; enum FEATURE f
; }
1939 { "complex", FEATURE_COMPLEX
},
1940 { "vector", FEATURE_VECTOR
},
1941 { "[0] :0", FEATURE_ZEROARRAY
| FEATURE_ZEROBITFLD
},
1942 { "complex vector [0]",
1943 FEATURE_COMPLEX
| FEATURE_VECTOR
| FEATURE_ZEROARRAY
},
1944 { "aligned packed complex vector [0] :0",
1945 FEATURE_COMPLEX
| FEATURE_VECTOR
| FEATURE_ZEROARRAY
1946 | FEATURE_ALIGNEDPACKED
| FEATURE_ZEROBITFLD
},
1950 main (int argc
, char **argv
)
1952 int i
, j
, count
, c
, n
= 3000;
1955 if (sizeof (int) != 4 || sizeof (long long) != 8)
1962 if (argv
[i
][0] == '-' && argv
[i
][2] == '\0')
1964 optarg
= argv
[i
+ 1];
1980 limidx
= atoi (optarg
);
1987 fprintf (stderr
, "unrecognized option %s\n", argv
[i
]);
1995 outfile
= fopen ("/dev/null", "w");
1996 if (outfile
== NULL
)
1998 fputs ("could not open /dev/null", stderr
);
2004 if (destdir
== NULL
&& !output_one
)
2007 fprintf (stderr
, "Usage:\n\
2008 %s [-e] [-s srcdir -d destdir] [-n count] [-i idx]\n\
2009 Either -s srcdir -d destdir or -i idx must be used\n", argv
[0]);
2013 if (srcdir
== NULL
&& !output_one
)
2018 const char *s
= srcdir
;
2020 t
= ss
= malloc (strlen (srcdir
) + 1);
2032 for (i
= 0; i
< NTYPES2
; ++i
)
2033 if (base_types
[i
].bitfld
)
2034 bitfld_types
[n_bitfld_types
++] = base_types
[i
];
2035 for (i
= 0; i
< NATYPES2
; ++i
)
2036 if (attrib_types
[i
].bitfld
)
2037 aligned_bitfld_types
[n_aligned_bitfld_types
++] = attrib_types
[i
];
2038 for (i
= 0; i
< sizeof (features
) / sizeof (features
[0]); ++i
)
2047 for (j
= 1; j
<= 9; ++j
)
2048 while (idx
< startidx
+ j
* count
)
2049 generate_random_tests (features
[i
].f
, j
);
2050 while (idx
< startidx
+ count
* 10)
2051 generate_random_tests (features
[i
].f
, 10 + (generate_random () % 16));
2053 for (i
= 0; n
> 3000 && i
< sizeof (features
) / sizeof (features
[0]); ++i
)
2059 singles (features
[i
].f
);
2063 while (idx
< startidx
+ 1000)
2064 generate_random_tests (features
[i
].f
, 1);
2070 while (idx
< startidx
+ 100)
2071 generate_random_tests (features
[i
].f
, 1);
2074 for (j
= 2; j
<= 9; ++j
)
2075 while (idx
< startidx
+ (j
- 1) * count
)
2076 generate_random_tests (features
[i
].f
, j
);
2077 while (idx
< startidx
+ count
* 9)
2078 generate_random_tests (features
[i
].f
, 10 + (generate_random () % 16));
2083 generate_random_tests (ALL_FEATURES
, 1 + (generate_random () % 25));