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