1 | /* Get common system includes and various definitions and declarations based |
2 | on autoconf macros. |
3 | Copyright (C) 1998-2023 Free Software Foundation, Inc. |
4 | |
5 | This file is part of GCC. |
6 | |
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 |
10 | version. |
11 | |
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 |
15 | for more details. |
16 | |
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/>. */ |
20 | |
21 | |
22 | #ifndef GCC_SYSTEM_H |
23 | #define GCC_SYSTEM_H |
24 | |
25 | /* Define this so that inttypes.h defines the PRI?64 macros even |
26 | when compiling with a C++ compiler. Define it here so in the |
27 | event inttypes.h gets pulled in by another header it is already |
28 | defined. */ |
29 | #define __STDC_FORMAT_MACROS |
30 | |
31 | /* We must include stdarg.h before stdio.h. */ |
32 | #include <stdarg.h> |
33 | |
34 | #ifndef va_copy |
35 | # ifdef __va_copy |
36 | # define va_copy(d,s) __va_copy (d, s) |
37 | # else |
38 | # define va_copy(d,s) ((d) = (s)) |
39 | # endif |
40 | #endif |
41 | |
42 | #ifdef HAVE_STDDEF_H |
43 | # include <stddef.h> |
44 | #endif |
45 | |
46 | #include <stdio.h> |
47 | |
48 | /* Define a generic NULL if one hasn't already been defined. */ |
49 | #ifndef NULL |
50 | #define NULL 0 |
51 | #endif |
52 | |
53 | /* Use the unlocked open routines from libiberty. */ |
54 | |
55 | /* Some of these are #define on some systems, e.g. on AIX to redirect |
56 | the names to 64bit capable functions for LARGE_FILES support. These |
57 | redefs are pointless here so we can override them. */ |
58 | |
59 | #undef fopen |
60 | #undef freopen |
61 | |
62 | #define fopen(PATH, MODE) fopen_unlocked (PATH, MODE) |
63 | #define fdopen(FILDES, MODE) fdopen_unlocked (FILDES, MODE) |
64 | #define freopen(PATH, MODE, STREAM) freopen_unlocked (PATH, MODE, STREAM) |
65 | |
66 | /* The compiler is not a multi-threaded application and therefore we |
67 | do not have to use the locking functions. In fact, using the locking |
68 | functions can cause the compiler to be significantly slower under |
69 | I/O bound conditions (such as -g -O0 on very large source files). |
70 | |
71 | HAVE_DECL_PUTC_UNLOCKED actually indicates whether or not the stdio |
72 | code is multi-thread safe by default. If it is set to 0, then do |
73 | not worry about using the _unlocked functions. |
74 | |
75 | fputs_unlocked, fwrite_unlocked, and fprintf_unlocked are |
76 | extensions and need to be prototyped by hand (since we do not |
77 | define _GNU_SOURCE). */ |
78 | |
79 | #if defined HAVE_DECL_PUTC_UNLOCKED && HAVE_DECL_PUTC_UNLOCKED |
80 | |
81 | # ifdef HAVE_PUTC_UNLOCKED |
82 | # undef putc |
83 | # define putc(C, Stream) putc_unlocked (C, Stream) |
84 | # endif |
85 | # ifdef HAVE_PUTCHAR_UNLOCKED |
86 | # undef putchar |
87 | # define putchar(C) putchar_unlocked (C) |
88 | # endif |
89 | # ifdef HAVE_GETC_UNLOCKED |
90 | # undef getc |
91 | # define getc(Stream) getc_unlocked (Stream) |
92 | # endif |
93 | # ifdef HAVE_GETCHAR_UNLOCKED |
94 | # undef getchar |
95 | # define getchar() getchar_unlocked () |
96 | # endif |
97 | # ifdef HAVE_FPUTC_UNLOCKED |
98 | # undef fputc |
99 | # define fputc(C, Stream) fputc_unlocked (C, Stream) |
100 | # endif |
101 | |
102 | #ifdef __cplusplus |
103 | extern "C" { |
104 | #endif |
105 | |
106 | # ifdef HAVE_CLEARERR_UNLOCKED |
107 | # undef clearerr |
108 | # define clearerr(Stream) clearerr_unlocked (Stream) |
109 | # if defined (HAVE_DECL_CLEARERR_UNLOCKED) && !HAVE_DECL_CLEARERR_UNLOCKED |
110 | extern void clearerr_unlocked (FILE *); |
111 | # endif |
112 | # endif |
113 | # ifdef HAVE_FEOF_UNLOCKED |
114 | # undef feof |
115 | # define feof(Stream) feof_unlocked (Stream) |
116 | # if defined (HAVE_DECL_FEOF_UNLOCKED) && !HAVE_DECL_FEOF_UNLOCKED |
117 | extern int feof_unlocked (FILE *); |
118 | # endif |
119 | # endif |
120 | # ifdef HAVE_FILENO_UNLOCKED |
121 | # undef fileno |
122 | # define fileno(Stream) fileno_unlocked (Stream) |
123 | # if defined (HAVE_DECL_FILENO_UNLOCKED) && !HAVE_DECL_FILENO_UNLOCKED |
124 | extern int fileno_unlocked (FILE *); |
125 | # endif |
126 | # endif |
127 | # ifdef HAVE_FFLUSH_UNLOCKED |
128 | # undef fflush |
129 | # define fflush(Stream) fflush_unlocked (Stream) |
130 | # if defined (HAVE_DECL_FFLUSH_UNLOCKED) && !HAVE_DECL_FFLUSH_UNLOCKED |
131 | extern int fflush_unlocked (FILE *); |
132 | # endif |
133 | # endif |
134 | # ifdef HAVE_FGETC_UNLOCKED |
135 | # undef fgetc |
136 | # define fgetc(Stream) fgetc_unlocked (Stream) |
137 | # if defined (HAVE_DECL_FGETC_UNLOCKED) && !HAVE_DECL_FGETC_UNLOCKED |
138 | extern int fgetc_unlocked (FILE *); |
139 | # endif |
140 | # endif |
141 | # ifdef HAVE_FGETS_UNLOCKED |
142 | # undef fgets |
143 | # define fgets(S, n, Stream) fgets_unlocked (S, n, Stream) |
144 | # if defined (HAVE_DECL_FGETS_UNLOCKED) && !HAVE_DECL_FGETS_UNLOCKED |
145 | extern char *fgets_unlocked (char *, int, FILE *); |
146 | # endif |
147 | # endif |
148 | # ifdef HAVE_FPUTS_UNLOCKED |
149 | # undef fputs |
150 | # define fputs(String, Stream) fputs_unlocked (String, Stream) |
151 | # if defined (HAVE_DECL_FPUTS_UNLOCKED) && !HAVE_DECL_FPUTS_UNLOCKED |
152 | extern int fputs_unlocked (const char *, FILE *); |
153 | # endif |
154 | # endif |
155 | # ifdef HAVE_FERROR_UNLOCKED |
156 | # undef ferror |
157 | # define ferror(Stream) ferror_unlocked (Stream) |
158 | # if defined (HAVE_DECL_FERROR_UNLOCKED) && !HAVE_DECL_FERROR_UNLOCKED |
159 | extern int ferror_unlocked (FILE *); |
160 | # endif |
161 | # endif |
162 | # ifdef HAVE_FREAD_UNLOCKED |
163 | # undef fread |
164 | # define fread(Ptr, Size, N, Stream) fread_unlocked (Ptr, Size, N, Stream) |
165 | # if defined (HAVE_DECL_FREAD_UNLOCKED) && !HAVE_DECL_FREAD_UNLOCKED |
166 | extern size_t fread_unlocked (void *, size_t, size_t, FILE *); |
167 | # endif |
168 | # endif |
169 | # ifdef HAVE_FWRITE_UNLOCKED |
170 | # undef fwrite |
171 | # define fwrite(Ptr, Size, N, Stream) fwrite_unlocked (Ptr, Size, N, Stream) |
172 | # if defined (HAVE_DECL_FWRITE_UNLOCKED) && !HAVE_DECL_FWRITE_UNLOCKED |
173 | extern size_t fwrite_unlocked (const void *, size_t, size_t, FILE *); |
174 | # endif |
175 | # endif |
176 | # ifdef HAVE_FPRINTF_UNLOCKED |
177 | # undef fprintf |
178 | /* We can't use a function-like macro here because we don't know if |
179 | we have varargs macros. */ |
180 | # define fprintf fprintf_unlocked |
181 | # if defined (HAVE_DECL_FPRINTF_UNLOCKED) && !HAVE_DECL_FPRINTF_UNLOCKED |
182 | extern int fprintf_unlocked (FILE *, const char *, ...); |
183 | # endif |
184 | # endif |
185 | |
186 | #ifdef __cplusplus |
187 | } |
188 | #endif |
189 | |
190 | #endif |
191 | |
192 | /* ??? Glibc's fwrite/fread_unlocked macros cause |
193 | "warning: signed and unsigned type in conditional expression". */ |
194 | #undef fread_unlocked |
195 | #undef fwrite_unlocked |
196 | |
197 | /* Include <string> before "safe-ctype.h" to avoid GCC poisoning |
198 | the ctype macros through safe-ctype.h */ |
199 | |
200 | #ifdef __cplusplus |
201 | #ifdef INCLUDE_STRING |
202 | # include <string> |
203 | #endif |
204 | #endif |
205 | |
206 | /* There are an extraordinary number of issues with <ctype.h>. |
207 | The last straw is that it varies with the locale. Use libiberty's |
208 | replacement instead. */ |
209 | #include "safe-ctype.h" |
210 | |
211 | #include <sys/types.h> |
212 | |
213 | #include <errno.h> |
214 | |
215 | #if !defined (errno) && defined (HAVE_DECL_ERRNO) && !HAVE_DECL_ERRNO |
216 | extern int errno; |
217 | #endif |
218 | |
219 | #ifdef __cplusplus |
220 | #if defined (INCLUDE_ALGORITHM) || !defined (HAVE_SWAP_IN_UTILITY) |
221 | # include <algorithm> |
222 | #endif |
223 | #ifdef INCLUDE_LIST |
224 | # include <list> |
225 | #endif |
226 | #ifdef INCLUDE_MAP |
227 | # include <map> |
228 | #endif |
229 | #ifdef INCLUDE_SET |
230 | # include <set> |
231 | #endif |
232 | #ifdef INCLUDE_VECTOR |
233 | # include <vector> |
234 | #endif |
235 | #ifdef INCLUDE_ARRAY |
236 | # include <array> |
237 | #endif |
238 | #ifdef INCLUDE_FUNCTIONAL |
239 | # include <functional> |
240 | #endif |
241 | # include <cstring> |
242 | # include <initializer_list> |
243 | # include <new> |
244 | # include <utility> |
245 | # include <type_traits> |
246 | #endif |
247 | |
248 | /* Some of glibc's string inlines cause warnings. Plus we'd rather |
249 | rely on (and therefore test) GCC's string builtins. */ |
250 | #define __NO_STRING_INLINES |
251 | |
252 | #ifdef STRING_WITH_STRINGS |
253 | # include <string.h> |
254 | # include <strings.h> |
255 | #else |
256 | # ifdef HAVE_STRING_H |
257 | # include <string.h> |
258 | # else |
259 | # ifdef HAVE_STRINGS_H |
260 | # include <strings.h> |
261 | # endif |
262 | # endif |
263 | #endif |
264 | |
265 | #ifdef HAVE_STDLIB_H |
266 | # include <stdlib.h> |
267 | #endif |
268 | |
269 | /* When compiling C++ we need to include <cstdlib> as well as <stdlib.h> so |
270 | that it is processed before we poison "malloc"; otherwise, if a source |
271 | file uses a standard library header that includes <cstdlib>, we will get |
272 | an error about 'using std::malloc'. */ |
273 | #ifdef __cplusplus |
274 | #include <cstdlib> |
275 | #endif |
276 | |
277 | /* Undef vec_free from AIX stdlib.h header which conflicts with vec.h. */ |
278 | #undef vec_free |
279 | |
280 | /* If we don't have an overriding definition, set SUCCESS_EXIT_CODE and |
281 | FATAL_EXIT_CODE to EXIT_SUCCESS and EXIT_FAILURE respectively, |
282 | or 0 and 1 if those macros are not defined. */ |
283 | #ifndef SUCCESS_EXIT_CODE |
284 | # ifdef EXIT_SUCCESS |
285 | # define SUCCESS_EXIT_CODE EXIT_SUCCESS |
286 | # else |
287 | # define SUCCESS_EXIT_CODE 0 |
288 | # endif |
289 | #endif |
290 | |
291 | #ifndef FATAL_EXIT_CODE |
292 | # ifdef EXIT_FAILURE |
293 | # define FATAL_EXIT_CODE EXIT_FAILURE |
294 | # else |
295 | # define FATAL_EXIT_CODE 1 |
296 | # endif |
297 | #endif |
298 | |
299 | #define ICE_EXIT_CODE 4 |
300 | |
301 | #ifdef HAVE_UNISTD_H |
302 | # include <unistd.h> |
303 | #endif |
304 | |
305 | #ifdef HAVE_SYS_PARAM_H |
306 | # include <sys/param.h> |
307 | /* We use these identifiers later and they appear in some vendor param.h's. */ |
308 | # undef PREFETCH |
309 | # undef m_slot |
310 | #endif |
311 | |
312 | #if HAVE_LIMITS_H |
313 | # include <limits.h> |
314 | #endif |
315 | |
316 | /* A macro to determine whether a VALUE lies inclusively within a |
317 | certain range without evaluating the VALUE more than once. This |
318 | macro won't warn if the VALUE is unsigned and the LOWER bound is |
319 | zero, as it would e.g. with "VALUE >= 0 && ...". Note the LOWER |
320 | bound *is* evaluated twice, and LOWER must not be greater than |
321 | UPPER. However the bounds themselves can be either positive or |
322 | negative. */ |
323 | #define IN_RANGE(VALUE, LOWER, UPPER) \ |
324 | ((unsigned HOST_WIDE_INT) (VALUE) - (unsigned HOST_WIDE_INT) (LOWER) \ |
325 | <= (unsigned HOST_WIDE_INT) (UPPER) - (unsigned HOST_WIDE_INT) (LOWER)) |
326 | |
327 | /* Infrastructure for defining missing _MAX and _MIN macros. Note that |
328 | macros defined with these cannot be used in #if. */ |
329 | |
330 | /* The extra casts work around common compiler bugs. */ |
331 | #define INTTYPE_SIGNED(t) (! ((t) 0 < (t) -1)) |
332 | /* The outer cast is needed to work around a bug in Cray C 5.0.3.0. |
333 | It is necessary at least when t == time_t. */ |
334 | #define INTTYPE_MINIMUM(t) ((t) (INTTYPE_SIGNED (t) \ |
335 | ? (t) 1 << (sizeof (t) * CHAR_BIT - 1) : (t) 0)) |
336 | #define INTTYPE_MAXIMUM(t) ((t) (~ (t) 0 - INTTYPE_MINIMUM (t))) |
337 | |
338 | /* Use that infrastructure to provide a few constants. */ |
339 | #ifndef UCHAR_MAX |
340 | # define UCHAR_MAX INTTYPE_MAXIMUM (unsigned char) |
341 | #endif |
342 | |
343 | #ifdef TIME_WITH_SYS_TIME |
344 | # include <sys/time.h> |
345 | # include <time.h> |
346 | #else |
347 | # if HAVE_SYS_TIME_H |
348 | # include <sys/time.h> |
349 | # else |
350 | # ifdef HAVE_TIME_H |
351 | # include <time.h> |
352 | # endif |
353 | # endif |
354 | #endif |
355 | |
356 | #ifdef HAVE_FCNTL_H |
357 | # include <fcntl.h> |
358 | #else |
359 | # ifdef HAVE_SYS_FILE_H |
360 | # include <sys/file.h> |
361 | # endif |
362 | #endif |
363 | |
364 | #ifdef HAVE_SYS_LOCKING_H |
365 | # include <sys/locking.h> |
366 | #endif |
367 | |
368 | #ifndef SEEK_SET |
369 | # define SEEK_SET 0 |
370 | # define SEEK_CUR 1 |
371 | # define SEEK_END 2 |
372 | #endif |
373 | #ifndef F_OK |
374 | # define F_OK 0 |
375 | # define X_OK 1 |
376 | # define W_OK 2 |
377 | # define R_OK 4 |
378 | #endif |
379 | #ifndef O_RDONLY |
380 | # define O_RDONLY 0 |
381 | #endif |
382 | #ifndef O_WRONLY |
383 | # define O_WRONLY 1 |
384 | #endif |
385 | #ifndef O_BINARY |
386 | # define O_BINARY 0 |
387 | #endif |
388 | |
389 | /* Some systems define these in, e.g., param.h. We undefine these names |
390 | here to avoid the warnings. We prefer to use our definitions since we |
391 | know they are correct. */ |
392 | |
393 | #undef MIN |
394 | #undef MAX |
395 | #define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) |
396 | #define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) |
397 | |
398 | /* Returns the least number N such that N * Y >= X. */ |
399 | #define CEIL(x,y) (((x) + (y) - 1) / (y)) |
400 | |
401 | /* This macro rounds x up to the y boundary. */ |
402 | #define ROUND_UP(x,y) (((x) + (y) - 1) & ~((y) - 1)) |
403 | |
404 | /* This macro rounds x down to the y boundary. */ |
405 | #define ROUND_DOWN(x,y) ((x) & ~((y) - 1)) |
406 | |
407 | #ifdef HAVE_SYS_WAIT_H |
408 | #include <sys/wait.h> |
409 | #endif |
410 | |
411 | #ifndef WIFSIGNALED |
412 | #define WIFSIGNALED(S) (((S) & 0xff) != 0 && ((S) & 0xff) != 0x7f) |
413 | #endif |
414 | #ifndef WTERMSIG |
415 | #define WTERMSIG(S) ((S) & 0x7f) |
416 | #endif |
417 | #ifndef WIFEXITED |
418 | #define WIFEXITED(S) (((S) & 0xff) == 0) |
419 | #endif |
420 | #ifndef WEXITSTATUS |
421 | #define WEXITSTATUS(S) (((S) & 0xff00) >> 8) |
422 | #endif |
423 | #ifndef WSTOPSIG |
424 | #define WSTOPSIG WEXITSTATUS |
425 | #endif |
426 | #ifndef WCOREDUMP |
427 | #define WCOREDUMP(S) ((S) & WCOREFLG) |
428 | #endif |
429 | #ifndef WCOREFLG |
430 | #define WCOREFLG 0200 |
431 | #endif |
432 | |
433 | #include <signal.h> |
434 | #if !defined (SIGCHLD) && defined (SIGCLD) |
435 | # define SIGCHLD SIGCLD |
436 | #endif |
437 | |
438 | #ifdef HAVE_SYS_MMAN_H |
439 | # include <sys/mman.h> |
440 | #endif |
441 | |
442 | #ifndef MAP_FAILED |
443 | # define MAP_FAILED ((void *)-1) |
444 | #endif |
445 | |
446 | #if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) |
447 | # define MAP_ANONYMOUS MAP_ANON |
448 | #endif |
449 | |
450 | #ifdef HAVE_SYS_RESOURCE_H |
451 | # include <sys/resource.h> |
452 | #endif |
453 | |
454 | #ifdef HAVE_SYS_TIMES_H |
455 | # include <sys/times.h> |
456 | #endif |
457 | |
458 | /* The HAVE_DECL_* macros are three-state, undefined, 0 or 1. If they |
459 | are defined to 0 then we must provide the relevant declaration |
460 | here. These checks will be in the undefined state while configure |
461 | is running so be careful to test "defined (HAVE_DECL_*)". */ |
462 | |
463 | #ifdef __cplusplus |
464 | extern "C" { |
465 | #endif |
466 | |
467 | #if defined (HAVE_DECL_ATOF) && !HAVE_DECL_ATOF |
468 | extern double atof (const char *); |
469 | #endif |
470 | |
471 | #if defined (HAVE_DECL_ATOL) && !HAVE_DECL_ATOL |
472 | extern long atol (const char *); |
473 | #endif |
474 | |
475 | #if defined (HAVE_DECL_FREE) && !HAVE_DECL_FREE |
476 | extern void free (void *); |
477 | #endif |
478 | |
479 | #if defined (HAVE_DECL_GETCWD) && !HAVE_DECL_GETCWD |
480 | extern char *getcwd (char *, size_t); |
481 | #endif |
482 | |
483 | #if defined (HAVE_DECL_GETENV) && !HAVE_DECL_GETENV |
484 | extern char *getenv (const char *); |
485 | #endif |
486 | |
487 | #if defined (HAVE_DECL_GETOPT) && !HAVE_DECL_GETOPT |
488 | extern int getopt (int, char * const *, const char *); |
489 | #endif |
490 | |
491 | #if defined (HAVE_DECL_GETPAGESIZE) && !HAVE_DECL_GETPAGESIZE |
492 | extern int getpagesize (void); |
493 | #endif |
494 | |
495 | #if defined (HAVE_DECL_GETWD) && !HAVE_DECL_GETWD |
496 | extern char *getwd (char *); |
497 | #endif |
498 | |
499 | #if defined (HAVE_DECL_SBRK) && !HAVE_DECL_SBRK |
500 | extern void *sbrk (int); |
501 | #endif |
502 | |
503 | #if defined (HAVE_DECL_SETENV) && !HAVE_DECL_SETENV |
504 | int setenv(const char *, const char *, int); |
505 | #endif |
506 | |
507 | #if defined (HAVE_DECL_STRSTR) && !HAVE_DECL_STRSTR |
508 | extern char *strstr (const char *, const char *); |
509 | #endif |
510 | |
511 | #if defined (HAVE_DECL_STPCPY) && !HAVE_DECL_STPCPY |
512 | extern char *stpcpy (char *, const char *); |
513 | #endif |
514 | |
515 | #if defined (HAVE_DECL_UNSETENV) && !HAVE_DECL_UNSETENV |
516 | int unsetenv(const char *); |
517 | #endif |
518 | |
519 | #if defined (HAVE_DECL_MALLOC) && !HAVE_DECL_MALLOC |
520 | extern void *malloc (size_t); |
521 | #endif |
522 | |
523 | #if defined (HAVE_DECL_CALLOC) && !HAVE_DECL_CALLOC |
524 | extern void *calloc (size_t, size_t); |
525 | #endif |
526 | |
527 | #if defined (HAVE_DECL_REALLOC) && !HAVE_DECL_REALLOC |
528 | extern void *realloc (void *, size_t); |
529 | #endif |
530 | |
531 | #ifdef __cplusplus |
532 | } |
533 | #endif |
534 | |
535 | #ifdef HAVE_STDINT_H |
536 | #include <stdint.h> |
537 | #endif |
538 | |
539 | #ifdef HAVE_INTTYPES_H |
540 | #include <inttypes.h> |
541 | #endif |
542 | |
543 | #ifndef SIZE_MAX |
544 | # define SIZE_MAX INTTYPE_MAXIMUM (size_t) |
545 | #endif |
546 | |
547 | #ifdef __cplusplus |
548 | extern "C" { |
549 | #endif |
550 | |
551 | /* If the system doesn't provide strsignal, we get it defined in |
552 | libiberty but no declaration is supplied. */ |
553 | #if !defined (HAVE_STRSIGNAL) \ |
554 | || (defined (HAVE_DECL_STRSIGNAL) && !HAVE_DECL_STRSIGNAL) |
555 | # ifndef strsignal |
556 | extern const char *strsignal (int); |
557 | # endif |
558 | #endif |
559 | |
560 | #ifdef HAVE_GETRLIMIT |
561 | # if defined (HAVE_DECL_GETRLIMIT) && !HAVE_DECL_GETRLIMIT |
562 | # ifndef getrlimit |
563 | struct rlimit; |
564 | extern int getrlimit (int, struct rlimit *); |
565 | # endif |
566 | # endif |
567 | #endif |
568 | |
569 | #ifdef HAVE_SETRLIMIT |
570 | # if defined (HAVE_DECL_SETRLIMIT) && !HAVE_DECL_SETRLIMIT |
571 | # ifndef setrlimit |
572 | struct rlimit; |
573 | extern int setrlimit (int, const struct rlimit *); |
574 | # endif |
575 | # endif |
576 | #endif |
577 | |
578 | #if defined (HAVE_DECL_ABORT) && !HAVE_DECL_ABORT |
579 | extern void abort (void); |
580 | #endif |
581 | |
582 | #if defined (HAVE_DECL_SNPRINTF) && !HAVE_DECL_SNPRINTF |
583 | extern int snprintf (char *, size_t, const char *, ...); |
584 | #endif |
585 | |
586 | #if defined (HAVE_DECL_VSNPRINTF) && !HAVE_DECL_VSNPRINTF |
587 | extern int vsnprintf (char *, size_t, const char *, va_list); |
588 | #endif |
589 | |
590 | #ifdef __cplusplus |
591 | } |
592 | #endif |
593 | |
594 | /* 1 if we have C99 designated initializers. */ |
595 | #if !defined(HAVE_DESIGNATED_INITIALIZERS) |
596 | #ifdef __cplusplus |
597 | #define HAVE_DESIGNATED_INITIALIZERS 0 |
598 | #else |
599 | #define HAVE_DESIGNATED_INITIALIZERS \ |
600 | ((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)) |
601 | #endif |
602 | #endif |
603 | |
604 | #if !defined(HAVE_DESIGNATED_UNION_INITIALIZERS) |
605 | #ifdef __cplusplus |
606 | #define HAVE_DESIGNATED_UNION_INITIALIZERS (GCC_VERSION >= 4007) |
607 | #else |
608 | #define HAVE_DESIGNATED_UNION_INITIALIZERS \ |
609 | ((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)) |
610 | #endif |
611 | #endif |
612 | |
613 | #if HAVE_SYS_STAT_H |
614 | # include <sys/stat.h> |
615 | #endif |
616 | |
617 | /* Test if something is a normal file. */ |
618 | #ifndef S_ISREG |
619 | #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) |
620 | #endif |
621 | |
622 | /* Test if something is a directory. */ |
623 | #ifndef S_ISDIR |
624 | #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) |
625 | #endif |
626 | |
627 | /* Test if something is a character special file. */ |
628 | #ifndef S_ISCHR |
629 | #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) |
630 | #endif |
631 | |
632 | /* Test if something is a block special file. */ |
633 | #ifndef S_ISBLK |
634 | #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) |
635 | #endif |
636 | |
637 | /* Test if something is a socket. */ |
638 | #ifndef S_ISSOCK |
639 | # ifdef S_IFSOCK |
640 | # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) |
641 | # else |
642 | # define S_ISSOCK(m) 0 |
643 | # endif |
644 | #endif |
645 | |
646 | /* Test if something is a FIFO. */ |
647 | #ifndef S_ISFIFO |
648 | # ifdef S_IFIFO |
649 | # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) |
650 | # else |
651 | # define S_ISFIFO(m) 0 |
652 | # endif |
653 | #endif |
654 | |
655 | /* Define well known filenos if the system does not define them. */ |
656 | #ifndef STDIN_FILENO |
657 | # define STDIN_FILENO 0 |
658 | #endif |
659 | #ifndef STDOUT_FILENO |
660 | # define STDOUT_FILENO 1 |
661 | #endif |
662 | #ifndef STDERR_FILENO |
663 | # define STDERR_FILENO 2 |
664 | #endif |
665 | |
666 | /* Some systems have mkdir that takes a single argument. */ |
667 | #ifdef MKDIR_TAKES_ONE_ARG |
668 | # define mkdir(a,b) mkdir (a) |
669 | #endif |
670 | |
671 | #ifndef HAVE_KILL |
672 | # define kill(p,s) raise (s) |
673 | #endif |
674 | |
675 | /* Provide a way to print an address via printf. */ |
676 | #ifndef HOST_PTR_PRINTF |
677 | #define HOST_PTR_PRINTF "%p" |
678 | #endif /* ! HOST_PTR_PRINTF */ |
679 | |
680 | /* By default, colon separates directories in a path. */ |
681 | #ifndef PATH_SEPARATOR |
682 | #define PATH_SEPARATOR ':' |
683 | #endif |
684 | |
685 | /* Filename handling macros. */ |
686 | #include "filenames.h" |
687 | |
688 | /* These should be phased out in favor of IS_DIR_SEPARATOR, where possible. */ |
689 | #ifndef DIR_SEPARATOR |
690 | # define DIR_SEPARATOR '/' |
691 | # ifdef HAVE_DOS_BASED_FILE_SYSTEM |
692 | # define DIR_SEPARATOR_2 '\\' |
693 | # endif |
694 | #endif |
695 | |
696 | #if defined (ENABLE_PLUGIN) && defined (HAVE_DLFCN_H) |
697 | /* If plugin support is enabled, we could use libdl. */ |
698 | #include <dlfcn.h> |
699 | #endif |
700 | |
701 | /* Do not introduce a gmp.h dependency on the build system. */ |
702 | #ifndef GENERATOR_FILE |
703 | #include <gmp.h> |
704 | |
705 | class auto_mpz |
706 | { |
707 | public: |
708 | auto_mpz () { mpz_init (m_mpz); } |
709 | ~auto_mpz () { mpz_clear (m_mpz); } |
710 | |
711 | operator mpz_t& () { return m_mpz; } |
712 | mpz_ptr operator-> () { return m_mpz; } |
713 | |
714 | auto_mpz (const auto_mpz &) = delete; |
715 | auto_mpz &operator= (const auto_mpz &) = delete; |
716 | |
717 | #if GCC_VERSION < 4008 || GCC_VERSION >= 5000 |
718 | /* GCC 4.8 and 4.9 don't support this, only fixed in PR62101 for 5.0. */ |
719 | friend void mpz_clear (auto_mpz&) = delete; |
720 | friend void mpz_init (auto_mpz&) = delete; |
721 | #endif |
722 | |
723 | private: |
724 | mpz_t m_mpz; |
725 | }; |
726 | #endif |
727 | |
728 | /* Get libiberty declarations. */ |
729 | #include "libiberty.h" |
730 | |
731 | #undef FFS /* Some systems predefine this symbol; don't let it interfere. */ |
732 | #undef FLOAT /* Likewise. */ |
733 | #undef ABS /* Likewise. */ |
734 | #undef PC /* Likewise. */ |
735 | |
736 | /* Provide a default for the HOST_BIT_BUCKET. |
737 | This suffices for POSIX-like hosts. */ |
738 | |
739 | #ifndef HOST_BIT_BUCKET |
740 | #define HOST_BIT_BUCKET "/dev/null" |
741 | #endif |
742 | |
743 | #ifndef offsetof |
744 | #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER) |
745 | #endif |
746 | |
747 | /* Various error reporting routines want to use __FUNCTION__. */ |
748 | #if (GCC_VERSION < 2007) |
749 | #ifndef __FUNCTION__ |
750 | #define __FUNCTION__ "?" |
751 | #endif /* ! __FUNCTION__ */ |
752 | #endif |
753 | |
754 | /* __builtin_expect(A, B) evaluates to A, but notifies the compiler that |
755 | the most likely value of A is B. This feature was added at some point |
756 | between 2.95 and 3.0. Let's use 3.0 as the lower bound for now. */ |
757 | #if (GCC_VERSION < 3000) |
758 | #define __builtin_expect(a, b) (a) |
759 | #endif |
760 | |
761 | #define LIKELY(x) (__builtin_expect ((x), 1)) |
762 | #define UNLIKELY(x) (__builtin_expect ((x), 0)) |
763 | |
764 | /* Some of the headers included by <memory> can use "abort" within a |
765 | namespace, e.g. "_VSTD::abort();", which fails after we use the |
766 | preprocessor to redefine "abort" as "fancy_abort" below. */ |
767 | |
768 | #ifdef INCLUDE_MEMORY |
769 | # include <memory> |
770 | #endif |
771 | |
772 | #ifdef INCLUDE_MUTEX |
773 | # include <mutex> |
774 | #endif |
775 | |
776 | #ifdef INCLUDE_SSTREAM |
777 | # include <sstream> |
778 | #endif |
779 | |
780 | #ifdef INCLUDE_MALLOC_H |
781 | #if defined(HAVE_MALLINFO) || defined(HAVE_MALLINFO2) |
782 | #include <malloc.h> |
783 | #endif |
784 | #endif |
785 | |
786 | #ifdef INCLUDE_ISL |
787 | #ifdef HAVE_isl |
788 | #include <isl/options.h> |
789 | #include <isl/ctx.h> |
790 | #include <isl/val.h> |
791 | #include <isl/set.h> |
792 | #include <isl/union_set.h> |
793 | #include <isl/map.h> |
794 | #include <isl/union_map.h> |
795 | #include <isl/aff.h> |
796 | #include <isl/constraint.h> |
797 | #include <isl/flow.h> |
798 | #include <isl/ilp.h> |
799 | #include <isl/schedule.h> |
800 | #include <isl/ast_build.h> |
801 | #include <isl/schedule_node.h> |
802 | #include <isl/id.h> |
803 | #include <isl/space.h> |
804 | #endif |
805 | #endif |
806 | |
807 | /* Redefine 'abort' to report an internal error w/o coredump, and |
808 | reporting the location of the error in the source file. |
809 | Instead of directly calling 'abort' or 'fancy_abort', GCC code |
810 | should normally call 'internal_error' with a specific message. */ |
811 | extern void fancy_abort (const char *, int, const char *) |
812 | ATTRIBUTE_NORETURN ATTRIBUTE_COLD; |
813 | #define abort() fancy_abort (__FILE__, __LINE__, __FUNCTION__) |
814 | |
815 | /* Use gcc_assert(EXPR) to test invariants. */ |
816 | #if ENABLE_ASSERT_CHECKING |
817 | #define gcc_assert(EXPR) \ |
818 | ((void)(!(EXPR) ? fancy_abort (__FILE__, __LINE__, __FUNCTION__), 0 : 0)) |
819 | #elif (GCC_VERSION >= 4005) |
820 | #define gcc_assert(EXPR) \ |
821 | ((void)(UNLIKELY (!(EXPR)) ? __builtin_unreachable (), 0 : 0)) |
822 | #else |
823 | /* Include EXPR, so that unused variable warnings do not occur. */ |
824 | #define gcc_assert(EXPR) ((void)(0 && (EXPR))) |
825 | #endif |
826 | |
827 | #if CHECKING_P |
828 | #define gcc_checking_assert(EXPR) gcc_assert (EXPR) |
829 | #else |
830 | /* N.B.: in release build EXPR is not evaluated. */ |
831 | #define gcc_checking_assert(EXPR) ((void)(0 && (EXPR))) |
832 | #endif |
833 | |
834 | #if GCC_VERSION >= 4000 |
835 | #define ALWAYS_INLINE inline __attribute__ ((always_inline)) |
836 | #else |
837 | #define ALWAYS_INLINE inline |
838 | #endif |
839 | |
840 | #if GCC_VERSION >= 3004 |
841 | #define WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__)) |
842 | #else |
843 | #define WARN_UNUSED_RESULT |
844 | #endif |
845 | |
846 | /* Use gcc_unreachable() to mark unreachable locations (like an |
847 | unreachable default case of a switch. Do not use gcc_assert(0). */ |
848 | #if (GCC_VERSION >= 4005) && !ENABLE_ASSERT_CHECKING |
849 | #define gcc_unreachable() __builtin_unreachable () |
850 | #else |
851 | #define gcc_unreachable() (fancy_abort (__FILE__, __LINE__, __FUNCTION__)) |
852 | #endif |
853 | |
854 | #if GCC_VERSION >= 7000 && defined(__has_attribute) |
855 | # if __has_attribute(fallthrough) |
856 | # define gcc_fallthrough() __attribute__((fallthrough)) |
857 | # else |
858 | # define gcc_fallthrough() |
859 | # endif |
860 | #else |
861 | # define gcc_fallthrough() |
862 | #endif |
863 | |
864 | #if GCC_VERSION >= 3001 |
865 | #define STATIC_CONSTANT_P(X) (__builtin_constant_p (X) && (X)) |
866 | #else |
867 | #define STATIC_CONSTANT_P(X) (false && (X)) |
868 | #endif |
869 | |
870 | #ifdef __cplusplus |
871 | #define STATIC_ASSERT(X) \ |
872 | static_assert ((X), #X) |
873 | #else |
874 | #define STATIC_ASSERT(X) \ |
875 | typedef int assertion1[(X) ? 1 : -1] ATTRIBUTE_UNUSED |
876 | #endif |
877 | |
878 | /* Provide a fake boolean type. We make no attempt to use the |
879 | C99 _Bool, as it may not be available in the bootstrap compiler, |
880 | and even if it is, it is liable to be buggy. |
881 | This must be after all inclusion of system headers, as some of |
882 | them will mess us up. */ |
883 | |
884 | #undef TRUE |
885 | #undef FALSE |
886 | |
887 | #ifdef __cplusplus |
888 | /* Obsolete. */ |
889 | # define TRUE true |
890 | # define FALSE false |
891 | #else /* !__cplusplus */ |
892 | # undef bool |
893 | # undef true |
894 | # undef false |
895 | |
896 | # define bool unsigned char |
897 | # define true 1 |
898 | # define false 0 |
899 | |
900 | /* Obsolete. */ |
901 | # define TRUE true |
902 | # define FALSE false |
903 | #endif /* !__cplusplus */ |
904 | |
905 | /* Some compilers do not allow the use of unsigned char in bitfields. */ |
906 | #define BOOL_BITFIELD unsigned int |
907 | |
908 | /* As the last action in this file, we poison the identifiers that |
909 | shouldn't be used. Note, luckily gcc-3.0's token-based integrated |
910 | preprocessor won't trip on poisoned identifiers that arrive from |
911 | the expansion of macros. E.g. #define strrchr rindex, won't error |
912 | if rindex is poisoned after this directive is issued and later on |
913 | strrchr is called. |
914 | |
915 | Note: We define bypass macros for the few cases where we really |
916 | want to use the libc memory allocation routines. Otherwise we |
917 | insist you use the "x" versions from libiberty. */ |
918 | |
919 | #define really_call_malloc malloc |
920 | #define really_call_calloc calloc |
921 | #define really_call_realloc realloc |
922 | |
923 | #if defined(FLEX_SCANNER) || defined(YYBISON) || defined(YYBYACC) |
924 | /* Flex and bison use malloc and realloc. Yuk. Note that this means |
925 | really_call_* cannot be used in a .l or .y file. */ |
926 | #define malloc xmalloc |
927 | #define realloc xrealloc |
928 | #endif |
929 | |
930 | #if (GCC_VERSION >= 3000) |
931 | |
932 | /* Note autoconf checks for prototype declarations and includes |
933 | system.h while doing so. Only poison these tokens if actually |
934 | compiling gcc, so that the autoconf declaration tests for malloc |
935 | etc don't spuriously fail. */ |
936 | #ifdef IN_GCC |
937 | |
938 | #undef calloc |
939 | #undef strdup |
940 | #undef strndup |
941 | #pragma GCC poison calloc strdup strndup |
942 | |
943 | #if !defined(FLEX_SCANNER) && !defined(YYBISON) |
944 | #undef malloc |
945 | #undef realloc |
946 | #pragma GCC poison malloc realloc |
947 | #endif |
948 | |
949 | /* The %m format should be used when GCC's main diagnostic functions |
950 | supporting %m are available, and xstrerror from libiberty |
951 | otherwise. */ |
952 | #undef strerror |
953 | #pragma GCC poison strerror |
954 | |
955 | /* loc_t is defined on some systems and too inviting for some |
956 | programmers to avoid. */ |
957 | #undef loc_t |
958 | #pragma GCC poison loc_t |
959 | |
960 | /* Old target macros that have moved to the target hooks structure. */ |
961 | #pragma GCC poison ASM_OPEN_PAREN ASM_CLOSE_PAREN \ |
962 | FUNCTION_PROLOGUE FUNCTION_EPILOGUE \ |
963 | FUNCTION_END_PROLOGUE FUNCTION_BEGIN_EPILOGUE \ |
964 | DECL_MACHINE_ATTRIBUTES COMP_TYPE_ATTRIBUTES INSERT_ATTRIBUTES \ |
965 | VALID_MACHINE_DECL_ATTRIBUTE VALID_MACHINE_TYPE_ATTRIBUTE \ |
966 | SET_DEFAULT_TYPE_ATTRIBUTES SET_DEFAULT_DECL_ATTRIBUTES \ |
967 | MERGE_MACHINE_TYPE_ATTRIBUTES MERGE_MACHINE_DECL_ATTRIBUTES \ |
968 | MD_INIT_BUILTINS MD_EXPAND_BUILTIN ASM_OUTPUT_CONSTRUCTOR \ |
969 | ASM_OUTPUT_DESTRUCTOR SIGNED_CHAR_SPEC MAX_CHAR_TYPE_SIZE \ |
970 | WCHAR_UNSIGNED UNIQUE_SECTION SELECT_SECTION SELECT_RTX_SECTION \ |
971 | ENCODE_SECTION_INFO STRIP_NAME_ENCODING ASM_GLOBALIZE_LABEL \ |
972 | ASM_OUTPUT_MI_THUNK CONST_COSTS RTX_COSTS DEFAULT_RTX_COSTS \ |
973 | ADDRESS_COST MACHINE_DEPENDENT_REORG ASM_FILE_START ASM_FILE_END \ |
974 | ASM_SIMPLIFY_DWARF_ADDR INIT_TARGET_OPTABS INIT_SUBTARGET_OPTABS \ |
975 | INIT_GOFAST_OPTABS MULSI3_LIBCALL MULDI3_LIBCALL DIVSI3_LIBCALL \ |
976 | DIVDI3_LIBCALL UDIVSI3_LIBCALL UDIVDI3_LIBCALL MODSI3_LIBCALL \ |
977 | MODDI3_LIBCALL UMODSI3_LIBCALL UMODDI3_LIBCALL BUILD_VA_LIST_TYPE \ |
978 | PRETEND_OUTGOING_VARARGS_NAMED STRUCT_VALUE_INCOMING_REGNUM \ |
979 | ASM_OUTPUT_SECTION_NAME PROMOTE_FUNCTION_ARGS PROMOTE_FUNCTION_MODE \ |
980 | STRUCT_VALUE_INCOMING STRICT_ARGUMENT_NAMING \ |
981 | PROMOTE_FUNCTION_RETURN PROMOTE_PROTOTYPES STRUCT_VALUE_REGNUM \ |
982 | SETUP_INCOMING_VARARGS EXPAND_BUILTIN_SAVEREGS \ |
983 | DEFAULT_SHORT_ENUMS SPLIT_COMPLEX_ARGS MD_ASM_CLOBBERS \ |
984 | HANDLE_PRAGMA_REDEFINE_EXTNAME HANDLE_PRAGMA_EXTERN_PREFIX \ |
985 | MUST_PASS_IN_STACK FUNCTION_ARG_PASS_BY_REFERENCE \ |
986 | VECTOR_MODE_SUPPORTED_P TARGET_SUPPORTS_HIDDEN \ |
987 | FUNCTION_ARG_PARTIAL_NREGS ASM_OUTPUT_DWARF_DTPREL \ |
988 | ALLOCATE_INITIAL_VALUE LEGITIMIZE_ADDRESS FRAME_POINTER_REQUIRED \ |
989 | CAN_ELIMINATE TRAMPOLINE_TEMPLATE INITIALIZE_TRAMPOLINE \ |
990 | TRAMPOLINE_ADJUST_ADDRESS STATIC_CHAIN STATIC_CHAIN_INCOMING \ |
991 | RETURN_POPS_ARGS UNITS_PER_SIMD_WORD OVERRIDE_OPTIONS \ |
992 | OPTIMIZATION_OPTIONS CLASS_LIKELY_SPILLED_P \ |
993 | USING_SJLJ_EXCEPTIONS TARGET_UNWIND_INFO \ |
994 | CAN_DEBUG_WITHOUT_FP UNLIKELY_EXECUTED_TEXT_SECTION_NAME \ |
995 | HOT_TEXT_SECTION_NAME LEGITIMATE_CONSTANT_P ALWAYS_STRIP_DOTDOT \ |
996 | OUTPUT_ADDR_CONST_EXTRA SMALL_REGISTER_CLASSES ASM_OUTPUT_IDENT \ |
997 | ASM_BYTE_OP MEMBER_TYPE_FORCES_BLK LIBGCC2_HAS_SF_MODE \ |
998 | LIBGCC2_HAS_DF_MODE LIBGCC2_HAS_XF_MODE LIBGCC2_HAS_TF_MODE \ |
999 | CLEAR_BY_PIECES_P MOVE_BY_PIECES_P SET_BY_PIECES_P \ |
1000 | STORE_BY_PIECES_P TARGET_FLT_EVAL_METHOD \ |
1001 | HARD_REGNO_CALL_PART_CLOBBERED HARD_REGNO_MODE_OK \ |
1002 | MODES_TIEABLE_P FUNCTION_ARG_PADDING SLOW_UNALIGNED_ACCESS \ |
1003 | HARD_REGNO_NREGS SECONDARY_MEMORY_NEEDED_MODE \ |
1004 | SECONDARY_MEMORY_NEEDED CANNOT_CHANGE_MODE_CLASS \ |
1005 | TRULY_NOOP_TRUNCATION FUNCTION_ARG_OFFSET CONSTANT_ALIGNMENT \ |
1006 | STARTING_FRAME_OFFSET |
1007 | |
1008 | /* Target macros only used for code built for the target, that have |
1009 | moved to libgcc-tm.h or have never been present elsewhere. */ |
1010 | #pragma GCC poison DECLARE_LIBRARY_RENAMES LIBGCC2_GNU_PREFIX \ |
1011 | MD_UNWIND_SUPPORT MD_FROB_UPDATE_CONTEXT ENABLE_EXECUTE_STACK \ |
1012 | REG_VALUE_IN_UNWIND_CONTEXT ASSUME_EXTENDED_UNWIND_CONTEXT |
1013 | |
1014 | /* Other obsolete target macros, or macros that used to be in target |
1015 | headers and were not used, and may be obsolete or may never have |
1016 | been used. */ |
1017 | #pragma GCC poison INT_ASM_OP ASM_OUTPUT_EH_REGION_BEG CPP_PREDEFINES \ |
1018 | ASM_OUTPUT_EH_REGION_END ASM_OUTPUT_LABELREF_AS_INT SMALL_STACK \ |
1019 | DOESNT_NEED_UNWINDER EH_TABLE_LOOKUP OBJC_SELECTORS_WITHOUT_LABELS \ |
1020 | OMIT_EH_TABLE EASY_DIV_EXPR IMPLICIT_FIX_EXPR \ |
1021 | LONGJMP_RESTORE_FROM_STACK MAX_INT_TYPE_SIZE ASM_IDENTIFY_GCC \ |
1022 | STDC_VALUE TRAMPOLINE_ALIGN ASM_IDENTIFY_GCC_AFTER_SOURCE \ |
1023 | SLOW_ZERO_EXTEND SUBREG_REGNO_OFFSET DWARF_LINE_MIN_INSTR_LENGTH \ |
1024 | TRADITIONAL_RETURN_FLOAT NO_BUILTIN_SIZE_TYPE \ |
1025 | NO_BUILTIN_PTRDIFF_TYPE NO_BUILTIN_WCHAR_TYPE NO_BUILTIN_WINT_TYPE \ |
1026 | BLOCK_PROFILER BLOCK_PROFILER_CODE FUNCTION_BLOCK_PROFILER \ |
1027 | FUNCTION_BLOCK_PROFILER_EXIT MACHINE_STATE_SAVE \ |
1028 | MACHINE_STATE_RESTORE SCCS_DIRECTIVE SECTION_ASM_OP BYTEORDER \ |
1029 | ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL HOST_WORDS_BIG_ENDIAN \ |
1030 | OBJC_PROLOGUE ALLOCATE_TRAMPOLINE HANDLE_PRAGMA ROUND_TYPE_SIZE \ |
1031 | ROUND_TYPE_SIZE_UNIT CONST_SECTION_ASM_OP CRT_GET_RFIB_TEXT \ |
1032 | INSN_CACHE_DEPTH INSN_CACHE_SIZE \ |
1033 | INSN_CACHE_LINE_WIDTH INIT_SECTION_PREAMBLE NEED_ATEXIT ON_EXIT \ |
1034 | EXIT_BODY OBJECT_FORMAT_ROSE MULTIBYTE_CHARS MAP_CHARACTER \ |
1035 | LIBGCC_NEEDS_DOUBLE FINAL_PRESCAN_LABEL DEFAULT_CALLER_SAVES \ |
1036 | LOAD_ARGS_REVERSED MAX_INTEGER_COMPUTATION_MODE \ |
1037 | CONVERT_HARD_REGISTER_TO_SSA_P ASM_OUTPUT_MAIN_SOURCE_FILENAME \ |
1038 | FIRST_INSN_ADDRESS TEXT_SECTION SHARED_BSS_SECTION_ASM_OP \ |
1039 | PROMOTED_MODE EXPAND_BUILTIN_VA_END \ |
1040 | LINKER_DOES_NOT_WORK_WITH_DWARF2 FUNCTION_ARG_KEEP_AS_REFERENCE \ |
1041 | GIV_SORT_CRITERION MAX_LONG_TYPE_SIZE MAX_LONG_DOUBLE_TYPE_SIZE \ |
1042 | MAX_WCHAR_TYPE_SIZE SHARED_SECTION_ASM_OP INTEGRATE_THRESHOLD \ |
1043 | FINAL_REG_PARM_STACK_SPACE MAYBE_REG_PARM_STACK_SPACE \ |
1044 | TRADITIONAL_PIPELINE_INTERFACE DFA_PIPELINE_INTERFACE \ |
1045 | BUILTIN_SETJMP_FRAME_VALUE \ |
1046 | SUNOS4_SHARED_LIBRARIES PROMOTE_FOR_CALL_ONLY \ |
1047 | SPACE_AFTER_L_OPTION NO_RECURSIVE_FUNCTION_CSE \ |
1048 | DEFAULT_MAIN_RETURN TARGET_MEM_FUNCTIONS EXPAND_BUILTIN_VA_ARG \ |
1049 | COLLECT_PARSE_FLAG DWARF2_GENERATE_TEXT_SECTION_LABEL WINNING_GDB \ |
1050 | ASM_OUTPUT_FILENAME ASM_OUTPUT_SOURCE_LINE FILE_NAME_JOINER \ |
1051 | GDB_INV_REF_REGPARM_STABS_LETTER \ |
1052 | PUT_SDB_SRC_FILE STABS_GCC_MARKER SDB_GENERATE_FAKE \ |
1053 | NON_SAVING_SETJMP TARGET_LATE_RTL_PROLOGUE_EPILOGUE \ |
1054 | CASE_DROPS_THROUGH TARGET_BELL TARGET_BS TARGET_CR TARGET_DIGIT0 \ |
1055 | TARGET_ESC TARGET_FF TARGET_NEWLINE TARGET_TAB TARGET_VT \ |
1056 | LINK_LIBGCC_SPECIAL DONT_ACCESS_GBLS_AFTER_EPILOGUE \ |
1057 | TARGET_OPTIONS TARGET_SWITCHES EXTRA_CC_MODES FINALIZE_PIC \ |
1058 | PREDICATE_CODES SPECIAL_MODE_PREDICATES UNALIGNED_WORD_ASM_OP \ |
1059 | EXTRA_SECTIONS EXTRA_SECTION_FUNCTIONS READONLY_DATA_SECTION \ |
1060 | TARGET_ASM_EXCEPTION_SECTION TARGET_ASM_EH_FRAME_SECTION \ |
1061 | SMALL_ARG_MAX ASM_OUTPUT_SHARED_BSS ASM_OUTPUT_SHARED_COMMON \ |
1062 | ASM_OUTPUT_SHARED_LOCAL ASM_MAKE_LABEL_LINKONCE \ |
1063 | STACK_CHECK_PROBE_INTERVAL STACK_CHECK_PROBE_LOAD \ |
1064 | ORDER_REGS_FOR_LOCAL_ALLOC FUNCTION_OUTGOING_VALUE \ |
1065 | ASM_DECLARE_CONSTANT_NAME MODIFY_TARGET_NAME SWITCHES_NEED_SPACES \ |
1066 | SWITCH_CURTAILS_COMPILATION SWITCH_TAKES_ARG WORD_SWITCH_TAKES_ARG \ |
1067 | TARGET_OPTION_TRANSLATE_TABLE HANDLE_PRAGMA_PACK_PUSH_POP \ |
1068 | HANDLE_SYSV_PRAGMA HANDLE_PRAGMA_WEAK CONDITIONAL_REGISTER_USAGE \ |
1069 | FUNCTION_ARG_BOUNDARY MUST_USE_SJLJ_EXCEPTIONS US_SOFTWARE_GOFAST \ |
1070 | USING_SVR4_H SVR4_ASM_SPEC FUNCTION_ARG FUNCTION_ARG_ADVANCE \ |
1071 | FUNCTION_INCOMING_ARG IRA_COVER_CLASSES TARGET_VERSION \ |
1072 | MACHINE_TYPE TARGET_HAS_TARGETCM ASM_OUTPUT_BSS \ |
1073 | SETJMP_VIA_SAVE_AREA FORBIDDEN_INC_DEC_CLASSES \ |
1074 | PREFERRED_OUTPUT_RELOAD_CLASS SYSTEM_INCLUDE_DIR \ |
1075 | STANDARD_INCLUDE_DIR STANDARD_INCLUDE_COMPONENT \ |
1076 | LINK_ELIMINATE_DUPLICATE_LDIRECTORIES MIPS_DEBUGGING_INFO \ |
1077 | IDENT_ASM_OP ALL_COP_ADDITIONAL_REGISTER_NAMES \ |
1078 | RANGE_TEST_NON_SHORT_CIRCUIT \ |
1079 | REAL_VALUE_TRUNCATE REVERSE_CONDEXEC_PREDICATES_P \ |
1080 | TARGET_ALIGN_ANON_BITFIELDS TARGET_NARROW_VOLATILE_BITFIELDS \ |
1081 | IDENT_ASM_OP UNALIGNED_SHORT_ASM_OP UNALIGNED_INT_ASM_OP \ |
1082 | UNALIGNED_LONG_ASM_OP UNALIGNED_DOUBLE_INT_ASM_OP \ |
1083 | USE_COMMON_FOR_ONE_ONLY IFCVT_EXTRA_FIELDS IFCVT_INIT_EXTRA_FIELDS \ |
1084 | CASE_USE_BIT_TESTS FIXUNS_TRUNC_LIKE_FIX_TRUNC \ |
1085 | GO_IF_MODE_DEPENDENT_ADDRESS DELAY_SLOTS_FOR_EPILOGUE \ |
1086 | ELIGIBLE_FOR_EPILOGUE_DELAY TARGET_C99_FUNCTIONS TARGET_HAS_SINCOS \ |
1087 | REG_CLASS_FROM_LETTER CONST_OK_FOR_LETTER_P \ |
1088 | CONST_DOUBLE_OK_FOR_LETTER_P EXTRA_CONSTRAINT \ |
1089 | REG_CLASS_FROM_CONSTRAINT REG_CLASS_FOR_CONSTRAINT \ |
1090 | EXTRA_CONSTRAINT_STR EXTRA_MEMORY_CONSTRAINT \ |
1091 | EXTRA_ADDRESS_CONSTRAINT CONST_DOUBLE_OK_FOR_CONSTRAINT_P \ |
1092 | CALLER_SAVE_PROFITABLE LARGEST_EXPONENT_IS_NORMAL \ |
1093 | ROUND_TOWARDS_ZERO SF_SIZE DF_SIZE XF_SIZE TF_SIZE LIBGCC2_TF_CEXT \ |
1094 | LIBGCC2_LONG_DOUBLE_TYPE_SIZE STRUCT_VALUE \ |
1095 | EH_FRAME_IN_DATA_SECTION TARGET_FLT_EVAL_METHOD_NON_DEFAULT \ |
1096 | JCR_SECTION_NAME TARGET_USE_JCR_SECTION SDB_DEBUGGING_INFO \ |
1097 | SDB_DEBUG NO_IMPLICIT_EXTERN_C NOTICE_UPDATE_CC \ |
1098 | CC_STATUS_MDEP_INIT CC_STATUS_MDEP CC_STATUS SLOW_SHORT_ACCESS |
1099 | |
1100 | /* Hooks that are no longer used. */ |
1101 | #pragma GCC poison LANG_HOOKS_FUNCTION_MARK LANG_HOOKS_FUNCTION_FREE \ |
1102 | LANG_HOOKS_MARK_TREE LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES \ |
1103 | LANG_HOOKS_TREE_INLINING_ESTIMATE_NUM_INSNS \ |
1104 | LANG_HOOKS_PUSHLEVEL LANG_HOOKS_SET_BLOCK \ |
1105 | LANG_HOOKS_MAYBE_BUILD_CLEANUP LANG_HOOKS_UPDATE_DECL_AFTER_SAVING \ |
1106 | LANG_HOOKS_POPLEVEL LANG_HOOKS_TRUTHVALUE_CONVERSION \ |
1107 | TARGET_PROMOTE_FUNCTION_ARGS TARGET_PROMOTE_FUNCTION_RETURN \ |
1108 | LANG_HOOKS_MISSING_ARGUMENT LANG_HOOKS_HASH_TYPES \ |
1109 | TARGET_HANDLE_OFAST TARGET_OPTION_OPTIMIZATION \ |
1110 | TARGET_IRA_COVER_CLASSES TARGET_HELP \ |
1111 | TARGET_HANDLE_PRAGMA_EXTERN_PREFIX \ |
1112 | TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN \ |
1113 | TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD \ |
1114 | TARGET_MD_ASM_CLOBBERS TARGET_RELAXED_ORDERING \ |
1115 | EXTENDED_SDB_BASIC_TYPES TARGET_INVALID_PARAMETER_TYPE \ |
1116 | TARGET_INVALID_RETURN_TYPE |
1117 | |
1118 | /* Arrays that were deleted in favor of a functional interface. */ |
1119 | #pragma GCC poison built_in_decls implicit_built_in_decls |
1120 | |
1121 | /* Hooks into libgcc2. */ |
1122 | #pragma GCC poison LIBGCC2_DOUBLE_TYPE_SIZE LIBGCC2_WORDS_BIG_ENDIAN \ |
1123 | LIBGCC2_FLOAT_WORDS_BIG_ENDIAN |
1124 | |
1125 | /* Miscellaneous macros that are no longer used. */ |
1126 | #pragma GCC poison USE_MAPPED_LOCATION GET_ENVIRONMENT |
1127 | |
1128 | /* Libiberty macros that are no longer used in GCC. */ |
1129 | #undef ANSI_PROTOTYPES |
1130 | #undef PTR_CONST |
1131 | #undef LONG_DOUBLE |
1132 | #undef VPARAMS |
1133 | #undef VA_OPEN |
1134 | #undef VA_FIXEDARG |
1135 | #undef VA_CLOSE |
1136 | #undef VA_START |
1137 | #pragma GCC poison ANSI_PROTOTYPES PTR_CONST LONG_DOUBLE VPARAMS VA_OPEN \ |
1138 | VA_FIXEDARG VA_CLOSE VA_START |
1139 | #endif /* IN_GCC */ |
1140 | |
1141 | /* Front ends should never have to include middle-end headers. Enforce |
1142 | this by poisoning the header double-include protection defines. */ |
1143 | #ifdef IN_GCC_FRONTEND |
1144 | #pragma GCC poison GCC_RTL_H GCC_EXCEPT_H GCC_EXPR_H |
1145 | #endif |
1146 | |
1147 | /* Note: not all uses of the `index' token (e.g. variable names and |
1148 | structure members) have been eliminated. */ |
1149 | #undef bcopy |
1150 | #undef bzero |
1151 | #undef bcmp |
1152 | #undef rindex |
1153 | #pragma GCC poison bcopy bzero bcmp rindex |
1154 | |
1155 | /* Poison ENABLE_CHECKING macro that should be replaced with |
1156 | 'if (flag_checking)', or with CHECKING_P macro. */ |
1157 | #pragma GCC poison ENABLE_CHECKING |
1158 | |
1159 | #endif /* GCC >= 3.0 */ |
1160 | |
1161 | /* This macro allows casting away const-ness to pass -Wcast-qual |
1162 | warnings. DO NOT USE THIS UNLESS YOU REALLY HAVE TO! It should |
1163 | only be used in certain specific cases. One valid case is where |
1164 | the C standard definitions or prototypes force you to. E.g. if you |
1165 | need to free a const object, or if you pass a const string to |
1166 | execv, et al. Another valid use would be in an allocation function |
1167 | that creates const objects that need to be initialized. In some |
1168 | cases we have non-const functions that return the argument |
1169 | (e.g. next_nonnote_insn). Rather than create const shadow |
1170 | functions, we can cast away const-ness in calling these interfaces |
1171 | if we're careful to verify that the called function does indeed not |
1172 | modify its argument and the return value is only used in a const |
1173 | context. (This can be somewhat dangerous as these assumptions can |
1174 | change after the fact). Beyond these uses, most other cases of |
1175 | using this macro should be viewed with extreme caution. */ |
1176 | |
1177 | #ifdef __cplusplus |
1178 | #define CONST_CAST2(TOTYPE,FROMTYPE,X) (const_cast<TOTYPE> (X)) |
1179 | #else |
1180 | #if defined(__GNUC__) && GCC_VERSION > 4000 |
1181 | /* GCC 4.0.x has a bug where it may ICE on this expression, |
1182 | so does GCC 3.4.x (PR17436). */ |
1183 | #define CONST_CAST2(TOTYPE,FROMTYPE,X) ((__extension__(union {FROMTYPE _q; TOTYPE _nq;})(X))._nq) |
1184 | #elif defined(__GNUC__) |
1185 | inline char * |
1186 | helper_const_non_const_cast (const char *p) |
1187 | { |
1188 | union { |
1189 | const char *const_c; |
1190 | char *c; |
1191 | } val; |
1192 | val.const_c = p; |
1193 | return val.c; |
1194 | } |
1195 | |
1196 | #define CONST_CAST2(TOTYPE,FROMTYPE,X) \ |
1197 | ((TOTYPE) helper_const_non_const_cast ((const char *) (FROMTYPE) (X))) |
1198 | #else |
1199 | #define CONST_CAST2(TOTYPE,FROMTYPE,X) ((TOTYPE)(FROMTYPE)(X)) |
1200 | #endif |
1201 | #endif |
1202 | #define CONST_CAST(TYPE,X) CONST_CAST2 (TYPE, const TYPE, (X)) |
1203 | #define CONST_CAST_TREE(X) CONST_CAST (union tree_node *, (X)) |
1204 | #define CONST_CAST_RTX(X) CONST_CAST (struct rtx_def *, (X)) |
1205 | #define CONST_CAST_RTX_INSN(X) CONST_CAST (struct rtx_insn *, (X)) |
1206 | #define CONST_CAST_BB(X) CONST_CAST (struct basic_block_def *, (X)) |
1207 | #define CONST_CAST_GIMPLE(X) CONST_CAST (gimple *, (X)) |
1208 | |
1209 | /* Activate certain diagnostics as warnings (not errors via the |
1210 | -Werror flag). */ |
1211 | #if GCC_VERSION >= 4003 |
1212 | /* If asserts are disabled, activate -Wuninitialized as a warning (not |
1213 | an error/-Werror). */ |
1214 | #ifndef ENABLE_ASSERT_CHECKING |
1215 | #pragma GCC diagnostic warning "-Wuninitialized" |
1216 | #endif |
1217 | #endif |
1218 | |
1219 | #ifdef ENABLE_VALGRIND_ANNOTATIONS |
1220 | # ifdef HAVE_VALGRIND_MEMCHECK_H |
1221 | # include <valgrind/memcheck.h> |
1222 | # elif defined HAVE_MEMCHECK_H |
1223 | # include <memcheck.h> |
1224 | # else |
1225 | # include <valgrind.h> |
1226 | # endif |
1227 | /* Compatibility macros to let valgrind 3.1 work. */ |
1228 | # ifndef VALGRIND_MAKE_MEM_NOACCESS |
1229 | # define VALGRIND_MAKE_MEM_NOACCESS VALGRIND_MAKE_NOACCESS |
1230 | # endif |
1231 | # ifndef VALGRIND_MAKE_MEM_DEFINED |
1232 | # define VALGRIND_MAKE_MEM_DEFINED VALGRIND_MAKE_READABLE |
1233 | # endif |
1234 | # ifndef VALGRIND_MAKE_MEM_UNDEFINED |
1235 | # define VALGRIND_MAKE_MEM_UNDEFINED VALGRIND_MAKE_WRITABLE |
1236 | # endif |
1237 | #else |
1238 | /* Avoid #ifdef:s when we can help it. */ |
1239 | #define VALGRIND_DISCARD(x) |
1240 | #define VALGRIND_MALLOCLIKE_BLOCK(w,x,y,z) |
1241 | #define VALGRIND_FREELIKE_BLOCK(x,y) |
1242 | #endif |
1243 | |
1244 | /* Macros to temporarily ignore some warnings. */ |
1245 | #if GCC_VERSION >= 6000 |
1246 | #define GCC_DIAGNOSTIC_STRINGIFY(x) #x |
1247 | #define GCC_DIAGNOSTIC_PUSH_IGNORED(x) \ |
1248 | _Pragma ("GCC diagnostic push") \ |
1249 | _Pragma (GCC_DIAGNOSTIC_STRINGIFY (GCC diagnostic ignored #x)) |
1250 | #define GCC_DIAGNOSTIC_POP _Pragma ("GCC diagnostic pop") |
1251 | #else |
1252 | #define GCC_DIAGNOSTIC_PUSH_IGNORED(x) |
1253 | #define GCC_DIAGNOSTIC_POP |
1254 | #endif |
1255 | |
1256 | /* In LTO -fwhole-program build we still want to keep the debug functions available |
1257 | for debugger. Mark them as used to prevent removal. */ |
1258 | #if (GCC_VERSION > 4000) |
1259 | #define DEBUG_FUNCTION __attribute__ ((__used__)) |
1260 | #define DEBUG_VARIABLE __attribute__ ((__used__)) |
1261 | #else |
1262 | #define DEBUG_FUNCTION |
1263 | #define DEBUG_VARIABLE |
1264 | #endif |
1265 | |
1266 | /* General macro to extract bit Y of X. */ |
1267 | #define TEST_BIT(X, Y) (((X) >> (Y)) & 1) |
1268 | |
1269 | /* Get definitions of HOST_WIDE_INT. */ |
1270 | #include "hwint.h" |
1271 | |
1272 | typedef int sort_r_cmp_fn (const void *, const void *, void *); |
1273 | void qsort_chk (void *, size_t, size_t, sort_r_cmp_fn *, void *); |
1274 | void gcc_sort_r (void *, size_t, size_t, sort_r_cmp_fn *, void *); |
1275 | void gcc_qsort (void *, size_t, size_t, int (*)(const void *, const void *)); |
1276 | void gcc_stablesort (void *, size_t, size_t, |
1277 | int (*)(const void *, const void *)); |
1278 | void gcc_stablesort_r (void *, size_t, size_t, sort_r_cmp_fn *, void *data); |
1279 | /* Redirect four-argument qsort calls to gcc_qsort; one-argument invocations |
1280 | correspond to vec::qsort, and use C qsort internally. */ |
1281 | #define PP_5th(a1, a2, a3, a4, a5, ...) a5 |
1282 | #undef qsort |
1283 | #define qsort(...) PP_5th (__VA_ARGS__, gcc_qsort, 3, 2, qsort, 0) (__VA_ARGS__) |
1284 | |
1285 | #define ONE_K 1024 |
1286 | #define ONE_M (ONE_K * ONE_K) |
1287 | #define ONE_G (ONE_K * ONE_M) |
1288 | |
1289 | /* Display a number as an integer multiple of either: |
1290 | - 1024, if said integer is >= to 10 K (in base 2) |
1291 | - 1024 * 1024, if said integer is >= 10 M in (base 2) |
1292 | */ |
1293 | #define SIZE_SCALE(x) (((x) < 10 * ONE_K \ |
1294 | ? (x) \ |
1295 | : ((x) < 10 * ONE_M \ |
1296 | ? (x) / ONE_K \ |
1297 | : (x) / ONE_M))) |
1298 | |
1299 | /* For a given integer, display either: |
1300 | - the character 'k', if the number is higher than 10 K (in base 2) |
1301 | but strictly lower than 10 M (in base 2) |
1302 | - the character 'M' if the number is higher than 10 M (in base2) |
1303 | - the charcter ' ' if the number is strictly lower than 10 K */ |
1304 | #define SIZE_LABEL(x) ((x) < 10 * ONE_K ? ' ' : ((x) < 10 * ONE_M ? 'k' : 'M')) |
1305 | |
1306 | /* Display an integer amount as multiple of 1K or 1M (in base 2). |
1307 | Display the correct unit (either k, M, or ' ') after the amount, as |
1308 | well. */ |
1309 | #define SIZE_AMOUNT(size) (uint64_t)SIZE_SCALE (size), SIZE_LABEL (size) |
1310 | |
1311 | /* Format string particle for printing a SIZE_AMOUNT with N being the width |
1312 | of the number. */ |
1313 | #define PRsa(n) "%" #n PRIu64 "%c" |
1314 | |
1315 | /* System headers may define NULL to be an integer (e.g. 0L), which cannot be |
1316 | used safely in certain contexts (e.g. as sentinels). Redefine NULL to |
1317 | nullptr in order to make it safer. Note that this might confuse system |
1318 | headers, however, by convention they must not be included after this point. |
1319 | */ |
1320 | #ifdef __cplusplus |
1321 | #undef NULL |
1322 | #define NULL nullptr |
1323 | #endif |
1324 | |
1325 | /* Return true if STR string starts with PREFIX. */ |
1326 | |
1327 | inline bool |
1328 | startswith (const char *str, const char *prefix) |
1329 | { |
1330 | return strncmp (s1: str, s2: prefix, n: strlen (s: prefix)) == 0; |
1331 | } |
1332 | |
1333 | /* Return true if STR string ends with SUFFIX. */ |
1334 | |
1335 | inline bool |
1336 | endswith (const char *str, const char *suffix) |
1337 | { |
1338 | size_t str_len = strlen (s: str); |
1339 | size_t suffix_len = strlen (s: suffix); |
1340 | if (str_len < suffix_len) |
1341 | return false; |
1342 | |
1343 | return memcmp (s1: str + str_len - suffix_len, s2: suffix, n: suffix_len) == 0; |
1344 | } |
1345 | |
1346 | #endif /* ! GCC_SYSTEM_H */ |
1347 | |