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