LCOV - code coverage report
Current view: top level - gcc/c-family - c-cppbuiltin.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 89.2 % 1121 1000
Test Date: 2026-10-17 16:30:31 Functions: 96.2 % 26 25
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Define builtin-in macros for the C family front ends.
       2              :    Copyright (C) 2002-2026 Free Software Foundation, Inc.
       3              : 
       4              : This file is part of GCC.
       5              : 
       6              : GCC is free software; you can redistribute it and/or modify it under
       7              : the terms of the GNU General Public License as published by the Free
       8              : Software Foundation; either version 3, or (at your option) any later
       9              : version.
      10              : 
      11              : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      12              : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      13              : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      14              : for more details.
      15              : 
      16              : You should have received a copy of the GNU General Public License
      17              : along with GCC; see the file COPYING3.  If not see
      18              : <http://www.gnu.org/licenses/>.  */
      19              : 
      20              : #include "config.h"
      21              : #include "system.h"
      22              : #include "coretypes.h"
      23              : #include "target.h"
      24              : #include "c-common.h"
      25              : #include "memmodel.h"
      26              : #include "tm_p.h"             /* For TARGET_CPU_CPP_BUILTINS & friends.  */
      27              : #include "stringpool.h"
      28              : #include "stor-layout.h"
      29              : #include "flags.h"
      30              : #include "c-pragma.h"
      31              : #include "output.h"           /* For user_label_prefix.  */
      32              : #include "debug.h"            /* For dwarf2out_do_cfi_asm.  */
      33              : #include "common/common-target.h"
      34              : #include "cppbuiltin.h"
      35              : #include "configargs.h"
      36              : 
      37              : #ifndef TARGET_OS_CPP_BUILTINS
      38              : # define TARGET_OS_CPP_BUILTINS()
      39              : #endif
      40              : 
      41              : #ifndef TARGET_OBJFMT_CPP_BUILTINS
      42              : # define TARGET_OBJFMT_CPP_BUILTINS()
      43              : #endif
      44              : 
      45              : #ifndef REGISTER_PREFIX
      46              : #define REGISTER_PREFIX ""
      47              : #endif
      48              : 
      49              : /* Non-static as some targets don't use it.  */
      50              : static void builtin_define_with_hex_fp_value (const char *, tree,
      51              :                                               int, const char *,
      52              :                                               const char *,
      53              :                                               const char *);
      54              : static void builtin_define_stdint_macros (void);
      55              : static void builtin_define_constants (const char *, tree);
      56              : static void builtin_define_type_max (const char *, tree);
      57              : static void builtin_define_type_minmax (const char *, const char *, tree);
      58              : static void builtin_define_type_width (const char *, tree, tree);
      59              : static void builtin_define_float_constants (const char *,
      60              :                                             const char *,
      61              :                                             const char *,
      62              :                                             const char *,
      63              :                                             tree);
      64              : 
      65              : /* Return true if MODE provides a fast multiply/add (FMA) builtin function.
      66              :    Originally this function used the fma optab, but that doesn't work with
      67              :    -save-temps, so just rely on the HAVE_fma macros for the standard floating
      68              :    point types.  */
      69              : 
      70              : static bool
      71      2139680 : mode_has_fma (machine_mode mode)
      72              : {
      73      2139680 :   switch (mode)
      74              :     {
      75              : #ifdef HAVE_fmasf4
      76       427936 :     case E_SFmode:
      77       427936 :       return !!HAVE_fmasf4;
      78              : #endif
      79              : 
      80              : #ifdef HAVE_fmadf4
      81       641920 :     case E_DFmode:
      82       641920 :       return !!HAVE_fmadf4;
      83              : #endif
      84              : 
      85              : #ifdef HAVE_fmakf4      /* PowerPC if long double != __float128.  */
      86              :     case E_KFmode:
      87              :       return !!HAVE_fmakf4;
      88              : #endif
      89              : 
      90              : #ifdef HAVE_fmaxf4
      91              :     case E_XFmode:
      92              :       return !!HAVE_fmaxf4;
      93              : #endif
      94              : 
      95              : #ifdef HAVE_fmatf4
      96              :     case E_TFmode:
      97              :       return !!HAVE_fmatf4;
      98              : #endif
      99              : 
     100              :     default:
     101              :       break;
     102              :     }
     103              : 
     104              :   return false;
     105              : }
     106              : 
     107              : /* Define NAME with value TYPE size_unit.  */
     108              : void
     109       850519 : builtin_define_type_sizeof (const char *name, tree type)
     110              : {
     111      1701038 :   builtin_define_with_int_value (name,
     112       850519 :                                  tree_to_uhwi (TYPE_SIZE_UNIT (type)));
     113       850519 : }
     114              : 
     115              : /* Define the float.h constants for TYPE using NAME_PREFIX, FP_SUFFIX,
     116              :    and FP_CAST. */
     117              : static void
     118      2139680 : builtin_define_float_constants (const char *name_prefix,
     119              :                                 const char *fp_suffix,
     120              :                                 const char *fp_cast,
     121              :                                 const char *fma_suffix,
     122              :                                 tree type)
     123              : {
     124              :   /* Used to convert radix-based values to base 10 values in several cases.
     125              : 
     126              :      In the max_exp -> max_10_exp conversion for 128-bit IEEE, we need at
     127              :      least 6 significant digits for correct results.  Using the fraction
     128              :      formed by (log(2)*1e6)/(log(10)*1e6) overflows a 32-bit integer as an
     129              :      intermediate; perhaps someone can find a better approximation, in the
     130              :      mean time, I suspect using doubles won't harm the bootstrap here.  */
     131              : 
     132      2139680 :   const double log10_2 = .30102999566398119521;
     133      2139680 :   double log10_b;
     134      2139680 :   const struct real_format *fmt;
     135      2139680 :   const struct real_format *widefmt;
     136              : 
     137      2139680 :   char name[64], buf[128];
     138      2139680 :   int dig, min_10_exp, max_10_exp;
     139      2139680 :   int decimal_dig;
     140      2139680 :   int type_decimal_dig;
     141              : 
     142      2139680 :   fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
     143      2139680 :   gcc_assert (fmt->b != 10);
     144      2139680 :   widefmt = REAL_MODE_FORMAT (TYPE_MODE (long_double_type_node));
     145      2139680 :   gcc_assert (widefmt->b != 10);
     146     17117440 :   for (int i = 0; i < NUM_FLOATN_NX_TYPES; i++)
     147              :     {
     148     14977760 :       tree wtype = FLOATN_NX_TYPE_NODE (i);
     149     14977760 :       if (wtype != NULL_TREE)
     150              :         {
     151     12838080 :           const struct real_format *wfmt
     152     12838080 :             = REAL_MODE_FORMAT (TYPE_MODE (wtype));
     153     12838080 :           gcc_assert (wfmt->b != 10);
     154     12838080 :           if (wfmt->p > widefmt->p)
     155     14977760 :             widefmt = wfmt;
     156              :         }
     157              :     }
     158              : 
     159              :   /* The radix of the exponent representation.  */
     160      2139680 :   if (type == float_type_node)
     161       213968 :     builtin_define_with_int_value ("__FLT_RADIX__", fmt->b);
     162      2139680 :   log10_b = log10_2;
     163              : 
     164              :   /* The number of radix digits, p, in the floating-point significand.  */
     165      2139680 :   sprintf (name, "__%s_MANT_DIG__", name_prefix);
     166      2139680 :   builtin_define_with_int_value (name, fmt->p);
     167              : 
     168              :   /* The number of decimal digits, q, such that any floating-point number
     169              :      with q decimal digits can be rounded into a floating-point number with
     170              :      p radix b digits and back again without change to the q decimal digits,
     171              : 
     172              :         p log10 b                       if b is a power of 10
     173              :         floor((p - 1) log10 b)          otherwise
     174              :   */
     175      2139680 :   dig = (fmt->p - 1) * log10_b;
     176      2139680 :   sprintf (name, "__%s_DIG__", name_prefix);
     177      2139680 :   builtin_define_with_int_value (name, dig);
     178              : 
     179              :   /* The minimum negative int x such that b**(x-1) is a normalized float.  */
     180      2139680 :   sprintf (name, "__%s_MIN_EXP__", name_prefix);
     181      2139680 :   sprintf (buf, "(%d)", fmt->emin);
     182      2139680 :   builtin_define_with_value (name, buf, 0);
     183              : 
     184              :   /* The minimum negative int x such that 10**x is a normalized float,
     185              : 
     186              :           ceil (log10 (b ** (emin - 1)))
     187              :         = ceil (log10 (b) * (emin - 1))
     188              : 
     189              :      Recall that emin is negative, so the integer truncation calculates
     190              :      the ceiling, not the floor, in this case.  */
     191      2139680 :   min_10_exp = (fmt->emin - 1) * log10_b;
     192      2139680 :   sprintf (name, "__%s_MIN_10_EXP__", name_prefix);
     193      2139680 :   sprintf (buf, "(%d)", min_10_exp);
     194      2139680 :   builtin_define_with_value (name, buf, 0);
     195              : 
     196              :   /* The maximum int x such that b**(x-1) is a representable float.  */
     197      2139680 :   sprintf (name, "__%s_MAX_EXP__", name_prefix);
     198      2139680 :   builtin_define_with_int_value (name, fmt->emax);
     199              : 
     200              :   /* The maximum int x such that 10**x is in the range of representable
     201              :      finite floating-point numbers,
     202              : 
     203              :           floor (log10((1 - b**-p) * b**emax))
     204              :         = floor (log10(1 - b**-p) + log10(b**emax))
     205              :         = floor (log10(1 - b**-p) + log10(b)*emax)
     206              : 
     207              :      The safest thing to do here is to just compute this number.  But since
     208              :      we don't link cc1 with libm, we cannot.  We could implement log10 here
     209              :      a series expansion, but that seems too much effort because:
     210              : 
     211              :      Note that the first term, for all extant p, is a number exceedingly close
     212              :      to zero, but slightly negative.  Note that the second term is an integer
     213              :      scaling an irrational number, and that because of the floor we are only
     214              :      interested in its integral portion.
     215              : 
     216              :      In order for the first term to have any effect on the integral portion
     217              :      of the second term, the second term has to be exceedingly close to an
     218              :      integer itself (e.g. 123.000000000001 or something).  Getting a result
     219              :      that close to an integer requires that the irrational multiplicand have
     220              :      a long series of zeros in its expansion, which doesn't occur in the
     221              :      first 20 digits or so of log10(b).
     222              : 
     223              :      Hand-waving aside, crunching all of the sets of constants above by hand
     224              :      does not yield a case for which the first term is significant, which
     225              :      in the end is all that matters.  */
     226      2139680 :   max_10_exp = fmt->emax * log10_b;
     227      2139680 :   sprintf (name, "__%s_MAX_10_EXP__", name_prefix);
     228      2139680 :   builtin_define_with_int_value (name, max_10_exp);
     229              : 
     230              :   /* The number of decimal digits, n, such that any floating-point number
     231              :      can be rounded to n decimal digits and back again without change to
     232              :      the value.
     233              : 
     234              :         p * log10(b)                    if b is a power of 10
     235              :         ceil(1 + p * log10(b))          otherwise
     236              : 
     237              :      The only macro we care about is this number for the widest supported
     238              :      floating type, but we want this value for rendering constants below.  */
     239      2139680 :   {
     240      2139680 :     double d_decimal_dig
     241      2139680 :       = 1 + (fmt->p < widefmt->p ? widefmt->p : fmt->p) * log10_b;
     242      2139680 :     decimal_dig = d_decimal_dig;
     243      2139680 :     if (decimal_dig < d_decimal_dig)
     244      2139680 :       decimal_dig++;
     245              :   }
     246              :   /* Similar, for this type rather than long double.  */
     247      2139680 :   {
     248      2139680 :     double type_d_decimal_dig = 1 + fmt->p * log10_b;
     249      2139680 :     type_decimal_dig = type_d_decimal_dig;
     250      2139680 :     if (type_decimal_dig < type_d_decimal_dig)
     251      2139680 :       type_decimal_dig++;
     252              :   }
     253              :   /* Define __DECIMAL_DIG__ to the value for long double to be
     254              :      compatible with C99 and C11; see DR#501 and N2108.  */
     255      2139680 :   if (type == long_double_type_node)
     256       213968 :     builtin_define_with_int_value ("__DECIMAL_DIG__", type_decimal_dig);
     257      2139680 :   sprintf (name, "__%s_DECIMAL_DIG__", name_prefix);
     258      2139680 :   builtin_define_with_int_value (name, type_decimal_dig);
     259              : 
     260              :   /* Since, for the supported formats, B is always a power of 2, we
     261              :      construct the following numbers directly as a hexadecimal
     262              :      constants.  */
     263      2139680 :   get_max_float (fmt, buf, sizeof (buf), false);
     264              : 
     265      2139680 :   sprintf (name, "__%s_MAX__", name_prefix);
     266      2139680 :   builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix, fp_cast);
     267              : 
     268      2139680 :   get_max_float (fmt, buf, sizeof (buf), true);
     269              : 
     270      2139680 :   sprintf (name, "__%s_NORM_MAX__", name_prefix);
     271      2139680 :   builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix, fp_cast);
     272              : 
     273              :   /* The minimum normalized positive floating-point number,
     274              :      b**(emin-1).  */
     275      2139680 :   sprintf (name, "__%s_MIN__", name_prefix);
     276      2139680 :   sprintf (buf, "0x1p%d", fmt->emin - 1);
     277      2139680 :   builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix, fp_cast);
     278              : 
     279              :   /* The difference between 1 and the least value greater than 1 that is
     280              :      representable in the given floating point type, b**(1-p).  */
     281      2139680 :   sprintf (name, "__%s_EPSILON__", name_prefix);
     282      2139680 :   if (fmt->pnan < fmt->p && (c_dialect_cxx () || !flag_isoc23))
     283              :     /* This is an IBM extended double format, so 1.0 + any double is
     284              :        representable precisely.  */
     285            0 :       sprintf (buf, "0x1p%d", fmt->emin - fmt->p);
     286              :     else
     287      2139680 :       sprintf (buf, "0x1p%d", 1 - fmt->p);
     288      2139680 :   builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix, fp_cast);
     289              : 
     290              :   /* For C++ std::numeric_limits<T>::denorm_min and C11 *_TRUE_MIN.
     291              :      The minimum denormalized positive floating-point number, b**(emin-p).
     292              :      The minimum normalized positive floating-point number for formats
     293              :      that don't support denormals.  */
     294      2139680 :   sprintf (name, "__%s_DENORM_MIN__", name_prefix);
     295      2139680 :   sprintf (buf, "0x1p%d", fmt->emin - (fmt->has_denorm ? fmt->p : 1));
     296      2139680 :   builtin_define_with_hex_fp_value (name, type, decimal_dig,
     297              :                                     buf, fp_suffix, fp_cast);
     298              : 
     299      2139680 :   sprintf (name, "__%s_HAS_DENORM__", name_prefix);
     300      2139680 :   builtin_define_with_value (name, fmt->has_denorm ? "1" : "0", 0);
     301              : 
     302              :   /* For C++ std::numeric_limits<T>::has_infinity.  */
     303      2139680 :   sprintf (name, "__%s_HAS_INFINITY__", name_prefix);
     304      2139680 :   builtin_define_with_int_value (name,
     305      8558720 :                                  MODE_HAS_INFINITIES (TYPE_MODE (type)));
     306              :   /* For C++ std::numeric_limits<T>::has_quiet_NaN.  We do not have a
     307              :      predicate to distinguish a target that has both quiet and
     308              :      signalling NaNs from a target that has only quiet NaNs or only
     309              :      signalling NaNs, so we assume that a target that has any kind of
     310              :      NaN has quiet NaNs.  */
     311      2139680 :   sprintf (name, "__%s_HAS_QUIET_NAN__", name_prefix);
     312      8558720 :   builtin_define_with_int_value (name, MODE_HAS_NANS (TYPE_MODE (type)));
     313              : 
     314              :   /* Note whether we have fast FMA.  */
     315      2139680 :   if (mode_has_fma (TYPE_MODE (type)) && fma_suffix != NULL)
     316              :     {
     317        26480 :       sprintf (name, "__FP_FAST_FMA%s", fma_suffix);
     318        26480 :       builtin_define_with_int_value (name, 1);
     319              :     }
     320              : 
     321              :   /* For C23 *_IS_IEC_60559.  0 means the type does not match an IEC
     322              :      60559 format, 1 that it matches a format but not necessarily
     323              :      operations.  */
     324      2139680 :   sprintf (name, "__%s_IS_IEC_60559__", name_prefix);
     325      2139680 :   builtin_define_with_int_value (name, fmt->ieee_bits != 0);
     326      2139680 : }
     327              : 
     328              : /* Define __DECx__ constants for TYPE using NAME_PREFIX and SUFFIX. */
     329              : static void
     330       855872 : builtin_define_decimal_float_constants (const char *name_prefix,
     331              :                                         const char *suffix,
     332              :                                         tree type)
     333              : {
     334       855872 :   const struct real_format *fmt;
     335       855872 :   char name[64], buf[128], *p;
     336       855872 :   int digits;
     337              : 
     338       855872 :   fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
     339              : 
     340              :   /* The number of radix digits, p, in the significand.  */
     341       855872 :   sprintf (name, "__%s_MANT_DIG__", name_prefix);
     342       855872 :   builtin_define_with_int_value (name, fmt->p);
     343              : 
     344              :   /* The minimum negative int x such that b**(x-1) is a normalized float.  */
     345       855872 :   sprintf (name, "__%s_MIN_EXP__", name_prefix);
     346       855872 :   sprintf (buf, "(%d)", fmt->emin);
     347       855872 :   builtin_define_with_value (name, buf, 0);
     348              : 
     349              :   /* The maximum int x such that b**(x-1) is a representable float.  */
     350       855872 :   sprintf (name, "__%s_MAX_EXP__", name_prefix);
     351       855872 :   builtin_define_with_int_value (name, fmt->emax);
     352              : 
     353              :   /* Compute the minimum representable value.  */
     354       855872 :   sprintf (name, "__%s_MIN__", name_prefix);
     355       855872 :   sprintf (buf, "1E%d%s", fmt->emin - 1, suffix);
     356       855872 :   builtin_define_with_value (name, buf, 0);
     357              : 
     358              :   /* Compute the maximum representable value.  */
     359       855872 :   sprintf (name, "__%s_MAX__", name_prefix);
     360       855872 :   get_max_float (fmt, buf, sizeof (buf) - strlen (suffix), false);
     361       855872 :   strcat (buf, suffix);
     362       855872 :   builtin_define_with_value (name, buf, 0);
     363              : 
     364              :   /* Compute epsilon (the difference between 1 and least value greater
     365              :      than 1 representable).  */
     366       855872 :   sprintf (name, "__%s_EPSILON__", name_prefix);
     367       855872 :   sprintf (buf, "1E-%d%s", fmt->p - 1, suffix);
     368       855872 :   builtin_define_with_value (name, buf, 0);
     369              : 
     370              :   /* Minimum subnormal positive decimal value.  */
     371       855872 :   sprintf (name, "__%s_SUBNORMAL_MIN__", name_prefix);
     372       855872 :   p = buf;
     373     19471088 :   for (digits = fmt->p; digits > 1; digits--)
     374              :     {
     375     18615216 :       *p++ = '0';
     376     18615216 :       if (digits == fmt->p)
     377       855872 :         *p++ = '.';
     378              :     }
     379       855872 :   *p = 0;
     380       855872 :   sprintf (&buf[fmt->p], "1E%d%s", fmt->emin - 1, suffix);
     381       855872 :   builtin_define_with_value (name, buf, 0);
     382       855872 : }
     383              : 
     384              : /* Define fixed-point constants for TYPE using NAME_PREFIX and SUFFIX.  */
     385              : 
     386              : static void
     387            0 : builtin_define_fixed_point_constants (const char *name_prefix,
     388              :                                       const char *suffix,
     389              :                                       tree type)
     390              : {
     391            0 :   char name[64], buf[256], *new_buf;
     392            0 :   int i, mod;
     393              : 
     394            0 :   sprintf (name, "__%s_FBIT__", name_prefix);
     395            0 :   builtin_define_with_int_value (name, TYPE_FBIT (type));
     396              : 
     397            0 :   sprintf (name, "__%s_IBIT__", name_prefix);
     398            0 :   builtin_define_with_int_value (name, TYPE_IBIT (type));
     399              : 
     400              :   /* If there is no suffix, defines are for fixed-point modes.
     401              :      We just return.  */
     402            0 :   if (strcmp (suffix, "") == 0)
     403            0 :     return;
     404              : 
     405            0 :   if (TYPE_UNSIGNED (type))
     406              :     {
     407            0 :       sprintf (name, "__%s_MIN__", name_prefix);
     408            0 :       sprintf (buf, "0.0%s", suffix);
     409            0 :       builtin_define_with_value (name, buf, 0);
     410              :     }
     411              :   else
     412              :     {
     413            0 :       sprintf (name, "__%s_MIN__", name_prefix);
     414            0 :       if (ALL_ACCUM_MODE_P (TYPE_MODE (type)))
     415            0 :         sprintf (buf, "(-0X1P%d%s-0X1P%d%s)", TYPE_IBIT (type) - 1, suffix,
     416            0 :                  TYPE_IBIT (type) - 1, suffix);
     417              :       else
     418            0 :         sprintf (buf, "(-0.5%s-0.5%s)", suffix, suffix);
     419            0 :       builtin_define_with_value (name, buf, 0);
     420              :     }
     421              : 
     422            0 :   sprintf (name, "__%s_MAX__", name_prefix);
     423            0 :   sprintf (buf, "0X");
     424            0 :   new_buf = buf + 2;
     425            0 :   mod = (TYPE_FBIT (type) + TYPE_IBIT (type)) % 4;
     426            0 :   if (mod)
     427            0 :     sprintf (new_buf++, "%x", (1 << mod) - 1);
     428            0 :   for (i = 0; i < (TYPE_FBIT (type) + TYPE_IBIT (type)) / 4; i++)
     429            0 :     sprintf (new_buf++, "F");
     430            0 :   sprintf (new_buf, "P-%d%s", TYPE_FBIT (type), suffix);
     431            0 :   builtin_define_with_value (name, buf, 0);
     432              : 
     433            0 :   sprintf (name, "__%s_EPSILON__", name_prefix);
     434            0 :   sprintf (buf, "0x1P-%d%s", TYPE_FBIT (type), suffix);
     435            0 :   builtin_define_with_value (name, buf, 0);
     436              : }
     437              : 
     438              : /* Define macros used by <stdint.h>.  */
     439              : static void
     440       213968 : builtin_define_stdint_macros (void)
     441              : {
     442       427936 :   builtin_define_type_max ("__INTMAX_MAX__", intmax_type_node);
     443       213968 :   builtin_define_constants ("__INTMAX_C", intmax_type_node);
     444       427936 :   builtin_define_type_max ("__UINTMAX_MAX__", uintmax_type_node);
     445       213968 :   builtin_define_constants ("__UINTMAX_C", uintmax_type_node);
     446       213968 :   builtin_define_type_width ("__INTMAX_WIDTH__", intmax_type_node,
     447              :                              uintmax_type_node);
     448       213968 :   if (sig_atomic_type_node)
     449              :     {
     450       213968 :       builtin_define_type_minmax ("__SIG_ATOMIC_MIN__", "__SIG_ATOMIC_MAX__",
     451              :                                   sig_atomic_type_node);
     452       213968 :       builtin_define_type_width ("__SIG_ATOMIC_WIDTH__", sig_atomic_type_node,
     453              :                                  NULL_TREE);
     454              :     }
     455       213968 :   if (int8_type_node)
     456       213968 :     builtin_define_type_max ("__INT8_MAX__", int8_type_node);
     457       213968 :   if (int16_type_node)
     458       213968 :     builtin_define_type_max ("__INT16_MAX__", int16_type_node);
     459       213968 :   if (int32_type_node)
     460       213968 :     builtin_define_type_max ("__INT32_MAX__", int32_type_node);
     461       213968 :   if (int64_type_node)
     462       213968 :     builtin_define_type_max ("__INT64_MAX__", int64_type_node);
     463       213968 :   if (uint8_type_node)
     464       213968 :     builtin_define_type_max ("__UINT8_MAX__", uint8_type_node);
     465       213968 :   if (c_uint16_type_node)
     466       213968 :     builtin_define_type_max ("__UINT16_MAX__", c_uint16_type_node);
     467       213968 :   if (c_uint32_type_node)
     468       213968 :     builtin_define_type_max ("__UINT32_MAX__", c_uint32_type_node);
     469       213968 :   if (c_uint64_type_node)
     470       213968 :     builtin_define_type_max ("__UINT64_MAX__", c_uint64_type_node);
     471       213968 :   if (int_least8_type_node)
     472              :     {
     473       427936 :       builtin_define_type_max ("__INT_LEAST8_MAX__", int_least8_type_node);
     474       213968 :       builtin_define_constants ("__INT8_C", int_least8_type_node);
     475       213968 :       builtin_define_type_width ("__INT_LEAST8_WIDTH__", int_least8_type_node,
     476              :                                  uint_least8_type_node);
     477              :     }
     478       213968 :   if (int_least16_type_node)
     479              :     {
     480       427936 :       builtin_define_type_max ("__INT_LEAST16_MAX__", int_least16_type_node);
     481       213968 :       builtin_define_constants ("__INT16_C", int_least16_type_node);
     482       213968 :       builtin_define_type_width ("__INT_LEAST16_WIDTH__",
     483              :                                  int_least16_type_node,
     484              :                                  uint_least16_type_node);
     485              :     }
     486       213968 :   if (int_least32_type_node)
     487              :     {
     488       427936 :       builtin_define_type_max ("__INT_LEAST32_MAX__", int_least32_type_node);
     489       213968 :       builtin_define_constants ("__INT32_C", int_least32_type_node);
     490       213968 :       builtin_define_type_width ("__INT_LEAST32_WIDTH__",
     491              :                                  int_least32_type_node,
     492              :                                  uint_least32_type_node);
     493              :     }
     494       213968 :   if (int_least64_type_node)
     495              :     {
     496       427936 :       builtin_define_type_max ("__INT_LEAST64_MAX__", int_least64_type_node);
     497       213968 :       builtin_define_constants ("__INT64_C", int_least64_type_node);
     498       213968 :       builtin_define_type_width ("__INT_LEAST64_WIDTH__",
     499              :                                  int_least64_type_node,
     500              :                                  uint_least64_type_node);
     501              :     }
     502       213968 :   if (uint_least8_type_node)
     503              :     {
     504       427936 :       builtin_define_type_max ("__UINT_LEAST8_MAX__", uint_least8_type_node);
     505       213968 :       builtin_define_constants ("__UINT8_C", uint_least8_type_node);
     506              :     }
     507       213968 :   if (uint_least16_type_node)
     508              :     {
     509       427936 :       builtin_define_type_max ("__UINT_LEAST16_MAX__", uint_least16_type_node);
     510       213968 :       builtin_define_constants ("__UINT16_C", uint_least16_type_node);
     511              :     }
     512       213968 :   if (uint_least32_type_node)
     513              :     {
     514       427936 :       builtin_define_type_max ("__UINT_LEAST32_MAX__", uint_least32_type_node);
     515       213968 :       builtin_define_constants ("__UINT32_C", uint_least32_type_node);
     516              :     }
     517       213968 :   if (uint_least64_type_node)
     518              :     {
     519       427936 :       builtin_define_type_max ("__UINT_LEAST64_MAX__", uint_least64_type_node);
     520       213968 :       builtin_define_constants ("__UINT64_C", uint_least64_type_node);
     521              :     }
     522       213968 :   if (int_fast8_type_node)
     523              :     {
     524       427936 :       builtin_define_type_max ("__INT_FAST8_MAX__", int_fast8_type_node);
     525       213968 :       builtin_define_type_width ("__INT_FAST8_WIDTH__", int_fast8_type_node,
     526              :                                  uint_fast8_type_node);
     527              :     }
     528       213968 :   if (int_fast16_type_node)
     529              :     {
     530       427936 :       builtin_define_type_max ("__INT_FAST16_MAX__", int_fast16_type_node);
     531       213968 :       builtin_define_type_width ("__INT_FAST16_WIDTH__", int_fast16_type_node,
     532              :                                  uint_fast16_type_node);
     533              :     }
     534       213968 :   if (int_fast32_type_node)
     535              :     {
     536       427936 :       builtin_define_type_max ("__INT_FAST32_MAX__", int_fast32_type_node);
     537       213968 :       builtin_define_type_width ("__INT_FAST32_WIDTH__", int_fast32_type_node,
     538              :                                  uint_fast32_type_node);
     539              :     }
     540       213968 :   if (int_fast64_type_node)
     541              :     {
     542       427936 :       builtin_define_type_max ("__INT_FAST64_MAX__", int_fast64_type_node);
     543       213968 :       builtin_define_type_width ("__INT_FAST64_WIDTH__", int_fast64_type_node,
     544              :                                  uint_fast64_type_node);
     545              :     }
     546       213968 :   if (uint_fast8_type_node)
     547       213968 :     builtin_define_type_max ("__UINT_FAST8_MAX__", uint_fast8_type_node);
     548       213968 :   if (uint_fast16_type_node)
     549       213968 :     builtin_define_type_max ("__UINT_FAST16_MAX__", uint_fast16_type_node);
     550       213968 :   if (uint_fast32_type_node)
     551       213968 :     builtin_define_type_max ("__UINT_FAST32_MAX__", uint_fast32_type_node);
     552       213968 :   if (uint_fast64_type_node)
     553       213968 :     builtin_define_type_max ("__UINT_FAST64_MAX__", uint_fast64_type_node);
     554       213968 :   if (intptr_type_node)
     555              :     {
     556       427936 :       builtin_define_type_max ("__INTPTR_MAX__", intptr_type_node);
     557       213968 :       builtin_define_type_width ("__INTPTR_WIDTH__", intptr_type_node,
     558              :                                  uintptr_type_node);
     559              :     }
     560       213968 :   if (uintptr_type_node)
     561       213968 :     builtin_define_type_max ("__UINTPTR_MAX__", uintptr_type_node);
     562       213968 : }
     563              : 
     564              : /* Adjust the optimization macros when a #pragma GCC optimization is done to
     565              :    reflect the current level.  */
     566              : void
     567          638 : c_cpp_builtins_optimize_pragma (cpp_reader *pfile, tree prev_tree,
     568              :                                 tree cur_tree)
     569              : {
     570          638 :   struct cl_optimization *prev = TREE_OPTIMIZATION (prev_tree);
     571          638 :   struct cl_optimization *cur  = TREE_OPTIMIZATION (cur_tree);
     572          638 :   bool prev_fast_math;
     573          638 :   bool cur_fast_math;
     574              : 
     575              :   /* -undef turns off target-specific built-ins.  */
     576          638 :   if (flag_undef)
     577              :     return;
     578              : 
     579              :   /* Make sure all of the builtins about to be declared have
     580              :      BUILTINS_LOCATION has their location_t.  */
     581          638 :   cpp_force_token_locations (parse_in, BUILTINS_LOCATION);
     582              : 
     583              :   /* Other target-independent built-ins determined by command-line
     584              :      options.  */
     585          638 :   if (!prev->x_optimize_size && cur->x_optimize_size)
     586            1 :     cpp_define_unused (pfile, "__OPTIMIZE_SIZE__");
     587          637 :   else if (prev->x_optimize_size && !cur->x_optimize_size)
     588            2 :     cpp_undef (pfile, "__OPTIMIZE_SIZE__");
     589              : 
     590          638 :   if (!prev->x_optimize && cur->x_optimize)
     591          122 :     cpp_define_unused (pfile, "__OPTIMIZE__");
     592          516 :   else if (prev->x_optimize && !cur->x_optimize)
     593           80 :     cpp_undef (pfile, "__OPTIMIZE__");
     594              : 
     595          638 :   prev_fast_math = fast_math_flags_struct_set_p (prev);
     596          638 :   cur_fast_math  = fast_math_flags_struct_set_p (cur);
     597          638 :   if (!prev_fast_math && cur_fast_math)
     598            6 :     cpp_define_unused (pfile, "__FAST_MATH__");
     599          632 :   else if (prev_fast_math && !cur_fast_math)
     600           13 :     cpp_undef (pfile, "__FAST_MATH__");
     601              : 
     602          638 :   if (!prev->x_flag_signaling_nans && cur->x_flag_signaling_nans)
     603            0 :     cpp_define_unused (pfile, "__SUPPORT_SNAN__");
     604          638 :   else if (prev->x_flag_signaling_nans && !cur->x_flag_signaling_nans)
     605            0 :     cpp_undef (pfile, "__SUPPORT_SNAN__");
     606              : 
     607          638 :   if (!prev->x_flag_errno_math && cur->x_flag_errno_math)
     608           14 :     cpp_undef (pfile, "__NO_MATH_ERRNO__");
     609          624 :   else if (prev->x_flag_errno_math && !cur->x_flag_errno_math)
     610            7 :     cpp_define_unused (pfile, "__NO_MATH_ERRNO__");
     611              : 
     612          638 :   if (!prev->x_flag_finite_math_only && cur->x_flag_finite_math_only)
     613              :     {
     614            8 :       cpp_undef (pfile, "__FINITE_MATH_ONLY__");
     615            8 :       cpp_define_unused (pfile, "__FINITE_MATH_ONLY__=1");
     616              :     }
     617          630 :   else if (prev->x_flag_finite_math_only && !cur->x_flag_finite_math_only)
     618              :     {
     619           14 :       cpp_undef (pfile, "__FINITE_MATH_ONLY__");
     620           14 :       cpp_define_unused (pfile, "__FINITE_MATH_ONLY__=0");
     621              :     }
     622              : 
     623          638 :   if (!prev->x_flag_reciprocal_math && cur->x_flag_reciprocal_math)
     624           10 :     cpp_define_unused (pfile, "__RECIPROCAL_MATH__");
     625          628 :   else if (prev->x_flag_reciprocal_math && !cur->x_flag_reciprocal_math)
     626           17 :     cpp_undef (pfile, "__RECIPROCAL_MATH__");
     627              : 
     628          638 :   if (!prev->x_flag_signed_zeros && cur->x_flag_signed_zeros)
     629           17 :     cpp_undef (pfile, "__NO_SIGNED_ZEROS__");
     630          621 :   else if (prev->x_flag_signed_zeros && !cur->x_flag_signed_zeros)
     631           10 :     cpp_define_unused (pfile, "__NO_SIGNED_ZEROS__");
     632              : 
     633          638 :   if (!prev->x_flag_trapping_math && cur->x_flag_trapping_math)
     634           17 :     cpp_undef (pfile, "__NO_TRAPPING_MATH__");
     635          621 :   else if (prev->x_flag_trapping_math && !cur->x_flag_trapping_math)
     636           10 :     cpp_define_unused (pfile, "__NO_TRAPPING_MATH__");
     637              : 
     638          638 :   if (!prev->x_flag_associative_math && cur->x_flag_associative_math)
     639           10 :     cpp_define_unused (pfile, "__ASSOCIATIVE_MATH__");
     640          628 :   else if (prev->x_flag_associative_math && !cur->x_flag_associative_math)
     641           17 :     cpp_undef (pfile, "__ASSOCIATIVE_MATH__");
     642              : 
     643          638 :   if (!prev->x_flag_rounding_math && cur->x_flag_rounding_math)
     644            2 :     cpp_define_unused (pfile, "__ROUNDING_MATH__");
     645          636 :   else if (prev->x_flag_rounding_math && !cur->x_flag_rounding_math)
     646            2 :     cpp_undef (pfile, "__ROUNDING_MATH__");
     647              : 
     648          638 :   if (!prev->x_flag_unsafe_math_optimizations
     649          623 :       && cur->x_flag_unsafe_math_optimizations)
     650            8 :     cpp_define_unused (pfile, "__UNSAFE_MATH_OPTIMIZATIONS__");
     651          630 :   else if (prev->x_flag_unsafe_math_optimizations
     652           15 :            && !cur->x_flag_unsafe_math_optimizations)
     653           15 :     cpp_undef (pfile, "__UNSAFE_MATH_OPTIMIZATIONS__");
     654              : 
     655          638 :   cpp_stop_forcing_token_locations (parse_in);
     656              : }
     657              : 
     658              : 
     659              : /* This function will emit cpp macros to indicate the presence of various lock
     660              :    free atomic operations.  */
     661              : 
     662              : static void
     663       213968 : cpp_atomic_builtins (cpp_reader *pfile)
     664              : {
     665              :   /* Set a flag for each size of object that compare and swap exists for up to
     666              :      a 16 byte object.  */
     667              : #define SWAP_LIMIT  17
     668       213968 :   bool have_swap[SWAP_LIMIT];
     669       213968 :   unsigned int psize;
     670              : 
     671              :   /* Clear the map of sizes compare_and swap exists for.  */
     672       213968 :   memset (have_swap, 0, sizeof (have_swap));
     673              : 
     674              :   /* Tell source code if the compiler makes sync_compare_and_swap
     675              :      builtins available.  */
     676              : #ifndef HAVE_sync_compare_and_swapqi
     677              : #define HAVE_sync_compare_and_swapqi 0
     678              : #endif
     679              : #ifndef HAVE_atomic_compare_and_swapqi
     680              : #define HAVE_atomic_compare_and_swapqi 0
     681              : #endif
     682              : 
     683       213968 :   if (HAVE_sync_compare_and_swapqi || HAVE_atomic_compare_and_swapqi)
     684              :     {
     685       213968 :       cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
     686       213968 :       have_swap[1] = true;
     687              :     }
     688              : 
     689              : #ifndef HAVE_sync_compare_and_swaphi
     690              : #define HAVE_sync_compare_and_swaphi 0
     691              : #endif
     692              : #ifndef HAVE_atomic_compare_and_swaphi
     693              : #define HAVE_atomic_compare_and_swaphi 0
     694              : #endif
     695       213968 :   if (HAVE_sync_compare_and_swaphi || HAVE_atomic_compare_and_swaphi)
     696              :     {
     697       213968 :       cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
     698       213968 :       have_swap[2] = true;
     699              :     }
     700              : 
     701              : #ifndef HAVE_sync_compare_and_swapsi
     702              : #define HAVE_sync_compare_and_swapsi 0
     703              : #endif
     704              : #ifndef HAVE_atomic_compare_and_swapsi
     705              : #define HAVE_atomic_compare_and_swapsi 0
     706              : #endif
     707       213968 :   if (HAVE_sync_compare_and_swapsi || HAVE_atomic_compare_and_swapsi)
     708              :     {
     709       213968 :       cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
     710       213968 :       have_swap[4] = true;
     711              :     }
     712              : 
     713              : #ifndef HAVE_sync_compare_and_swapdi
     714              : #define HAVE_sync_compare_and_swapdi 0
     715              : #endif
     716              : #ifndef HAVE_atomic_compare_and_swapdi
     717              : #define HAVE_atomic_compare_and_swapdi 0
     718              : #endif
     719       213968 :   if (HAVE_sync_compare_and_swapdi || HAVE_atomic_compare_and_swapdi)
     720              :     {
     721       213968 :       cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
     722       213968 :       have_swap[8] = true;
     723              :     }
     724              : 
     725              : #ifndef HAVE_sync_compare_and_swapti
     726              : #define HAVE_sync_compare_and_swapti 0
     727              : #endif
     728              : #ifndef HAVE_atomic_compare_and_swapti
     729              : #define HAVE_atomic_compare_and_swapti 0
     730              : #endif
     731       213968 :   if (HAVE_sync_compare_and_swapti || HAVE_atomic_compare_and_swapti)
     732              :     {
     733         1011 :       cpp_define (pfile, "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
     734         1011 :       have_swap[16] = true;
     735              :     }
     736              : 
     737              :   /* Tell the source code about various types.  These map to the C++11 and C11
     738              :      macros where 2 indicates lock-free always, and 1 indicates sometimes
     739              :      lock free.  */
     740              : #define SIZEOF_NODE(T) (tree_to_uhwi (TYPE_SIZE_UNIT (T)))
     741              : #define SWAP_INDEX(T) ((SIZEOF_NODE (T) < SWAP_LIMIT) ? SIZEOF_NODE (T) : 0)
     742       213968 :   builtin_define_with_int_value ("__GCC_ATOMIC_BOOL_LOCK_FREE",
     743       427936 :                         (have_swap[SWAP_INDEX (boolean_type_node)]? 2 : 1));
     744       213968 :   builtin_define_with_int_value ("__GCC_ATOMIC_CHAR_LOCK_FREE",
     745       427936 :                         (have_swap[SWAP_INDEX (signed_char_type_node)]? 2 : 1));
     746       213968 :   if (flag_char8_t)
     747       175137 :     builtin_define_with_int_value ("__GCC_ATOMIC_CHAR8_T_LOCK_FREE",
     748       350274 :                         (have_swap[SWAP_INDEX (char8_type_node)]? 2 : 1));
     749       213968 :   builtin_define_with_int_value ("__GCC_ATOMIC_CHAR16_T_LOCK_FREE",
     750       427936 :                         (have_swap[SWAP_INDEX (char16_type_node)]? 2 : 1));
     751       213968 :   builtin_define_with_int_value ("__GCC_ATOMIC_CHAR32_T_LOCK_FREE",
     752       427936 :                         (have_swap[SWAP_INDEX (char32_type_node)]? 2 : 1));
     753       213968 :   builtin_define_with_int_value ("__GCC_ATOMIC_WCHAR_T_LOCK_FREE",
     754       427936 :                         (have_swap[SWAP_INDEX (wchar_type_node)]? 2 : 1));
     755       213968 :   builtin_define_with_int_value ("__GCC_ATOMIC_SHORT_LOCK_FREE",
     756       427936 :                       (have_swap[SWAP_INDEX (short_integer_type_node)]? 2 : 1));
     757       213968 :   builtin_define_with_int_value ("__GCC_ATOMIC_INT_LOCK_FREE",
     758       427936 :                         (have_swap[SWAP_INDEX (integer_type_node)]? 2 : 1));
     759       213968 :   builtin_define_with_int_value ("__GCC_ATOMIC_LONG_LOCK_FREE",
     760       427936 :                       (have_swap[SWAP_INDEX (long_integer_type_node)]? 2 : 1));
     761       213968 :   builtin_define_with_int_value ("__GCC_ATOMIC_LLONG_LOCK_FREE",
     762       427936 :                 (have_swap[SWAP_INDEX (long_long_integer_type_node)]? 2 : 1));
     763              : 
     764              :   /* If we're dealing with a "set" value that doesn't exactly correspond
     765              :      to a boolean truth value, let the library work around that.  */
     766       213968 :   builtin_define_with_int_value ("__GCC_ATOMIC_TEST_AND_SET_TRUEVAL",
     767       213968 :                                  targetm.atomic_test_and_set_trueval);
     768              : 
     769              :   /* Macros for C++17 hardware interference size constants.  Either both or
     770              :      neither should be set.  */
     771       213968 :   gcc_assert (!param_destruct_interfere_size
     772              :               == !param_construct_interfere_size);
     773       213968 :   if (param_destruct_interfere_size)
     774              :     {
     775              :       /* FIXME The way of communicating these values to the library should be
     776              :          part of the C++ ABI, whether macro or builtin.  */
     777       213968 :       builtin_define_with_int_value ("__GCC_DESTRUCTIVE_SIZE",
     778              :                                      param_destruct_interfere_size);
     779       213968 :       builtin_define_with_int_value ("__GCC_CONSTRUCTIVE_SIZE",
     780       213968 :                                      param_construct_interfere_size);
     781              :     }
     782              : 
     783              :   /* ptr_type_node can't be used here since ptr_mode is only set when
     784              :      toplev calls backend_init which is not done with -E  or pch.  */
     785       213968 :   psize = POINTER_SIZE_UNITS;
     786       213968 :   if (psize >= SWAP_LIMIT)
     787              :     psize = 0;
     788       213968 :   builtin_define_with_int_value ("__GCC_ATOMIC_POINTER_LOCK_FREE",
     789       213968 :                         (have_swap[psize]? 2 : 1));
     790       213968 : }
     791              : 
     792              : /* Return TRUE if the implicit excess precision in which the back-end will
     793              :    compute floating-point calculations is not more than the explicit
     794              :    excess precision that the front-end will apply under
     795              :    -fexcess-precision=[standard|fast|16].
     796              : 
     797              :    More intuitively, return TRUE if the excess precision proposed by the
     798              :    front-end is the excess precision that will actually be used.  */
     799              : 
     800              : static bool
     801        12638 : c_cpp_flt_eval_method_iec_559 (void)
     802              : {
     803           12 :   enum excess_precision_type front_end_ept
     804        12638 :     = (flag_excess_precision == EXCESS_PRECISION_STANDARD
     805        12638 :        ? EXCESS_PRECISION_TYPE_STANDARD
     806              :        : (flag_excess_precision == EXCESS_PRECISION_FLOAT16
     807           12 :           ? EXCESS_PRECISION_TYPE_FLOAT16
     808              :           : EXCESS_PRECISION_TYPE_FAST));
     809              : 
     810        12638 :   enum flt_eval_method back_end
     811        12638 :     = targetm.c.excess_precision (EXCESS_PRECISION_TYPE_IMPLICIT);
     812              : 
     813        12638 :   enum flt_eval_method front_end
     814        12638 :     = targetm.c.excess_precision (front_end_ept);
     815              : 
     816        12638 :   return excess_precision_mode_join (front_end, back_end) == front_end;
     817              : }
     818              : 
     819              : /* Return the value for __GCC_IEC_559.  */
     820              : static int
     821       427936 : cpp_iec_559_value (void)
     822              : {
     823              :   /* The default is support for IEEE 754-2008.  */
     824       427936 :   int ret = 2;
     825              : 
     826              :   /* float and double must be binary32 and binary64.  If they are but
     827              :      with reversed NaN convention, at most IEEE 754-1985 is
     828              :      supported.  */
     829       427936 :   const struct real_format *ffmt
     830       427936 :     = REAL_MODE_FORMAT (TYPE_MODE (float_type_node));
     831       427936 :   const struct real_format *dfmt
     832       427936 :     = REAL_MODE_FORMAT (TYPE_MODE (double_type_node));
     833       427936 :   if (!ffmt->qnan_msb_set || !dfmt->qnan_msb_set)
     834            0 :     ret = 1;
     835       427936 :   if (ffmt->b != 2
     836       427936 :       || ffmt->p != 24
     837       427936 :       || ffmt->pnan != 24
     838       427936 :       || ffmt->emin != -125
     839       427936 :       || ffmt->emax != 128
     840       427936 :       || ffmt->signbit_rw != 31
     841       427936 :       || ffmt->round_towards_zero
     842       427936 :       || !ffmt->has_sign_dependent_rounding
     843       427936 :       || !ffmt->has_nans
     844       427936 :       || !ffmt->has_inf
     845       427936 :       || !ffmt->has_denorm
     846       427936 :       || !ffmt->has_signed_zero
     847       427936 :       || dfmt->b != 2
     848       427936 :       || dfmt->p != 53
     849       427936 :       || dfmt->pnan != 53
     850       427936 :       || dfmt->emin != -1021
     851       427936 :       || dfmt->emax != 1024
     852       427936 :       || dfmt->signbit_rw != 63
     853       427936 :       || dfmt->round_towards_zero
     854       427936 :       || !dfmt->has_sign_dependent_rounding
     855       427936 :       || !dfmt->has_nans
     856       427936 :       || !dfmt->has_inf
     857       427936 :       || !dfmt->has_denorm
     858       427936 :       || !dfmt->has_signed_zero)
     859            0 :     ret = 0;
     860              : 
     861              :   /* In strict C standards conformance mode, consider a back-end providing
     862              :      more implicit excess precision than the explicit excess precision
     863              :      the front-end options would require to mean a lack of IEEE 754
     864              :      support.  For C++, and outside strict conformance mode, do not consider
     865              :      this to mean a lack of IEEE 754 support.  */
     866              : 
     867       427936 :   if (flag_iso
     868       120984 :       && !c_dialect_cxx ()
     869       440574 :       && !c_cpp_flt_eval_method_iec_559 ())
     870              :     ret = 0;
     871              : 
     872       427936 :   if (flag_iso
     873       120984 :       && !c_dialect_cxx ()
     874        12638 :       && flag_fp_contract_mode == FP_CONTRACT_FAST)
     875       427936 :     ret = 0;
     876              : 
     877              :   /* Various options are contrary to IEEE 754 semantics.  */
     878       427936 :   if (flag_unsafe_math_optimizations
     879       424744 :       || flag_associative_math
     880       424728 :       || flag_reciprocal_math
     881       424718 :       || flag_finite_math_only
     882       424600 :       || !flag_signed_zeros
     883       424560 :       || flag_single_precision_constant)
     884         3382 :     ret = 0;
     885              : 
     886              :   /* If the target does not support IEEE 754 exceptions and rounding
     887              :      modes, consider IEEE 754 support to be absent.  */
     888       427936 :   if (!targetm.float_exceptions_rounding_supported_p ())
     889          400 :     ret = 0;
     890              : 
     891       427936 :   return ret;
     892              : }
     893              : 
     894              : /* Return the value for __GCC_IEC_559_COMPLEX.  */
     895              : static int
     896       213968 : cpp_iec_559_complex_value (void)
     897              : {
     898              :   /* The value is no bigger than that of __GCC_IEC_559.  */
     899            0 :   int ret = cpp_iec_559_value ();
     900              : 
     901              :   /* Some options are contrary to the required default state of the
     902              :      CX_LIMITED_RANGE pragma.  */
     903       213968 :   if (flag_complex_method != 2)
     904         4311 :     ret = 0;
     905              : 
     906       213968 :   return ret;
     907              : }
     908              : 
     909              : /* Hook that registers front end and target-specific built-ins.  */
     910              : void
     911       213969 : c_cpp_builtins (cpp_reader *pfile)
     912              : {
     913       213969 :   int i;
     914              : 
     915              :   /* -undef turns off target-specific built-ins.  */
     916       213969 :   if (flag_undef)
     917            1 :     return;
     918              : 
     919       213968 :   define_language_independent_builtin_macros (pfile);
     920              : 
     921              :   /* encoding definitions used by users and libraries  */
     922       213968 :   builtin_define_with_value ("__GNUC_EXECUTION_CHARSET_NAME",
     923              :                              cpp_get_narrow_charset_name (pfile), 1);
     924       213968 :   builtin_define_with_value ("__GNUC_WIDE_EXECUTION_CHARSET_NAME",
     925              :                              cpp_get_wide_charset_name (pfile), 1);
     926              : 
     927       213968 :   if (c_dialect_cxx ())
     928              :     {
     929       101678 :       int major;
     930       101678 :       parse_basever (&major, NULL, NULL);
     931       101678 :       cpp_define_formatted (pfile, "__GNUG__=%d", major);
     932              :     }
     933              : 
     934              :   /* For stddef.h.  They require macros defined in c-common.cc.  */
     935       213968 :   c_stddef_cpp_builtins ();
     936              : 
     937              :   /* Variant of cpp_define which arranges for diagnostics on user #define
     938              :      or #undef of the macros.  */
     939      5758206 :   auto cpp_define_warn = [] (cpp_reader *pfile, const char *def)
     940              :     {
     941      5544238 :       const char *end = strchr (def, '=');
     942      5544238 :       cpp_define (pfile, def);
     943      5544238 :       cpp_warn (pfile, def, end ? end - def : strlen (def));
     944      5544238 :     };
     945              : 
     946       213968 :   if (c_dialect_cxx ())
     947              :     {
     948              :       /* Treat all cpp_define calls in this block for macros starting
     949              :          with __cpp_ (for C++20 and later) or __STDCPP_ as cpp_define_warn.  */
     950      6414922 :       auto cpp_define = [=] (cpp_reader *pfile, const char *def)
     951              :         {
     952      5774377 :           if ((cxx_dialect >= cxx20 && startswith (def, "__cpp_"))
     953      6769502 :               || startswith (def, "__STDCPP_"))
     954      5405498 :             cpp_define_warn (pfile, def);
     955              :           else
     956       907746 :             ::cpp_define (pfile, def);
     957      6313244 :         };
     958              : 
     959       101678 :       if (flag_weak && SUPPORTS_ONE_ONLY)
     960       101648 :         cpp_define (pfile, "__GXX_WEAK__=1");
     961              :       else
     962           30 :         cpp_define (pfile, "__GXX_WEAK__=0");
     963              : 
     964       101678 :       if (warn_deprecated)
     965       101542 :         cpp_define (pfile, "__DEPRECATED");
     966              : 
     967       101678 :       if (flag_rtti)
     968              :         {
     969       100985 :           cpp_define (pfile, "__GXX_RTTI");
     970       100985 :           cpp_define (pfile, "__cpp_rtti=199711L");
     971              :         }
     972              : 
     973       101678 :       if (cxx_dialect >= cxx11)
     974              :         {
     975        87379 :           cpp_define (pfile, "__GXX_EXPERIMENTAL_CXX0X__");
     976        87379 :           cpp_define (pfile, "__GXX_CONSTEXPR_ASM__");
     977              :         }
     978              : 
     979              :       /* Binary literals have been allowed in g++ before C++11
     980              :          and were standardized for C++14.  */
     981       101678 :       if (!pedantic || cxx_dialect > cxx11)
     982        90972 :         cpp_define (pfile, "__cpp_binary_literals=201304L");
     983              : 
     984              :       /* Similarly for hexadecimal floating point literals and C++17.  */
     985       101678 :       if (!pedantic || cpp_get_options (parse_in)->extended_numbers)
     986        90340 :         cpp_define (pfile, "__cpp_hex_float=201603L");
     987              : 
     988              :       /* Arrays of runtime bound were removed from C++14, but we still
     989              :          support GNU VLAs.  Let's define this macro to a low number
     990              :          (corresponding to the initial test release of GNU C++) if we won't
     991              :          complain about use of VLAs.  */
     992       101678 :       if (c_dialect_cxx ()
     993       101678 :           && (pedantic ? warn_vla == 0 : warn_vla <= 0))
     994        54503 :         cpp_define (pfile, "__cpp_runtime_arrays=198712L");
     995              : 
     996       101678 :       if (cxx_dialect >= cxx11)
     997              :         {
     998              :           /* Set feature test macros for C++11.  */
     999        87379 :           if (cxx_dialect <= cxx14)
    1000         7093 :             cpp_define (pfile, "__cpp_unicode_characters=200704L");
    1001        87379 :           cpp_define (pfile, "__cpp_raw_strings=200710L");
    1002        87379 :           cpp_define (pfile, "__cpp_unicode_literals=200710L");
    1003        87379 :           cpp_define (pfile, "__cpp_user_defined_literals=200809L");
    1004        87379 :           cpp_define (pfile, "__cpp_lambdas=200907L");
    1005        87379 :           if (cxx_dialect == cxx11)
    1006         5761 :             cpp_define (pfile, "__cpp_constexpr=200704L");
    1007        87379 :           if (cxx_dialect <= cxx14)
    1008         7093 :             cpp_define (pfile, "__cpp_range_based_for=200907L");
    1009        87379 :           if (cxx_dialect <= cxx14)
    1010         7093 :             cpp_define (pfile, "__cpp_static_assert=200410L");
    1011        87379 :           cpp_define (pfile, "__cpp_decltype=200707L");
    1012        87379 :           cpp_define (pfile, "__cpp_attributes=200809L");
    1013        87379 :           cpp_define (pfile, "__cpp_rvalue_reference=200610L");
    1014        87379 :           cpp_define (pfile, "__cpp_rvalue_references=200610L");
    1015        87379 :           cpp_define (pfile, "__cpp_variadic_templates=200704L");
    1016        87379 :           cpp_define (pfile, "__cpp_initializer_lists=200806L");
    1017        87379 :           cpp_define (pfile, "__cpp_delegating_constructors=200604L");
    1018        87379 :           cpp_define (pfile, "__cpp_nsdmi=200809L");
    1019        87379 :           if (!flag_new_inheriting_ctors)
    1020          200 :             cpp_define (pfile, "__cpp_inheriting_constructors=200802L");
    1021              :           else
    1022        87179 :             cpp_define (pfile, "__cpp_inheriting_constructors=201511L");
    1023        87379 :           cpp_define (pfile, "__cpp_ref_qualifiers=200710L");
    1024        87379 :           cpp_define (pfile, "__cpp_alias_templates=200704L");
    1025              :         }
    1026       101678 :       if (cxx_dialect > cxx11)
    1027              :         {
    1028              :           /* Set feature test macros for C++14.  */
    1029        81618 :           cpp_define (pfile, "__cpp_return_type_deduction=201304L");
    1030        81618 :           if (cxx_dialect <= cxx17)
    1031              :             {
    1032         5552 :               cpp_define (pfile, "__cpp_init_captures=201304L");
    1033         5552 :               cpp_define (pfile, "__cpp_generic_lambdas=201304L");
    1034              :             }
    1035        81618 :           if (cxx_dialect <= cxx14)
    1036         1332 :             cpp_define (pfile, "__cpp_constexpr=201304L");
    1037        81618 :           cpp_define (pfile, "__cpp_decltype_auto=201304L");
    1038        81618 :           cpp_define (pfile, "__cpp_aggregate_nsdmi=201304L");
    1039        81618 :           cpp_define (pfile, "__cpp_variable_templates=201304L");
    1040        81618 :           cpp_define (pfile, "__cpp_digit_separators=201309L");
    1041              :         }
    1042       101678 :       if (cxx_dialect > cxx14)
    1043              :         {
    1044              :           /* Set feature test macros for C++17.  */
    1045        80286 :           cpp_define (pfile, "__cpp_unicode_characters=201411L");
    1046        80286 :           if (cxx_dialect <= cxx23)
    1047        54745 :             cpp_define (pfile, "__cpp_static_assert=201411L");
    1048        80286 :           cpp_define (pfile, "__cpp_namespace_attributes=201411L");
    1049        80286 :           cpp_define (pfile, "__cpp_enumerator_attributes=201411L");
    1050        80286 :           cpp_define (pfile, "__cpp_nested_namespace_definitions=201411L");
    1051        80286 :           cpp_define (pfile, "__cpp_fold_expressions=201603L");
    1052        80286 :           if (cxx_dialect <= cxx17)
    1053         4220 :             cpp_define (pfile, "__cpp_nontype_template_args=201411L");
    1054        80286 :           if (!flag_range_for_ext_temps)
    1055        52532 :             cpp_define (pfile, "__cpp_range_based_for=201603L");
    1056              :           else
    1057              :             /* This is the C++23 or -std=c++17 -frange-for-ext-temps value.  */
    1058        27754 :             cpp_define (pfile, "__cpp_range_based_for=202211L");
    1059        80286 :           if (cxx_dialect <= cxx17)
    1060         4220 :             cpp_define (pfile, "__cpp_constexpr=201603L");
    1061        80286 :           cpp_define (pfile, "__cpp_if_constexpr=201606L");
    1062        80286 :           cpp_define (pfile, "__cpp_capture_star_this=201603L");
    1063        80286 :           cpp_define (pfile, "__cpp_inline_variables=201606L");
    1064        80286 :           cpp_define (pfile, "__cpp_aggregate_bases=201603L");
    1065        80286 :           if (cxx_dialect <= cxx17)
    1066         4220 :             cpp_define (pfile, "__cpp_deduction_guides=201703L");
    1067        80286 :           cpp_define (pfile, "__cpp_noexcept_function_type=201510L");
    1068              :           /* Old macro, superseded by
    1069              :              __cpp_nontype_template_parameter_auto.  */
    1070        80286 :           cpp_define (pfile, "__cpp_template_auto=201606L");
    1071        80286 :           if (cxx_dialect <= cxx23)
    1072        54745 :             cpp_define (pfile, "__cpp_structured_bindings=201606L");
    1073        80286 :           cpp_define (pfile, "__cpp_variadic_using=201611L");
    1074        80286 :           cpp_define (pfile, "__cpp_guaranteed_copy_elision=201606L");
    1075        80286 :           cpp_define (pfile, "__cpp_nontype_template_parameter_auto=201606L");
    1076              :         }
    1077       101678 :       if (cxx_dialect > cxx17)
    1078              :         {
    1079              :           /* Set feature test macros for C++20.  */
    1080        76066 :           cpp_define (pfile, "__cpp_init_captures=201803L");
    1081        76066 :           cpp_define (pfile, "__cpp_generic_lambdas=201707L");
    1082        76066 :           if (cxx_dialect <= cxx26)
    1083        51937 :             cpp_define (pfile, "__cpp_designated_initializers=201707L");
    1084        76066 :           if (cxx_dialect <= cxx20)
    1085        48318 :             cpp_define (pfile, "__cpp_constexpr=202002L");
    1086        76066 :           cpp_define (pfile, "__cpp_constexpr_in_decltype=201711L");
    1087        76066 :           cpp_define (pfile, "__cpp_conditional_explicit=201806L");
    1088        76066 :           cpp_define (pfile, "__cpp_consteval=202211L");
    1089        76066 :           cpp_define (pfile, "__cpp_constinit=201907L");
    1090        76066 :           if (cxx_dialect <= cxx20)
    1091        48318 :             cpp_define (pfile, "__cpp_deduction_guides=201907L");
    1092        76066 :           cpp_define (pfile, "__cpp_nontype_template_args=201911L");
    1093        76066 :           cpp_define (pfile, "__cpp_nontype_template_parameter_class=201806L");
    1094        76066 :           cpp_define (pfile, "__cpp_impl_destroying_delete=201806L");
    1095        76066 :           cpp_define (pfile, "__cpp_constexpr_dynamic_alloc=201907L");
    1096        76066 :           cpp_define (pfile, "__cpp_impl_three_way_comparison=201907L");
    1097        76066 :           cpp_define (pfile, "__cpp_aggregate_paren_init=201902L");
    1098        76066 :           cpp_define (pfile, "__cpp_using_enum=201907L");
    1099              :         }
    1100       101678 :       if (cxx_dialect > cxx20)
    1101              :         {
    1102              :           /* Set feature test macros for C++23.  */
    1103        27748 :           cpp_define (pfile, "__cpp_size_t_suffix=202011L");
    1104        27748 :           cpp_define (pfile, "__cpp_if_consteval=202106L");
    1105        27748 :           cpp_define (pfile, "__cpp_auto_cast=202110L");
    1106        27748 :           if (cxx_dialect <= cxx23)
    1107         2207 :             cpp_define (pfile, "__cpp_constexpr=202211L");
    1108        27748 :           cpp_define (pfile, "__cpp_deduction_guides=202207L");
    1109        27748 :           cpp_define (pfile, "__cpp_multidimensional_subscript=202211L");
    1110        27748 :           cpp_define (pfile, "__cpp_named_character_escapes=202606L");
    1111        27748 :           cpp_define (pfile, "__cpp_static_call_operator=202207L");
    1112        27748 :           cpp_define (pfile, "__cpp_implicit_move=202207L");
    1113        27748 :           cpp_define (pfile, "__cpp_explicit_this_parameter=202110L");
    1114              :         }
    1115       101678 :       if (cxx_dialect > cxx23)
    1116              :         {
    1117              :           /* Set feature test macros for C++26.  */
    1118        25541 :           cpp_define (pfile, "__cpp_constexpr=202406L");
    1119        25541 :           cpp_define (pfile, "__cpp_constexpr_exceptions=202411L");
    1120        25541 :           cpp_define (pfile, "__cpp_static_assert=202306L");
    1121        25541 :           cpp_define (pfile, "__cpp_placeholder_variables=202306L");
    1122        25541 :           cpp_define (pfile, "__cpp_structured_bindings=202411L");
    1123        25541 :           cpp_define (pfile, "__cpp_deleted_function=202403L");
    1124        25541 :           cpp_define (pfile, "__cpp_variadic_friend=202403L");
    1125        25541 :           cpp_define (pfile, "__cpp_pack_indexing=202311L");
    1126        25541 :           if (cxx_dialect <= cxx26)
    1127         1412 :             cpp_define (pfile, "__cpp_pp_embed=202502L");
    1128        25541 :           cpp_define (pfile, "__cpp_constexpr_virtual_inheritance=202506L");
    1129        25541 :           cpp_define (pfile, "__cpp_expansion_statements=202506L");
    1130        25541 :           if (flag_reflection)
    1131         1342 :             cpp_define (pfile, "__cpp_impl_reflection=202603L");
    1132              :           else
    1133        24199 :             cpp_warn (pfile, "__cpp_impl_reflection");
    1134        25541 :           cpp_define (pfile, "__cpp_trivial_union=202603L");
    1135              :         }
    1136       101678 :       if (cxx_dialect > cxx26)
    1137              :         {
    1138              :           /* Set feature test macros for C++29.  */
    1139        24129 :           cpp_define (pfile, "__cpp_pp_embed=202606L");
    1140        24129 :           cpp_define (pfile, "__cpp_designated_initializers=202606L");
    1141              :         }
    1142       101678 :       if (flag_concepts && cxx_dialect > cxx14)
    1143              :         {
    1144        76185 :           if (cxx_dialect > cxx26)
    1145        24129 :             cpp_define (pfile, "__cpp_concepts=202606L");
    1146              :           else
    1147        52056 :             cpp_define (pfile, "__cpp_concepts=202002L");
    1148              :         }
    1149        25493 :       else if (cxx_dialect >= cxx20)
    1150            0 :         cpp_warn (pfile, "__cpp_concepts");
    1151       101678 :       if (flag_contracts)
    1152        25586 :         cpp_define (pfile, "__cpp_contracts=202502L");
    1153        76092 :       else if (cxx_dialect >= cxx26)
    1154            1 :         cpp_warn (pfile, "__cpp_contracts");
    1155       101678 :       if (flag_modules)
    1156              :         /* The std-defined value is 201907L, but I don't think we can
    1157              :            claim victory yet.  201810 is the p1103 date. */
    1158         5003 :         cpp_define (pfile, "__cpp_modules=201810L");
    1159        96675 :       else if (cxx_dialect >= cxx20)
    1160        72620 :         cpp_warn (pfile, "__cpp_modules");
    1161       101678 :       if (flag_coroutines)
    1162        77037 :         cpp_define (pfile, "__cpp_impl_coroutine=202606L"); /* n4861, DIS */
    1163        24641 :       else if (cxx_dialect >= cxx20)
    1164            0 :         cpp_warn (pfile, "__cpp_impl_coroutine");
    1165       101678 :       if (flag_tm)
    1166              :         /* Use a value smaller than the 201505 specified in
    1167              :            the TS, since we don't yet support atomic_cancel.  */
    1168          325 :         cpp_define (pfile, "__cpp_transactional_memory=201500L");
    1169       101678 :       if (flag_sized_deallocation)
    1170        81616 :         cpp_define (pfile, "__cpp_sized_deallocation=201309L");
    1171        20062 :       else if (cxx_dialect >= cxx20)
    1172            2 :         cpp_warn (pfile, "__cpp_sized_deallocation");
    1173       101678 :       if (aligned_new_threshold)
    1174              :         {
    1175        80289 :           cpp_define (pfile, "__cpp_aligned_new=201606L");
    1176        80289 :           cpp_define_formatted (pfile, "__STDCPP_DEFAULT_NEW_ALIGNMENT__=%d",
    1177              :                                 aligned_new_threshold);
    1178              :         }
    1179        21389 :       else if (cxx_dialect >= cxx20)
    1180            0 :         cpp_warn (pfile, "__cpp_aligned_new");
    1181       101678 :       if (cxx_dialect >= cxx17)
    1182        80286 :         cpp_warn (pfile, "__STDCPP_DEFAULT_NEW_ALIGNMENT__");
    1183       101678 :       if (flag_new_ttp)
    1184        80274 :         cpp_define (pfile, "__cpp_template_template_args=201611L");
    1185        21404 :       else if (cxx_dialect >= cxx20)
    1186           19 :         cpp_warn (pfile, "__cpp_template_template_args");
    1187       101678 :       if (flag_threadsafe_statics)
    1188       101672 :         cpp_define (pfile, "__cpp_threadsafe_static_init=200806L");
    1189            6 :       else if (cxx_dialect >= cxx20)
    1190            4 :         cpp_warn (pfile, "__cpp_threadsafe_static_init");
    1191       101678 :       if (flag_char8_t)
    1192        76084 :         cpp_define (pfile, "__cpp_char8_t=202207L");
    1193        25594 :       else if (cxx_dialect >= cxx20)
    1194           15 :         cpp_warn (pfile, "__cpp_char8_t");
    1195              : #ifndef THREAD_MODEL_SPEC
    1196              :       /* Targets that define THREAD_MODEL_SPEC need to define
    1197              :          __STDCPP_THREADS__ in their config/XXX/XXX-c.c themselves.  */
    1198       101678 :       if (cxx_dialect >= cxx11 && strcmp (thread_model, "single") != 0)
    1199        87379 :         cpp_define (pfile, "__STDCPP_THREADS__=1");
    1200              :       else
    1201              : #endif
    1202              :         if (cxx_dialect >= cxx11)
    1203              :           cpp_warn (pfile, "__STDCPP_THREADS__");
    1204       101678 :       if (flag_implicit_constexpr)
    1205            7 :         cpp_define (pfile, "__cpp_implicit_constexpr=20211111L");
    1206              :     }
    1207              :   /* Note that we define this for C as well, so that we know if
    1208              :      __attribute__((cleanup)) will interface with EH.  */
    1209       213968 :   if (flag_exceptions)
    1210              :     {
    1211       100944 :       cpp_define (pfile, "__EXCEPTIONS");
    1212       100944 :       if (c_dialect_cxx ())
    1213       100421 :         cpp_define (pfile, "__cpp_exceptions=199711L");
    1214              :     }
    1215              : 
    1216              :   /* Represents the C++ ABI version, always defined so it can be used while
    1217              :      preprocessing C and assembler.  */
    1218       213968 :   if (flag_abi_version == 0)
    1219              :     /* We should have set this to something real in c_common_post_options.  */
    1220            0 :     gcc_unreachable ();
    1221       213968 :   else if (flag_abi_version == 1)
    1222              :     /* Due to a historical accident, this version had the value
    1223              :        "102".  */
    1224            0 :     builtin_define_with_int_value ("__GXX_ABI_VERSION", 102);
    1225              :   else
    1226              :     /* Newer versions have values 1002, 1003, ....  */
    1227       213968 :     builtin_define_with_int_value ("__GXX_ABI_VERSION",
    1228       213968 :                                    1000 + flag_abi_version);
    1229              : 
    1230              :   /* libgcc needs to know this.  */
    1231       213968 :   if (targetm_common.except_unwind_info (&global_options) == UI_SJLJ)
    1232            0 :     cpp_define (pfile, "__USING_SJLJ_EXCEPTIONS__");
    1233              : 
    1234              :   /* limits.h and stdint.h need to know these.  */
    1235       427936 :   builtin_define_type_max ("__SCHAR_MAX__", signed_char_type_node);
    1236       427936 :   builtin_define_type_max ("__SHRT_MAX__", short_integer_type_node);
    1237       427936 :   builtin_define_type_max ("__INT_MAX__", integer_type_node);
    1238       427936 :   builtin_define_type_max ("__LONG_MAX__", long_integer_type_node);
    1239       427936 :   builtin_define_type_max ("__LONG_LONG_MAX__", long_long_integer_type_node);
    1240       213968 :   builtin_define_type_minmax ("__WCHAR_MIN__", "__WCHAR_MAX__",
    1241              :                               underlying_wchar_type_node);
    1242       213968 :   builtin_define_type_minmax ("__WINT_MIN__", "__WINT_MAX__", wint_type_node);
    1243       427936 :   builtin_define_type_max ("__PTRDIFF_MAX__", ptrdiff_type_node);
    1244       427936 :   builtin_define_type_max ("__SIZE_MAX__", size_type_node);
    1245              : 
    1246              :   /* These are needed for TS 18661-1.  */
    1247       213968 :   builtin_define_type_width ("__SCHAR_WIDTH__", signed_char_type_node,
    1248              :                              unsigned_char_type_node);
    1249       213968 :   builtin_define_type_width ("__SHRT_WIDTH__", short_integer_type_node,
    1250              :                              short_unsigned_type_node);
    1251       213968 :   builtin_define_type_width ("__INT_WIDTH__", integer_type_node,
    1252              :                              unsigned_type_node);
    1253       213968 :   builtin_define_type_width ("__LONG_WIDTH__", long_integer_type_node,
    1254              :                              long_unsigned_type_node);
    1255       213968 :   builtin_define_type_width ("__LONG_LONG_WIDTH__",
    1256              :                              long_long_integer_type_node,
    1257              :                              long_long_unsigned_type_node);
    1258       213968 :   builtin_define_type_width ("__WCHAR_WIDTH__", underlying_wchar_type_node,
    1259              :                              NULL_TREE);
    1260       213968 :   builtin_define_type_width ("__WINT_WIDTH__", wint_type_node, NULL_TREE);
    1261       213968 :   builtin_define_type_width ("__PTRDIFF_WIDTH__", ptrdiff_type_node, NULL_TREE);
    1262       213968 :   builtin_define_type_width ("__SIZE_WIDTH__", size_type_node, NULL_TREE);
    1263              : 
    1264       213968 :   if (!c_dialect_cxx ())
    1265              :     {
    1266       112290 :       struct bitint_info info;
    1267              :       /* For now, restrict __BITINT_MAXWIDTH__ to what can be represented in
    1268              :          wide_int and widest_int.  */
    1269       112290 :       if (targetm.c.bitint_type_info (WIDE_INT_MAX_PRECISION - 1, &info))
    1270              :         {
    1271       112290 :           cpp_define_formatted (pfile, "__BITINT_MAXWIDTH__=%d",
    1272              :                                 (int) WIDE_INT_MAX_PRECISION - 1);
    1273       112290 :           if (flag_building_libgcc)
    1274              :             {
    1275          984 :               scalar_int_mode limb_mode
    1276          984 :                 = as_a <scalar_int_mode> (info.limb_mode);
    1277          984 :               cpp_define_formatted (pfile, "__LIBGCC_BITINT_LIMB_WIDTH__=%d",
    1278          984 :                                     (int) GET_MODE_PRECISION (limb_mode));
    1279          984 :               cpp_define_formatted (pfile, "__LIBGCC_BITINT_ORDER__=%s",
    1280          984 :                                     info.big_endian
    1281              :                                     ? "__ORDER_BIG_ENDIAN__"
    1282              :                                     : "__ORDER_LITTLE_ENDIAN__");
    1283              :             }
    1284              :         }
    1285              :     }
    1286              : 
    1287       213968 :   if (c_dialect_cxx ())
    1288       203356 :     for (i = 0; i < NUM_INT_N_ENTS; i ++)
    1289       101678 :       if (int_n_enabled_p[i])
    1290              :         {
    1291       100875 :           char buf[35+20+20];
    1292              : 
    1293              :           /* These are used to configure the C++ library.  */
    1294              : 
    1295       100875 :           if (!flag_iso || int_n_data[i].bitsize == POINTER_SIZE)
    1296              :             {
    1297        46752 :               sprintf (buf, "__GLIBCXX_TYPE_INT_N_%d=__int%d", i, int_n_data[i].bitsize);
    1298        46752 :               cpp_define (parse_in, buf);
    1299              : 
    1300        46752 :               sprintf (buf, "__GLIBCXX_BITSIZE_INT_N_%d=%d", i, int_n_data[i].bitsize);
    1301        46752 :               cpp_define (parse_in, buf);
    1302              :             }
    1303              :         }
    1304              : 
    1305              :   /* stdint.h and the testsuite need to know these.  */
    1306       213968 :   builtin_define_stdint_macros ();
    1307              : 
    1308              :   /* Provide information for library headers to determine whether to
    1309              :      define macros such as __STDC_IEC_559__ and
    1310              :      __STDC_IEC_559_COMPLEX__.  */
    1311       213968 :   builtin_define_with_int_value ("__GCC_IEC_559", cpp_iec_559_value ());
    1312       213968 :   builtin_define_with_int_value ("__GCC_IEC_559_COMPLEX",
    1313       213968 :                                  cpp_iec_559_complex_value ());
    1314              : 
    1315              :   /* float.h needs these to correctly set FLT_EVAL_METHOD
    1316              : 
    1317              :      We define two values:
    1318              : 
    1319              :      __FLT_EVAL_METHOD__
    1320              :        Which, depending on the value given for
    1321              :        -fpermitted-flt-eval-methods, may be limited to only those values
    1322              :        for FLT_EVAL_METHOD defined in C99/C11.
    1323              : 
    1324              :      __FLT_EVAL_METHOD_TS_18661_3__
    1325              :        Which always permits the values for FLT_EVAL_METHOD defined in
    1326              :        ISO/IEC TS 18661-3.  */
    1327       213968 :   builtin_define_with_int_value ("__FLT_EVAL_METHOD__",
    1328       213968 :                                  c_flt_eval_method (true));
    1329       213968 :   builtin_define_with_int_value ("__FLT_EVAL_METHOD_TS_18661_3__",
    1330       213968 :                                  c_flt_eval_method (false));
    1331              : 
    1332              :   /* And decfloat.h needs this.  */
    1333       213968 :   builtin_define_with_int_value ("__DEC_EVAL_METHOD__",
    1334              :                                  TARGET_DEC_EVAL_METHOD);
    1335              : 
    1336       213968 :   builtin_define_float_constants ("FLT", "F", "%s", "F", float_type_node);
    1337              :   /* Cast the double precision constants.  This is needed when single
    1338              :      precision constants are specified or when pragma FLOAT_CONST_DECIMAL64
    1339              :      is used.  The correct result is computed by the compiler when using
    1340              :      macros that include a cast.  We use a different cast for C++ to avoid
    1341              :      problems with -Wold-style-cast.  */
    1342       213968 :   builtin_define_float_constants ("DBL", "L",
    1343       213968 :                                   (c_dialect_cxx ()
    1344              :                                    ? "double(%s)"
    1345              :                                    : "((double)%s)"),
    1346              :                                   "", double_type_node);
    1347       213968 :   builtin_define_float_constants ("LDBL", "L", "%s", "L",
    1348              :                                   long_double_type_node);
    1349              : 
    1350      1925712 :   for (int i = 0; i < NUM_FLOATN_NX_TYPES; i++)
    1351              :     {
    1352      1497776 :       if (c_dialect_cxx ()
    1353       711746 :           && cxx_dialect > cxx20
    1354       194236 :           && !floatn_nx_types[i].extended)
    1355              :         {
    1356       110992 :           char name[sizeof ("__STDCPP_FLOAT128_T__=1")];
    1357       110992 :           if (FLOATN_NX_TYPE_NODE (i) == NULL_TREE)
    1358              :             {
    1359            0 :               sprintf (name, "__STDCPP_FLOAT%d_T__", floatn_nx_types[i].n);
    1360            0 :               cpp_warn (pfile, name);
    1361            0 :               continue;
    1362              :             }
    1363       110992 :           sprintf (name, "__STDCPP_FLOAT%d_T__=1", floatn_nx_types[i].n);
    1364       110992 :           cpp_define_warn (pfile, name);
    1365       110992 :         }
    1366      1386784 :       else if (FLOATN_NX_TYPE_NODE (i) == NULL_TREE)
    1367       213968 :         continue;
    1368      1283808 :       char prefix[20], csuffix[20];
    1369      2567616 :       sprintf (prefix, "FLT%d%s", floatn_nx_types[i].n,
    1370      1283808 :                floatn_nx_types[i].extended ? "X" : "");
    1371      1283808 :       sprintf (csuffix, "F%d%s", floatn_nx_types[i].n,
    1372              :                floatn_nx_types[i].extended ? "x" : "");
    1373      1283808 :       builtin_define_float_constants (prefix, ggc_strdup (csuffix), "%s",
    1374      1283808 :                                       csuffix, FLOATN_NX_TYPE_NODE (i));
    1375              :     }
    1376       213968 :   if (bfloat16_type_node)
    1377              :     {
    1378       213968 :       if (c_dialect_cxx () && cxx_dialect > cxx20)
    1379        27748 :         cpp_define_warn (pfile, "__STDCPP_BFLOAT16_T__=1");
    1380       213968 :       builtin_define_float_constants ("BFLT16", "BF16", "%s",
    1381              :                                       "BF16", bfloat16_type_node);
    1382              :     }
    1383            0 :   else if (cxx_dialect >= cxx23)
    1384            0 :     cpp_warn (pfile, "__STDCPP_BFLOAT16_T__");
    1385              : 
    1386              :   /* For float.h.  */
    1387       213968 :   if (targetm.decimal_float_supported_p ())
    1388              :     {
    1389       213968 :       builtin_define_decimal_float_constants ("DEC32", "DF",
    1390              :                                               dfloat32_type_node);
    1391       213968 :       builtin_define_decimal_float_constants ("DEC64", "DD",
    1392              :                                               dfloat64_type_node);
    1393       213968 :       builtin_define_decimal_float_constants ("DEC128", "DL",
    1394              :                                               dfloat128_type_node);
    1395       213968 :       if (dfloat64x_type_node)
    1396       213968 :         builtin_define_decimal_float_constants ("DEC64X", "D64x",
    1397              :                                                 dfloat64x_type_node);
    1398              :     }
    1399              : 
    1400              :   /* For fixed-point fibt, ibit, max, min, and epsilon.  */
    1401       213968 :   if (!c_dialect_cxx () && targetm.fixed_point_supported_p ())
    1402              :     {
    1403            0 :       builtin_define_fixed_point_constants ("SFRACT", "HR",
    1404              :                                             short_fract_type_node);
    1405            0 :       builtin_define_fixed_point_constants ("USFRACT", "UHR",
    1406              :                                             unsigned_short_fract_type_node);
    1407            0 :       builtin_define_fixed_point_constants ("FRACT", "R",
    1408              :                                             fract_type_node);
    1409            0 :       builtin_define_fixed_point_constants ("UFRACT", "UR",
    1410              :                                             unsigned_fract_type_node);
    1411            0 :       builtin_define_fixed_point_constants ("LFRACT", "LR",
    1412              :                                             long_fract_type_node);
    1413            0 :       builtin_define_fixed_point_constants ("ULFRACT", "ULR",
    1414              :                                             unsigned_long_fract_type_node);
    1415            0 :       builtin_define_fixed_point_constants ("LLFRACT", "LLR",
    1416              :                                             long_long_fract_type_node);
    1417            0 :       builtin_define_fixed_point_constants ("ULLFRACT", "ULLR",
    1418              :                                             unsigned_long_long_fract_type_node);
    1419            0 :       builtin_define_fixed_point_constants ("SACCUM", "HK",
    1420              :                                             short_accum_type_node);
    1421            0 :       builtin_define_fixed_point_constants ("USACCUM", "UHK",
    1422              :                                             unsigned_short_accum_type_node);
    1423            0 :       builtin_define_fixed_point_constants ("ACCUM", "K",
    1424              :                                             accum_type_node);
    1425            0 :       builtin_define_fixed_point_constants ("UACCUM", "UK",
    1426              :                                             unsigned_accum_type_node);
    1427            0 :       builtin_define_fixed_point_constants ("LACCUM", "LK",
    1428              :                                             long_accum_type_node);
    1429            0 :       builtin_define_fixed_point_constants ("ULACCUM", "ULK",
    1430              :                                             unsigned_long_accum_type_node);
    1431            0 :       builtin_define_fixed_point_constants ("LLACCUM", "LLK",
    1432              :                                             long_long_accum_type_node);
    1433            0 :       builtin_define_fixed_point_constants ("ULLACCUM", "ULLK",
    1434              :                                             unsigned_long_long_accum_type_node);
    1435              : 
    1436            0 :       builtin_define_fixed_point_constants ("QQ", "", qq_type_node);
    1437            0 :       builtin_define_fixed_point_constants ("HQ", "", hq_type_node);
    1438            0 :       builtin_define_fixed_point_constants ("SQ", "", sq_type_node);
    1439            0 :       builtin_define_fixed_point_constants ("DQ", "", dq_type_node);
    1440            0 :       builtin_define_fixed_point_constants ("TQ", "", tq_type_node);
    1441            0 :       builtin_define_fixed_point_constants ("UQQ", "", uqq_type_node);
    1442            0 :       builtin_define_fixed_point_constants ("UHQ", "", uhq_type_node);
    1443            0 :       builtin_define_fixed_point_constants ("USQ", "", usq_type_node);
    1444            0 :       builtin_define_fixed_point_constants ("UDQ", "", udq_type_node);
    1445            0 :       builtin_define_fixed_point_constants ("UTQ", "", utq_type_node);
    1446            0 :       builtin_define_fixed_point_constants ("HA", "", ha_type_node);
    1447            0 :       builtin_define_fixed_point_constants ("SA", "", sa_type_node);
    1448            0 :       builtin_define_fixed_point_constants ("DA", "", da_type_node);
    1449            0 :       builtin_define_fixed_point_constants ("TA", "", ta_type_node);
    1450            0 :       builtin_define_fixed_point_constants ("UHA", "", uha_type_node);
    1451            0 :       builtin_define_fixed_point_constants ("USA", "", usa_type_node);
    1452            0 :       builtin_define_fixed_point_constants ("UDA", "", uda_type_node);
    1453            0 :       builtin_define_fixed_point_constants ("UTA", "", uta_type_node);
    1454              :     }
    1455              : 
    1456              :   /* For libgcc-internal use only.  */
    1457       213968 :   if (flag_building_libgcc)
    1458              :     {
    1459              :       /* Properties of floating-point modes for libgcc2.c.  */
    1460          984 :       opt_scalar_float_mode mode_iter;
    1461         6888 :       FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_FLOAT)
    1462              :         {
    1463         5904 :           scalar_float_mode mode = mode_iter.require ();
    1464         5904 :           const char *name = GET_MODE_NAME (mode);
    1465         5904 :           const size_t name_len = strlen (name);
    1466         5904 :           char float_h_prefix[16] = "";
    1467         5904 :           char *macro_name
    1468         5904 :             = XALLOCAVEC (char, name_len + sizeof ("__LIBGCC__MANT_DIG__"));
    1469         5904 :           sprintf (macro_name, "__LIBGCC_%s_MANT_DIG__", name);
    1470        11808 :           builtin_define_with_int_value (macro_name,
    1471         5904 :                                          REAL_MODE_FORMAT (mode)->p);
    1472         5904 :           if (!targetm.scalar_mode_supported_p (mode)
    1473         5904 :               || !targetm.libgcc_floating_mode_supported_p (mode))
    1474            0 :             continue;
    1475         5904 :           macro_name = XALLOCAVEC (char, name_len
    1476              :                                    + sizeof ("__LIBGCC_HAS__MODE__"));
    1477         5904 :           sprintf (macro_name, "__LIBGCC_HAS_%s_MODE__", name);
    1478         5904 :           cpp_define (pfile, macro_name);
    1479         5904 :           macro_name = XALLOCAVEC (char, name_len
    1480              :                                    + sizeof ("__LIBGCC__FUNC_EXT__"));
    1481         5904 :           sprintf (macro_name, "__LIBGCC_%s_FUNC_EXT__", name);
    1482         5904 :           char suffix[20] = "";
    1483         5904 :           if (mode == TYPE_MODE (double_type_node))
    1484              :             {
    1485              :               /* Empty suffix correct.  */
    1486          984 :               memcpy (float_h_prefix, "DBL", 4);
    1487              :             }
    1488         4920 :           else if (mode == TYPE_MODE (float_type_node))
    1489              :             {
    1490          984 :               suffix[0] = 'f';
    1491          984 :               memcpy (float_h_prefix, "FLT", 4);
    1492              :             }
    1493         3936 :           else if (mode == TYPE_MODE (long_double_type_node))
    1494              :             {
    1495          984 :               suffix[0] = 'l';
    1496          984 :               memcpy (float_h_prefix, "LDBL", 5);
    1497              :             }
    1498         2952 :           else if (bfloat16_type_node
    1499         2952 :                    && mode == TYPE_MODE (bfloat16_type_node))
    1500              :             {
    1501          984 :               memcpy (suffix, "bf16", 5);
    1502          984 :               memcpy (float_h_prefix, "BFLT16", 7);
    1503              :             }
    1504              :           else
    1505              :             {
    1506         4920 :               bool found_suffix = false;
    1507         4920 :               for (int i = 0; i < NUM_FLOATN_NX_TYPES; i++)
    1508         4920 :                 if (FLOATN_NX_TYPE_NODE (i) != NULL_TREE
    1509         4920 :                     && mode == TYPE_MODE (FLOATN_NX_TYPE_NODE (i)))
    1510              :                   {
    1511         3936 :                     sprintf (suffix, "f%d%s", floatn_nx_types[i].n,
    1512         1968 :                              floatn_nx_types[i].extended ? "x" : "");
    1513         1968 :                     found_suffix = true;
    1514         1968 :                     sprintf (float_h_prefix, "FLT%d%s", floatn_nx_types[i].n,
    1515              :                              floatn_nx_types[i].extended ? "X" : "");
    1516         1968 :                     break;
    1517              :                   }
    1518         1968 :               gcc_assert (found_suffix);
    1519              :             }
    1520         5904 :           builtin_define_with_value (macro_name, suffix, 0);
    1521              : 
    1522              :           /* The way __LIBGCC_*_EXCESS_PRECISION__ is used is about
    1523              :              eliminating excess precision from results assigned to
    1524              :              variables - meaning it should be about the implicit excess
    1525              :              precision only.  */
    1526         5904 :           bool excess_precision = false;
    1527         5904 :           machine_mode float16_type_mode = (float16_type_node
    1528         5904 :                                             ? TYPE_MODE (float16_type_node)
    1529         5904 :                                             : VOIDmode);
    1530         5904 :           machine_mode bfloat16_type_mode = (bfloat16_type_node
    1531         5904 :                                              ? TYPE_MODE (bfloat16_type_node)
    1532         5904 :                                              : VOIDmode);
    1533         5904 :           switch (targetm.c.excess_precision
    1534         5904 :                     (EXCESS_PRECISION_TYPE_IMPLICIT))
    1535              :             {
    1536         2898 :             case FLT_EVAL_METHOD_UNPREDICTABLE:
    1537         2898 :             case FLT_EVAL_METHOD_PROMOTE_TO_LONG_DOUBLE:
    1538         2898 :               excess_precision = (mode == float16_type_mode
    1539         2415 :                                   || mode == bfloat16_type_mode
    1540         1932 :                                   || mode == TYPE_MODE (float_type_node)
    1541         4347 :                                   || mode == TYPE_MODE (double_type_node));
    1542              :               break;
    1543              : 
    1544            0 :             case FLT_EVAL_METHOD_PROMOTE_TO_DOUBLE:
    1545            0 :               excess_precision = (mode == float16_type_mode
    1546            0 :                                   || mode == bfloat16_type_mode
    1547            0 :                                   || mode == TYPE_MODE (float_type_node));
    1548              :               break;
    1549         3006 :             case FLT_EVAL_METHOD_PROMOTE_TO_FLOAT:
    1550         3006 :               excess_precision = (mode == float16_type_mode
    1551         3006 :                                   || mode == bfloat16_type_mode);
    1552              :               break;
    1553              :             case FLT_EVAL_METHOD_PROMOTE_TO_FLOAT16:
    1554              :               excess_precision = false;
    1555              :               break;
    1556            0 :             default:
    1557            0 :               gcc_unreachable ();
    1558              :             }
    1559         5904 :           macro_name = XALLOCAVEC (char, name_len
    1560              :                                    + sizeof ("__LIBGCC__EXCESS_PRECISION__"));
    1561         5904 :           sprintf (macro_name, "__LIBGCC_%s_EXCESS_PRECISION__", name);
    1562         5904 :           builtin_define_with_int_value (macro_name, excess_precision);
    1563              : 
    1564         5904 :           char val_name[64];
    1565              : 
    1566         5904 :           macro_name = XALLOCAVEC (char, name_len
    1567              :                                    + sizeof ("__LIBGCC__EPSILON__"));
    1568         5904 :           sprintf (macro_name, "__LIBGCC_%s_EPSILON__", name);
    1569         5904 :           sprintf (val_name, "__%s_EPSILON__", float_h_prefix);
    1570         5904 :           builtin_define_with_value (macro_name, val_name, 0);
    1571              : 
    1572         5904 :           macro_name = XALLOCAVEC (char, name_len + sizeof ("__LIBGCC__MAX__"));
    1573         5904 :           sprintf (macro_name, "__LIBGCC_%s_MAX__", name);
    1574         5904 :           sprintf (val_name, "__%s_MAX__", float_h_prefix);
    1575         5904 :           builtin_define_with_value (macro_name, val_name, 0);
    1576              : 
    1577         5904 :           macro_name = XALLOCAVEC (char, name_len + sizeof ("__LIBGCC__MIN__"));
    1578         5904 :           sprintf (macro_name, "__LIBGCC_%s_MIN__", name);
    1579         5904 :           sprintf (val_name, "__%s_MIN__", float_h_prefix);
    1580         5904 :           builtin_define_with_value (macro_name, val_name, 0);
    1581              : 
    1582              : #ifdef HAVE_adddf3
    1583         5904 :           builtin_define_with_int_value ("__LIBGCC_HAVE_HWDBL__",
    1584         5904 :                                          HAVE_adddf3);
    1585              : #endif
    1586              :         }
    1587              : 
    1588              :       /* For libgcc crtstuff.c and libgcc2.c.  */
    1589          984 :       builtin_define_with_int_value ("__LIBGCC_EH_TABLES_CAN_BE_READ_ONLY__",
    1590              :                                      EH_TABLES_CAN_BE_READ_ONLY);
    1591              : #ifdef EH_FRAME_SECTION_NAME
    1592          984 :       builtin_define_with_value ("__LIBGCC_EH_FRAME_SECTION_NAME__",
    1593              :                                  EH_FRAME_SECTION_NAME, 1);
    1594              : #endif
    1595              : #ifdef CTORS_SECTION_ASM_OP
    1596              :       builtin_define_with_value ("__LIBGCC_CTORS_SECTION_ASM_OP__",
    1597              :                                  CTORS_SECTION_ASM_OP, 1);
    1598              : #endif
    1599              : #ifdef DTORS_SECTION_ASM_OP
    1600              :       builtin_define_with_value ("__LIBGCC_DTORS_SECTION_ASM_OP__",
    1601              :                                  DTORS_SECTION_ASM_OP, 1);
    1602              : #endif
    1603              : #ifdef TEXT_SECTION_ASM_OP
    1604          984 :       builtin_define_with_value ("__LIBGCC_TEXT_SECTION_ASM_OP__",
    1605              :                                  TEXT_SECTION_ASM_OP, 1);
    1606              : #endif
    1607              : #ifdef INIT_SECTION_ASM_OP
    1608              :       builtin_define_with_value ("__LIBGCC_INIT_SECTION_ASM_OP__",
    1609              :                                  INIT_SECTION_ASM_OP, 1);
    1610              : #endif
    1611              : #ifdef INIT_ARRAY_SECTION_ASM_OP
    1612              :       /* Despite the name of this target macro, the expansion is not
    1613              :          actually used, and may be empty rather than a string
    1614              :          constant.  */
    1615          984 :       cpp_define (pfile, "__LIBGCC_INIT_ARRAY_SECTION_ASM_OP__");
    1616              : #endif
    1617              : 
    1618              :       /* For libgcc enable-execute-stack.c.  */
    1619          984 :       builtin_define_with_int_value ("__LIBGCC_TRAMPOLINE_SIZE__",
    1620          984 :                                      TRAMPOLINE_SIZE);
    1621              : 
    1622              :       /* For libgcc generic-morestack.c and unwinder code.  */
    1623          984 :       if (STACK_GROWS_DOWNWARD)
    1624          984 :         cpp_define (pfile, "__LIBGCC_STACK_GROWS_DOWNWARD__");
    1625              : 
    1626              :       /* For libgcc unwinder code.  */
    1627              : #ifdef DONT_USE_BUILTIN_SETJMP
    1628              :       cpp_define (pfile, "__LIBGCC_DONT_USE_BUILTIN_SETJMP__");
    1629              : #endif
    1630              : #ifdef DWARF_ALT_FRAME_RETURN_COLUMN
    1631              :       builtin_define_with_int_value ("__LIBGCC_DWARF_ALT_FRAME_RETURN_COLUMN__",
    1632              :                                      DWARF_ALT_FRAME_RETURN_COLUMN);
    1633              : #endif
    1634          984 :       builtin_define_with_int_value ("__LIBGCC_DWARF_FRAME_REGISTERS__",
    1635              :                                      DWARF_FRAME_REGISTERS);
    1636          984 :       builtin_define_with_int_value ("__LIBGCC_DWARF_CIE_DATA_ALIGNMENT__",
    1637          984 :                                      DWARF_CIE_DATA_ALIGNMENT);
    1638              : 
    1639              : #ifdef EH_RETURN_STACKADJ_RTX
    1640          984 :       cpp_define (pfile, "__LIBGCC_EH_RETURN_STACKADJ_RTX__");
    1641              : #endif
    1642              : #ifdef JMP_BUF_SIZE
    1643              :       builtin_define_with_int_value ("__LIBGCC_JMP_BUF_SIZE__",
    1644              :                                      JMP_BUF_SIZE);
    1645              : #endif
    1646          984 :       builtin_define_with_int_value ("__LIBGCC_STACK_POINTER_REGNUM__",
    1647              :                                      STACK_POINTER_REGNUM);
    1648              : 
    1649              :       /* For libgcov.  */
    1650          984 :       builtin_define_with_int_value ("__LIBGCC_VTABLE_USES_DESCRIPTORS__",
    1651              :                                      TARGET_VTABLE_USES_DESCRIPTORS);
    1652          984 :       builtin_define_with_int_value ("__LIBGCC_HAVE_LIBATOMIC",
    1653          984 :                                      targetm.have_libatomic);
    1654              :     }
    1655              : 
    1656              :   /* For use in assembly language.  */
    1657       213968 :   builtin_define_with_value ("__REGISTER_PREFIX__", REGISTER_PREFIX, 0);
    1658       213968 :   builtin_define_with_value ("__USER_LABEL_PREFIX__", user_label_prefix, 0);
    1659              : 
    1660              :   /* Misc.  */
    1661       213968 :   if (flag_gnu89_inline)
    1662        21706 :     cpp_define (pfile, "__GNUC_GNU_INLINE__");
    1663              :   else
    1664       192262 :     cpp_define (pfile, "__GNUC_STDC_INLINE__");
    1665              : 
    1666       213968 :   if (flag_no_inline)
    1667        97443 :     cpp_define (pfile, "__NO_INLINE__");
    1668              : 
    1669       213968 :   if (flag_iso)
    1670        60492 :     cpp_define (pfile, "__STRICT_ANSI__");
    1671              : 
    1672       213968 :   if (!flag_signed_char)
    1673           26 :     cpp_define (pfile, "__CHAR_UNSIGNED__");
    1674              : 
    1675       213968 :   if (c_dialect_cxx () && TYPE_UNSIGNED (wchar_type_node))
    1676            7 :     cpp_define (pfile, "__WCHAR_UNSIGNED__");
    1677              : 
    1678       213968 :   cpp_atomic_builtins (pfile);
    1679              : 
    1680              :   /* Show support for __builtin_speculation_safe_value () if the target
    1681              :      has been updated to fully support it.  */
    1682       213968 :   if (targetm.have_speculation_safe_value (false))
    1683       213968 :     cpp_define (pfile, "__HAVE_SPECULATION_SAFE_VALUE");
    1684              : 
    1685              : #ifdef DWARF2_UNWIND_INFO
    1686       213968 :   if (dwarf2out_do_cfi_asm ())
    1687       213926 :     cpp_define (pfile, "__GCC_HAVE_DWARF2_CFI_ASM");
    1688              : #endif
    1689              : 
    1690              :   /* Make the choice of ObjC runtime visible to source code.  */
    1691       213968 :   if (c_dialect_objc () && flag_next_runtime)
    1692            0 :     cpp_define (pfile, "__NEXT_RUNTIME__");
    1693              : 
    1694              :   /* Show the availability of some target pragmas.  */
    1695       213968 :   cpp_define (pfile, "__PRAGMA_REDEFINE_EXTNAME");
    1696              : 
    1697              :   /* Make the choice of the stack protector runtime visible to source code.
    1698              :      The macro names and values here were chosen for compatibility with an
    1699              :      earlier implementation, i.e. ProPolice.  */
    1700       213968 :   if (flag_stack_protect == SPCT_FLAG_EXPLICIT)
    1701            7 :     cpp_define (pfile, "__SSP_EXPLICIT__=4");
    1702       213968 :   if (flag_stack_protect == SPCT_FLAG_STRONG)
    1703          184 :     cpp_define (pfile, "__SSP_STRONG__=3");
    1704       213968 :   if (flag_stack_protect == SPCT_FLAG_ALL)
    1705           40 :     cpp_define (pfile, "__SSP_ALL__=2");
    1706       213928 :   else if (flag_stack_protect == SPCT_FLAG_DEFAULT)
    1707           68 :     cpp_define (pfile, "__SSP__=1");
    1708              : 
    1709       213968 :   if (flag_openacc)
    1710         1679 :     cpp_define (pfile, "_OPENACC=201711");
    1711              : 
    1712       213968 :   if (flag_openmp)
    1713         6572 :     cpp_define (pfile, "_OPENMP=202111");
    1714              : 
    1715       427936 :   for (i = 0; i < NUM_INT_N_ENTS; i ++)
    1716       213968 :     if (int_n_enabled_p[i])
    1717              :       {
    1718       208615 :         char buf[15+20];
    1719       208615 :         sprintf(buf, "__SIZEOF_INT%d__", int_n_data[i].bitsize);
    1720       208615 :         builtin_define_type_sizeof (buf,
    1721              :                                     int_n_trees[i].signed_type);
    1722              :       }
    1723       213968 :   builtin_define_type_sizeof ("__SIZEOF_WCHAR_T__", wchar_type_node);
    1724       213968 :   builtin_define_type_sizeof ("__SIZEOF_WINT_T__", wint_type_node);
    1725       213968 :   builtin_define_type_sizeof ("__SIZEOF_PTRDIFF_T__",
    1726              :                               unsigned_ptrdiff_type_node);
    1727              : 
    1728              :   /* A straightforward target hook doesn't work, because of problems
    1729              :      linking that hook's body when part of non-C front ends.  */
    1730              : # define preprocessing_asm_p() (cpp_get_options (pfile)->lang == CLK_ASM)
    1731              : # define preprocessing_trad_p() (cpp_get_options (pfile)->traditional)
    1732              : # define builtin_define(TXT) cpp_define (pfile, TXT)
    1733              : # define builtin_assert(TXT) cpp_assert (pfile, TXT)
    1734       213968 :   TARGET_CPU_CPP_BUILTINS ();
    1735       213968 :   TARGET_OS_CPP_BUILTINS ();
    1736       213968 :   TARGET_OBJFMT_CPP_BUILTINS ();
    1737              : 
    1738              :   /* Support the __declspec keyword by turning them into attributes.
    1739              :      Note that the current way we do this may result in a collision
    1740              :      with predefined attributes later on.  This can be solved by using
    1741              :      one attribute, say __declspec__, and passing args to it.  The
    1742              :      problem with that approach is that args are not accumulated: each
    1743              :      new appearance would clobber any existing args.  */
    1744       213968 :   if (TARGET_DECLSPEC)
    1745              :     builtin_define ("__declspec(x)=__attribute__((x))");
    1746              : 
    1747              :   /* If decimal floating point is supported, tell the user if the
    1748              :      alternate format (BID) is used instead of the standard (DPD)
    1749              :      format.  */
    1750       213968 :   if (ENABLE_DECIMAL_FLOAT && ENABLE_DECIMAL_BID_FORMAT)
    1751       213968 :     cpp_define (pfile, "__DECIMAL_BID_FORMAT__");
    1752              : }
    1753              : 
    1754              : /* Given NAME, return the command-line option that would make it be
    1755              :    a builtin define, or 0 if unrecognized.  */
    1756              : 
    1757              : diagnostics::option_id
    1758         3681 : get_option_for_builtin_define (const char *name)
    1759              : {
    1760         3681 :   if (!strcmp (name, "_OPENACC"))
    1761            4 :     return OPT_fopenacc;
    1762         3677 :   if (!strcmp (name, "_OPENMP"))
    1763            4 :     return OPT_fopenmp;
    1764         3673 :   return 0;
    1765              : }
    1766              : 
    1767              : /* Pass an object-like macro.  If it doesn't lie in the user's
    1768              :    namespace, defines it unconditionally.  Otherwise define a version
    1769              :    with two leading underscores, and another version with two leading
    1770              :    and trailing underscores, and define the original only if an ISO
    1771              :    standard was not nominated.
    1772              : 
    1773              :    e.g. passing "unix" defines "__unix", "__unix__" and possibly
    1774              :    "unix".  Passing "_mips" defines "__mips", "__mips__" and possibly
    1775              :    "_mips".  */
    1776              : void
    1777       433289 : builtin_define_std (const char *macro)
    1778              : {
    1779       433289 :   size_t len = strlen (macro);
    1780       433289 :   char *buff = (char *) alloca (len + 5);
    1781       433289 :   char *p = buff + 2;
    1782       433289 :   char *q = p + len;
    1783              : 
    1784              :   /* prepend __ (or maybe just _) if in user's namespace.  */
    1785       433289 :   memcpy (p, macro, len + 1);
    1786       433289 :   if (!( *p == '_' && (p[1] == '_' || ISUPPER (p[1]))))
    1787              :     {
    1788       433289 :       if (*p != '_')
    1789       433289 :         *--p = '_';
    1790       433289 :       if (p[1] != '_')
    1791       433289 :         *--p = '_';
    1792              :     }
    1793       433289 :   cpp_define (parse_in, p);
    1794              : 
    1795              :   /* If it was in user's namespace...  */
    1796       433289 :   if (p != buff + 2)
    1797              :     {
    1798              :       /* Define the macro with leading and following __.  */
    1799       433289 :       if (q[-1] != '_')
    1800       433289 :         *q++ = '_';
    1801       433289 :       if (q[-2] != '_')
    1802       433289 :         *q++ = '_';
    1803       433289 :       *q = '\0';
    1804       433289 :       cpp_define (parse_in, p);
    1805              : 
    1806              :       /* Finally, define the original macro if permitted.  */
    1807       433289 :       if (!flag_iso)
    1808       312255 :         cpp_define (parse_in, macro);
    1809              :     }
    1810       433289 : }
    1811              : 
    1812              : /* Pass an object-like macro and a value to define it to.  The third
    1813              :    parameter says whether or not to turn the value into a string
    1814              :    constant.  */
    1815              : void
    1816     19244265 : builtin_define_with_value (const char *macro, const char *expansion, int is_str)
    1817              : {
    1818     19244265 :   char *buf;
    1819     19244265 :   size_t mlen = strlen (macro);
    1820     19244265 :   size_t elen = strlen (expansion);
    1821     19244265 :   size_t extra = 2;  /* space for an = and a NUL */
    1822              : 
    1823     19244265 :   if (is_str)
    1824              :     {
    1825       429904 :       char *quoted_expansion = (char *) alloca (elen * 4 + 1);
    1826       429904 :       const char *p;
    1827       429904 :       char *q;
    1828       429904 :       extra += 2;  /* space for two quote marks */
    1829      3226509 :       for (p = expansion, q = quoted_expansion; *p; p++)
    1830              :         {
    1831      2796605 :           switch (*p)
    1832              :             {
    1833            0 :             case '\n':
    1834            0 :               *q++ = '\\';
    1835            0 :               *q++ = 'n';
    1836            0 :               break;
    1837              : 
    1838          984 :             case '\t':
    1839          984 :               *q++ = '\\';
    1840          984 :               *q++ = 't';
    1841          984 :               break;
    1842              : 
    1843            0 :             case '\\':
    1844            0 :               *q++ = '\\';
    1845            0 :               *q++ = '\\';
    1846            0 :               break;
    1847              : 
    1848            0 :             case '"':
    1849            0 :               *q++ = '\\';
    1850            0 :               *q++ = '"';
    1851            0 :               break;
    1852              : 
    1853      2795621 :             default:
    1854      2795621 :               if (ISPRINT ((unsigned char) *p))
    1855      2795621 :                 *q++ = *p;
    1856              :               else
    1857              :                 {
    1858            0 :                   sprintf (q, "\\%03o", (unsigned char) *p);
    1859            0 :                   q += 4;
    1860              :                 }
    1861              :             }
    1862              :         }
    1863       429904 :       *q = '\0';
    1864       429904 :       expansion = quoted_expansion;
    1865       429904 :       elen = q - expansion;
    1866              :     }
    1867              : 
    1868     19244265 :   buf = (char *) alloca (mlen + elen + extra);
    1869     19244265 :   if (is_str)
    1870       429904 :     sprintf (buf, "%s=\"%s\"", macro, expansion);
    1871              :   else
    1872     18814361 :     sprintf (buf, "%s=%s", macro, expansion);
    1873              : 
    1874     19244265 :   cpp_define (parse_in, buf);
    1875     19244265 : }
    1876              : 
    1877              : 
    1878              : /* Pass an object-like macro and an integer value to define it to.  */
    1879              : void
    1880     28678608 : builtin_define_with_int_value (const char *macro, HOST_WIDE_INT value)
    1881              : {
    1882     28678608 :   char *buf;
    1883     28678608 :   size_t mlen = strlen (macro);
    1884     28678608 :   size_t vlen = 18;
    1885     28678608 :   size_t extra = 2; /* space for = and NUL.  */
    1886              : 
    1887     28678608 :   buf = (char *) alloca (mlen + vlen + extra);
    1888     28678608 :   memcpy (buf, macro, mlen);
    1889     28678608 :   buf[mlen] = '=';
    1890     28678608 :   sprintf (buf + mlen + 1, HOST_WIDE_INT_PRINT_DEC, value);
    1891              : 
    1892     28678608 :   cpp_define (parse_in, buf);
    1893     28678608 : }
    1894              : 
    1895              : /* builtin_define_with_hex_fp_value is very expensive, so the following
    1896              :    array and function allows it to be done lazily when __DBL_MAX__
    1897              :    etc. is first used.  */
    1898              : 
    1899              : struct GTY(()) lazy_hex_fp_value_struct
    1900              : {
    1901              :   const char *hex_str;
    1902              :   machine_mode mode;
    1903              :   int digits;
    1904              :   const char *fp_suffix;
    1905              : };
    1906              : /* Number of the expensive to compute macros we should evaluate lazily.
    1907              :    Each builtin_define_float_constants invocation calls
    1908              :    builtin_define_with_hex_fp_value 5 times and builtin_define_float_constants
    1909              :    is called for FLT, DBL, LDBL and up to NUM_FLOATN_NX_TYPES times for
    1910              :    FLTNN*.  */
    1911              : #define LAZY_HEX_FP_VALUES_CNT (5 * (3 + NUM_FLOATN_NX_TYPES))
    1912              : static GTY(()) struct lazy_hex_fp_value_struct
    1913              :   lazy_hex_fp_values[LAZY_HEX_FP_VALUES_CNT];
    1914              : static GTY(()) unsigned lazy_hex_fp_value_count;
    1915              : 
    1916              : static void
    1917       381699 : lazy_hex_fp_value (cpp_reader *, cpp_macro *macro, unsigned num)
    1918              : {
    1919       381699 :   REAL_VALUE_TYPE real;
    1920       381699 :   char dec_str[64], buf1[256];
    1921              : 
    1922       381699 :   gcc_checking_assert (num < lazy_hex_fp_value_count);
    1923              : 
    1924       381699 :   real_from_string (&real, lazy_hex_fp_values[num].hex_str);
    1925       381699 :   real_to_decimal_for_mode (dec_str, &real, sizeof (dec_str),
    1926       381699 :                             lazy_hex_fp_values[num].digits, 0,
    1927              :                             lazy_hex_fp_values[num].mode);
    1928              : 
    1929       381699 :   size_t len
    1930       381699 :     = sprintf (buf1, "%s%s", dec_str, lazy_hex_fp_values[num].fp_suffix);
    1931       381699 :   gcc_assert (len < sizeof (buf1));
    1932       504053 :   for (unsigned idx = 0; idx < macro->count; idx++)
    1933       504053 :     if (macro->exp.tokens[idx].type == CPP_NUMBER)
    1934              :       {
    1935       381699 :         macro->exp.tokens[idx].val.str.len = len;
    1936       381699 :         macro->exp.tokens[idx].val.str.text
    1937       381699 :           = (const unsigned char *) ggc_strdup (buf1);
    1938       381699 :         return;
    1939              :       }
    1940              : 
    1941              :   /* We must have replaced a token.  */
    1942            0 :   gcc_unreachable ();
    1943              : }
    1944              : 
    1945              : /* Pass an object-like macro a hexadecimal floating-point value.  */
    1946              : static void
    1947     10698400 : builtin_define_with_hex_fp_value (const char *macro,
    1948              :                                   tree type, int digits,
    1949              :                                   const char *hex_str,
    1950              :                                   const char *fp_suffix,
    1951              :                                   const char *fp_cast)
    1952              : {
    1953     10698400 :   REAL_VALUE_TYPE real;
    1954     10698400 :   char dec_str[64], buf[256], buf1[128], buf2[64];
    1955              : 
    1956              :   /* This is very expensive, so if possible expand them lazily.  */
    1957     10698400 :   if (lazy_hex_fp_value_count < LAZY_HEX_FP_VALUES_CNT
    1958     10698400 :       && flag_dump_macros == 0
    1959     10652850 :       && flag_dump_go_spec == NULL
    1960     10652650 :       && !cpp_get_options (parse_in)->traditional)
    1961              :     {
    1962     10506500 :       if (lazy_hex_fp_value_count == 0)
    1963       210130 :         cpp_get_callbacks (parse_in)->user_lazy_macro = lazy_hex_fp_value;
    1964     10506500 :       sprintf (buf2, fp_cast, "1.1");
    1965     10506500 :       sprintf (buf1, "%s=%s", macro, buf2);
    1966     10506500 :       cpp_define (parse_in, buf1);
    1967     10506500 :       struct cpp_hashnode *node = C_CPP_HASHNODE (get_identifier (macro));
    1968     10506500 :       lazy_hex_fp_values[lazy_hex_fp_value_count].hex_str
    1969     10506500 :         = ggc_strdup (hex_str);
    1970     10506500 :       lazy_hex_fp_values[lazy_hex_fp_value_count].mode = TYPE_MODE (type);
    1971     10506500 :       lazy_hex_fp_values[lazy_hex_fp_value_count].digits = digits;
    1972     10506500 :       lazy_hex_fp_values[lazy_hex_fp_value_count].fp_suffix = fp_suffix;
    1973     10506500 :       cpp_define_lazily (parse_in, node, lazy_hex_fp_value_count++);
    1974     10506500 :       return;
    1975              :     }
    1976              : 
    1977              :   /* Hex values are really cool and convenient, except that they're
    1978              :      not supported in strict ISO C90 mode.  First, the "p-" sequence
    1979              :      is not valid as part of a preprocessor number.  Second, we get a
    1980              :      pedwarn from the preprocessor, which has no context, so we can't
    1981              :      suppress the warning with __extension__.
    1982              : 
    1983              :      So instead what we do is construct the number in hex (because
    1984              :      it's easy to get the exact correct value), parse it as a real,
    1985              :      then print it back out as decimal.  */
    1986              : 
    1987       191900 :   real_from_string (&real, hex_str);
    1988       191900 :   real_to_decimal_for_mode (dec_str, &real, sizeof (dec_str), digits, 0,
    1989       191900 :                             TYPE_MODE (type));
    1990              : 
    1991              :   /* Assemble the macro in the following fashion
    1992              :      macro = fp_cast [dec_str fp_suffix] */
    1993       191900 :   sprintf (buf2, "%s%s", dec_str, fp_suffix);
    1994       191900 :   sprintf (buf1, fp_cast, buf2);
    1995       191900 :   sprintf (buf, "%s=%s", macro, buf1);
    1996              : 
    1997       191900 :   cpp_define (parse_in, buf);
    1998              : }
    1999              : 
    2000              : /* Return a string constant for the suffix for a value of type TYPE
    2001              :    promoted according to the integer promotions.  The type must be one
    2002              :    of the standard integer type nodes.  */
    2003              : 
    2004              : static const char *
    2005     10270464 : type_suffix (tree type)
    2006              : {
    2007     10270464 :   static const char *const suffixes[] = { "", "U", "L", "UL", "LL", "ULL" };
    2008     10270464 :   int unsigned_suffix;
    2009     10270464 :   int is_long;
    2010     10270464 :   int tp = TYPE_PRECISION (type);
    2011              : 
    2012     10270464 :   if (type == long_long_integer_type_node
    2013     10023814 :       || type == long_long_unsigned_type_node
    2014     20261596 :       || tp > TYPE_PRECISION (long_integer_type_node))
    2015              :     is_long = 2;
    2016      9991132 :   else if (type == long_integer_type_node
    2017      7686507 :            || type == long_unsigned_type_node
    2018     15592429 :            || tp > TYPE_PRECISION (integer_type_node))
    2019              :     is_long = 1;
    2020      5601297 :   else if (type == integer_type_node
    2021      4301161 :            || type == unsigned_type_node
    2022      3423501 :            || type == short_integer_type_node
    2023      2567629 :            || type == short_unsigned_type_node
    2024      1925712 :            || type == signed_char_type_node
    2025       855872 :            || type == unsigned_char_type_node
    2026              :            /* ??? "char" is not a signed or unsigned integer type and
    2027              :               so is not permitted for the standard typedefs, but some
    2028              :               systems use it anyway.  */
    2029            0 :            || type == char_type_node)
    2030              :     is_long = 0;
    2031            0 :   else if (type == wchar_type_node)
    2032            0 :     return type_suffix (underlying_wchar_type_node);
    2033              :   else
    2034            0 :     gcc_unreachable ();
    2035              : 
    2036     10270464 :   unsigned_suffix = TYPE_UNSIGNED (type);
    2037     10270464 :   if (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))
    2038      3423501 :     unsigned_suffix = 0;
    2039     10270464 :   return suffixes[is_long * 2 + unsigned_suffix];
    2040              : }
    2041              : 
    2042              : /* Define MACRO as a <stdint.h> constant-suffix macro for TYPE.  */
    2043              : static void
    2044      2139680 : builtin_define_constants (const char *macro, tree type)
    2045              : {
    2046      2139680 :   const char *suffix;
    2047      2139680 :   char *buf;
    2048              : 
    2049      2139680 :   suffix = type_suffix (type);
    2050              : 
    2051      2139680 :   if (suffix[0] == 0)
    2052              :     {
    2053      1069840 :       buf = (char *) alloca (strlen (macro) + 6);
    2054      1069840 :       sprintf (buf, "%s(c)=c", macro);
    2055              :     }
    2056              :   else
    2057              :     {
    2058      1069840 :       buf = (char *) alloca (strlen (macro) + 9 + strlen (suffix) + 1);
    2059      1069840 :       sprintf (buf, "%s(c)=c ## %s", macro, suffix);
    2060              :     }
    2061              : 
    2062      2139680 :   cpp_define (parse_in, buf);
    2063      2139680 : }
    2064              : 
    2065              : /* Define MAX for TYPE based on the precision of the type.  */
    2066              : 
    2067              : static void
    2068      7488880 : builtin_define_type_max (const char *macro, tree type)
    2069              : {
    2070      6419040 :   builtin_define_type_minmax (NULL, macro, type);
    2071            0 : }
    2072              : 
    2073              : /* Given a value with COUNT LSBs set, fill BUF with a hexadecimal
    2074              :    representation of that value.  For example, a COUNT of 10 would
    2075              :    return "0x3ff".  */
    2076              : 
    2077              : static void
    2078      8130784 : print_bits_of_hex (char *buf, int bufsz, int count)
    2079              : {
    2080      8130784 :   gcc_assert (bufsz > 3);
    2081      8130784 :   *buf++ = '0';
    2082      8130784 :   *buf++ = 'x';
    2083      8130784 :   bufsz -= 2;
    2084              : 
    2085      8130784 :   gcc_assert (count > 0);
    2086              : 
    2087      8130784 :   switch (count % 4) {
    2088              :   case 0:
    2089              :     break;
    2090            0 :   case 1:
    2091            0 :     *buf++ = '1';
    2092            0 :     bufsz --;
    2093            0 :     count -= 1;
    2094            0 :     break;
    2095            0 :   case 2:
    2096            0 :     *buf++ = '3';
    2097            0 :     bufsz --;
    2098            0 :     count -= 2;
    2099            0 :     break;
    2100      4707283 :   case 3:
    2101      4707283 :     *buf++ = '7';
    2102      4707283 :     bufsz --;
    2103      4707283 :     count -= 3;
    2104      4707283 :     break;
    2105              :   }
    2106     85622913 :   while (count >= 4)
    2107              :     {
    2108     77492129 :       gcc_assert (bufsz > 1);
    2109     77492129 :       *buf++ = 'f';
    2110     77492129 :       bufsz --;
    2111     77492129 :       count -= 4;
    2112              :     }
    2113      8130784 :   gcc_assert (bufsz > 0);
    2114      8130784 :   *buf++ = 0;
    2115      8130784 : }
    2116              : 
    2117              : /* Define MIN_MACRO (if not NULL) and MAX_MACRO for TYPE based on the
    2118              :    precision of the type.  */
    2119              : 
    2120              : static void
    2121      8130784 : builtin_define_type_minmax (const char *min_macro, const char *max_macro,
    2122              :                             tree type)
    2123              : {
    2124              : #define PBOH_SZ (MAX_BITSIZE_MODE_ANY_INT/4+4)
    2125      8130784 :   char value[PBOH_SZ];
    2126              : 
    2127      8130784 :   const char *suffix;
    2128      8130784 :   char *buf;
    2129      8130784 :   int bits;
    2130              : 
    2131      8130784 :   bits = TYPE_PRECISION (type) + (TYPE_UNSIGNED (type) ? 0 : -1);
    2132              : 
    2133      8130784 :   print_bits_of_hex (value, PBOH_SZ, bits);
    2134              : 
    2135      8130784 :   suffix = type_suffix (type);
    2136              : 
    2137      8130784 :   buf = (char *) alloca (strlen (max_macro) + 1 + strlen (value)
    2138              :                          + strlen (suffix) + 1);
    2139      8130784 :   sprintf (buf, "%s=%s%s", max_macro, value, suffix);
    2140              : 
    2141      8130784 :   cpp_define (parse_in, buf);
    2142              : 
    2143      8130784 :   if (min_macro)
    2144              :     {
    2145       641904 :       if (TYPE_UNSIGNED (type))
    2146              :         {
    2147       213981 :           buf = (char *) alloca (strlen (min_macro) + 2 + strlen (suffix) + 1);
    2148       213981 :           sprintf (buf, "%s=0%s", min_macro, suffix);
    2149              :         }
    2150              :       else
    2151              :         {
    2152       427923 :           buf = (char *) alloca (strlen (min_macro) + 3
    2153              :                                  + strlen (max_macro) + 6);
    2154       427923 :           sprintf (buf, "%s=(-%s - 1)", min_macro, max_macro);
    2155              :         }
    2156       641904 :       cpp_define (parse_in, buf);
    2157              :     }
    2158      8130784 : }
    2159              : 
    2160              : /* Define WIDTH_MACRO for the width of TYPE.  If TYPE2 is not NULL,
    2161              :    both types must have the same width.  */
    2162              : 
    2163              : static void
    2164      4279360 : builtin_define_type_width (const char *width_macro, tree type, tree type2)
    2165              : {
    2166      4279360 :   if (type2 != NULL_TREE)
    2167      3209520 :     gcc_assert (TYPE_PRECISION (type) == TYPE_PRECISION (type2));
    2168      4279360 :   builtin_define_with_int_value (width_macro, TYPE_PRECISION (type));
    2169      4279360 : }
    2170              : 
    2171              : #include "gt-c-family-c-cppbuiltin.h"
        

Generated by: LCOV version 2.5.0-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.