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