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 % 1057 943
Test Date: 2024-11-30 13:30:02 Functions: 87.5 % 24 21
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

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

Generated by: LCOV version 2.1-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.