LCOV - code coverage report
Current view: top level - gcc/c-family - c-opts.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 88.9 % 1041 925
Test Date: 2024-12-21 13:15:12 Functions: 91.9 % 37 34
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* C/ObjC/C++ command line option handling.
       2                 :             :    Copyright (C) 2002-2024 Free Software Foundation, Inc.
       3                 :             :    Contributed by Neil Booth.
       4                 :             : 
       5                 :             : This file is part of GCC.
       6                 :             : 
       7                 :             : GCC is free software; you can redistribute it and/or modify it under
       8                 :             : the terms of the GNU General Public License as published by the Free
       9                 :             : Software Foundation; either version 3, or (at your option) any later
      10                 :             : version.
      11                 :             : 
      12                 :             : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      13                 :             : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      14                 :             : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      15                 :             : for more details.
      16                 :             : 
      17                 :             : You should have received a copy of the GNU General Public License
      18                 :             : along with GCC; see the file COPYING3.  If not see
      19                 :             : <http://www.gnu.org/licenses/>.  */
      20                 :             : 
      21                 :             : #include "config.h"
      22                 :             : #include "system.h"
      23                 :             : #include "coretypes.h"
      24                 :             : #include "tm.h"
      25                 :             : #include "target.h"
      26                 :             : #include "c-target.h"
      27                 :             : #include "c-common.h"
      28                 :             : #include "memmodel.h"
      29                 :             : #include "tm_p.h"             /* For C_COMMON_OVERRIDE_OPTIONS.  */
      30                 :             : #include "diagnostic.h"
      31                 :             : #include "c-pragma.h"
      32                 :             : #include "flags.h"
      33                 :             : #include "toplev.h"
      34                 :             : #include "langhooks.h"
      35                 :             : #include "diagnostic-macro-unwinding.h" /* for virt_loc_aware_diagnostic_finalizer */
      36                 :             : #include "intl.h"
      37                 :             : #include "cppdefault.h"
      38                 :             : #include "incpath.h"
      39                 :             : #include "debug.h"            /* For debug_hooks.  */
      40                 :             : #include "opts.h"
      41                 :             : #include "plugin.h"           /* For PLUGIN_INCLUDE_FILE event.  */
      42                 :             : #include "mkdeps.h"
      43                 :             : #include "dumpfile.h"
      44                 :             : #include "file-prefix-map.h"    /* add_*_prefix_map()  */
      45                 :             : #include "context.h"
      46                 :             : #include "diagnostic-format-text.h"
      47                 :             : 
      48                 :             : #ifndef DOLLARS_IN_IDENTIFIERS
      49                 :             : # define DOLLARS_IN_IDENTIFIERS true
      50                 :             : #endif
      51                 :             : 
      52                 :             : #ifndef TARGET_SYSTEM_ROOT
      53                 :             : # define TARGET_SYSTEM_ROOT NULL
      54                 :             : #endif
      55                 :             : 
      56                 :             : #ifndef TARGET_OPTF
      57                 :             : #define TARGET_OPTF(ARG)
      58                 :             : #endif
      59                 :             : 
      60                 :             : /* CPP's options.  */
      61                 :             : cpp_options *cpp_opts;
      62                 :             : 
      63                 :             : /* Input filename.  */
      64                 :             : static const char *this_input_filename;
      65                 :             : 
      66                 :             : /* Filename and stream for preprocessed output.  */
      67                 :             : static const char *out_fname;
      68                 :             : static FILE *out_stream;
      69                 :             : 
      70                 :             : /* Append dependencies to deps_file.  */
      71                 :             : static bool deps_append;
      72                 :             : 
      73                 :             : /* If dependency switches (-MF etc.) have been given.  */
      74                 :             : static bool deps_seen;
      75                 :             : 
      76                 :             : /* If -v seen.  */
      77                 :             : static bool verbose;
      78                 :             : 
      79                 :             : /* Dependency output file.  */
      80                 :             : static const char *deps_file;
      81                 :             : 
      82                 :             : /* Structured dependency output file.  */
      83                 :             : static const char *fdeps_file;
      84                 :             : 
      85                 :             : /* The prefix given by -iprefix, if any.  */
      86                 :             : static const char *iprefix;
      87                 :             : 
      88                 :             : /* The multilib directory given by -imultilib, if any.  */
      89                 :             : static const char *imultilib;
      90                 :             : 
      91                 :             : /* The system root, if any.  Overridden by -isysroot.  */
      92                 :             : static const char *sysroot = TARGET_SYSTEM_ROOT;
      93                 :             : 
      94                 :             : /* Zero disables all standard directories for headers.  */
      95                 :             : static bool std_inc = true;
      96                 :             : 
      97                 :             : /* Zero disables the C++-specific standard directories for headers.  */
      98                 :             : static bool std_cxx_inc = true;
      99                 :             : 
     100                 :             : /* If the quote chain has been split by -I-.  */
     101                 :             : static bool quote_chain_split;
     102                 :             : 
     103                 :             : /* Number of deferred options.  */
     104                 :             : static size_t deferred_count;
     105                 :             : 
     106                 :             : /* Number of deferred options scanned for -include.  */
     107                 :             : static size_t include_cursor;
     108                 :             : 
     109                 :             : /* Whether any standard preincluded header has been preincluded.  */
     110                 :             : static bool done_preinclude;
     111                 :             : 
     112                 :             : static void handle_OPT_d (const char *);
     113                 :             : static void set_std_cxx98 (int);
     114                 :             : static void set_std_cxx11 (int);
     115                 :             : static void set_std_cxx14 (int);
     116                 :             : static void set_std_cxx17 (int);
     117                 :             : static void set_std_cxx20 (int);
     118                 :             : static void set_std_cxx23 (int);
     119                 :             : static void set_std_cxx26 (int);
     120                 :             : static void set_std_c89 (int, int);
     121                 :             : static void set_std_c99 (int);
     122                 :             : static void set_std_c11 (int);
     123                 :             : static void set_std_c17 (int);
     124                 :             : static void set_std_c23 (int);
     125                 :             : static void set_std_c2y (int);
     126                 :             : static void check_deps_environment_vars (void);
     127                 :             : static void handle_deferred_opts (void);
     128                 :             : static void sanitize_cpp_opts (void);
     129                 :             : static void add_prefixed_path (const char *, incpath_kind);
     130                 :             : static void push_command_line_include (void);
     131                 :             : static void cb_file_change (cpp_reader *, const line_map_ordinary *);
     132                 :             : static void cb_dir_change (cpp_reader *, const char *);
     133                 :             : static void c_finish_options (void);
     134                 :             : 
     135                 :             : #ifndef STDC_0_IN_SYSTEM_HEADERS
     136                 :             : #define STDC_0_IN_SYSTEM_HEADERS 0
     137                 :             : #endif
     138                 :             : 
     139                 :             : /* Holds switches parsed by c_common_handle_option (), but whose
     140                 :             :    handling is deferred to c_common_post_options ().  */
     141                 :             : static void defer_opt (enum opt_code, const char *);
     142                 :             : static struct deferred_opt
     143                 :             : {
     144                 :             :   enum opt_code code;
     145                 :             :   const char *arg;
     146                 :             : } *deferred_opts;
     147                 :             : 
     148                 :             : 
     149                 :             : extern const unsigned int
     150                 :             : c_family_lang_mask = (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX);
     151                 :             : 
     152                 :             : /* Defer option CODE with argument ARG.  */
     153                 :             : static void
     154                 :      173335 : defer_opt (enum opt_code code, const char *arg)
     155                 :             : {
     156                 :      173335 :   deferred_opts[deferred_count].code = code;
     157                 :      173335 :   deferred_opts[deferred_count].arg = arg;
     158                 :      173335 :   deferred_count++;
     159                 :      173335 : }
     160                 :             : 
     161                 :             : /* Return language mask for option parsing.  */
     162                 :             : unsigned int
     163                 :     4996084 : c_common_option_lang_mask (void)
     164                 :             : {
     165                 :     4996084 :   static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
     166                 :             : 
     167                 :     4996084 :   return lang_flags[c_language];
     168                 :             : }
     169                 :             : 
     170                 :             : /* Diagnostic finalizer for C/C++/Objective-C/Objective-C++.  */
     171                 :             : static void
     172                 :      291747 : c_diagnostic_text_finalizer (diagnostic_text_output_format &text_output,
     173                 :             :                              const diagnostic_info *diagnostic,
     174                 :             :                              diagnostic_t)
     175                 :             : {
     176                 :      291747 :   pretty_printer *const pp = text_output.get_printer ();
     177                 :      291747 :   char *saved_prefix = pp_take_prefix (pp);
     178                 :      291747 :   pp_set_prefix (pp, text_output.build_indent_prefix (false));
     179                 :      291747 :   pp_newline (pp);
     180                 :      291747 :   diagnostic_show_locus (&text_output.get_context (),
     181                 :      291747 :                          text_output.get_source_printing_options (),
     182                 :      291747 :                          diagnostic->richloc, diagnostic->kind, pp);
     183                 :             :   /* By default print macro expansion contexts in the diagnostic
     184                 :             :      finalizer -- for tokens resulting from macro expansion.  */
     185                 :      291747 :   virt_loc_aware_diagnostic_finalizer (text_output, diagnostic);
     186                 :      291747 :   pp_set_prefix (pp, saved_prefix);
     187                 :      291747 :   pp_flush (pp);
     188                 :      291747 : }
     189                 :             : 
     190                 :             : /* Common default settings for diagnostics.  */
     191                 :             : void
     192                 :      203614 : c_common_diagnostics_set_defaults (diagnostic_context *context)
     193                 :             : {
     194                 :      203614 :   diagnostic_text_finalizer (context) = c_diagnostic_text_finalizer;
     195                 :      203614 :   context->m_opt_permissive = OPT_fpermissive;
     196                 :      203614 : }
     197                 :             : 
     198                 :             : /* Input charset configuration for diagnostics.  */
     199                 :             : static const char *
     200                 :       59177 : c_common_input_charset_cb (const char * /*filename*/)
     201                 :             : {
     202                 :       59177 :   const char *cs = cpp_opts->input_charset;
     203                 :       59177 :   return cpp_input_conversion_is_trivial (cs) ? nullptr : cs;
     204                 :             : }
     205                 :             : 
     206                 :             : /* Whether options from all C-family languages should be accepted
     207                 :             :    quietly.  */
     208                 :             : static bool accept_all_c_family_options = false;
     209                 :             : 
     210                 :             : /* Return whether to complain about a wrong-language option.  */
     211                 :             : bool
     212                 :         302 : c_common_complain_wrong_lang_p (const struct cl_option *option)
     213                 :             : {
     214                 :         302 :   if (accept_all_c_family_options
     215                 :           6 :       && (option->flags & c_family_lang_mask))
     216                 :           6 :     return false;
     217                 :             : 
     218                 :             :   return true;
     219                 :             : }
     220                 :             : 
     221                 :             : /* Initialize options structure OPTS.  */
     222                 :             : void
     223                 :    56070716 : c_common_init_options_struct (struct gcc_options *opts)
     224                 :             : {
     225                 :    56070716 :   opts->x_flag_exceptions = c_dialect_cxx ();
     226                 :    56070716 :   opts->x_warn_pointer_arith = c_dialect_cxx ();
     227                 :    56070716 :   opts->x_warn_write_strings = c_dialect_cxx ();
     228                 :    56070716 :   opts->x_flag_warn_unused_result = true;
     229                 :             : 
     230                 :             :   /* By default, C99-like requirements for complex multiply and divide.  */
     231                 :    56070716 :   opts->x_flag_complex_method = 2;
     232                 :    56070716 :   opts->x_flag_default_complex_method = opts->x_flag_complex_method;
     233                 :    56070716 : }
     234                 :             : 
     235                 :             : /* Common initialization before calling option handlers.  */
     236                 :             : void
     237                 :      203614 : c_common_init_options (unsigned int decoded_options_count,
     238                 :             :                        struct cl_decoded_option *decoded_options)
     239                 :             : {
     240                 :      203614 :   unsigned int i;
     241                 :      203614 :   struct cpp_callbacks *cb;
     242                 :             : 
     243                 :      203614 :   g_string_concat_db
     244                 :      203614 :     = new (ggc_alloc <string_concat_db> ()) string_concat_db ();
     245                 :             : 
     246                 :      314442 :   parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX : CLK_GNUC89,
     247                 :             :                                 ident_hash, line_table, ident_hash_extra);
     248                 :      203614 :   cb = cpp_get_callbacks (parse_in);
     249                 :      203614 :   cb->diagnostic = c_cpp_diagnostic;
     250                 :             : 
     251                 :      203614 :   cpp_opts = cpp_get_options (parse_in);
     252                 :      203614 :   cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
     253                 :      203614 :   cpp_opts->objc = c_dialect_objc ();
     254                 :      203614 :   cpp_opts->deps.modules = true;
     255                 :             : 
     256                 :             :   /* Reset to avoid warnings on internal definitions.  We set it just
     257                 :             :      before passing on command-line options to cpplib.  */
     258                 :      203614 :   cpp_opts->warn_dollars = 0;
     259                 :             : 
     260                 :      203614 :   deferred_opts = XNEWVEC (struct deferred_opt, decoded_options_count);
     261                 :             : 
     262                 :      203614 :   if (c_language == clk_c)
     263                 :             :     {
     264                 :             :       /* The default for C is gnu23.  */
     265                 :      110828 :       set_std_c23 (false /* ISO */);
     266                 :             : 
     267                 :             :       /* If preprocessing assembly language, accept any of the C-family
     268                 :             :          front end options since the driver may pass them through.  */
     269                 :     2715421 :       for (i = 1; i < decoded_options_count; i++)
     270                 :     2494746 :         if (decoded_options[i].opt_index == OPT_lang_asm)
     271                 :             :           {
     272                 :         981 :             accept_all_c_family_options = true;
     273                 :         981 :             break;
     274                 :             :           }
     275                 :             :     }
     276                 :             : 
     277                 :             :   /* Set C++ standard to C++17 if not specified on the command line.  */
     278                 :      203614 :   if (c_dialect_cxx ())
     279                 :       92786 :     set_std_cxx17 (/*ISO*/false);
     280                 :             : 
     281                 :      203614 :   global_dc->m_source_printing.colorize_source_p = true;
     282                 :      203614 : }
     283                 :             : 
     284                 :             : /* Handle switch SCODE with argument ARG.  VALUE is true, unless no-
     285                 :             :    form of an -f or -W option was given.  Returns false if the switch was
     286                 :             :    invalid, true if valid.  Use HANDLERS in recursive handle_option calls.  */
     287                 :             : bool
     288                 :     3192543 : c_common_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value,
     289                 :             :                         int kind, location_t loc,
     290                 :             :                         const struct cl_option_handlers *handlers)
     291                 :             : {
     292                 :     3192543 :   const struct cl_option *option = &cl_options[scode];
     293                 :     3192543 :   enum opt_code code = (enum opt_code) scode;
     294                 :     3192543 :   bool result = true;
     295                 :             : 
     296                 :             :   /* Prevent resetting the language standard to a C dialect when the driver
     297                 :             :      has already determined that we're looking at assembler input.  */
     298                 :     3192543 :   bool preprocessing_asm_p = (cpp_get_options (parse_in)->lang == CLK_ASM);
     299                 :             : 
     300                 :     3192543 :   switch (code)
     301                 :             :     {
     302                 :     1384450 :     default:
     303                 :     1384450 :       if (cl_options[code].flags & c_family_lang_mask)
     304                 :             :         {
     305                 :     1384450 :           if ((option->flags & CL_TARGET)
     306                 :     1384450 :               && ! targetcm.handle_c_option (scode, arg, value))
     307                 :             :             result = false;
     308                 :             :           break;
     309                 :             :         }
     310                 :             :       result = false;
     311                 :             :       break;
     312                 :             : 
     313                 :         478 :     case OPT__output_pch:
     314                 :         478 :       pch_file = arg;
     315                 :         478 :       break;
     316                 :             : 
     317                 :          10 :     case OPT_A:
     318                 :          10 :       defer_opt (code, arg);
     319                 :          10 :       break;
     320                 :             : 
     321                 :          13 :     case OPT_C:
     322                 :          13 :       cpp_opts->discard_comments = 0;
     323                 :          13 :       break;
     324                 :             : 
     325                 :          11 :     case OPT_CC:
     326                 :          11 :       cpp_opts->discard_comments = 0;
     327                 :          11 :       cpp_opts->discard_comments_in_macro_exp = 0;
     328                 :          11 :       break;
     329                 :             : 
     330                 :      157828 :     case OPT_D:
     331                 :      157828 :       defer_opt (code, arg);
     332                 :      157828 :       break;
     333                 :             : 
     334                 :          24 :     case OPT_H:
     335                 :          24 :       cpp_opts->print_include_names = 1;
     336                 :          24 :       break;
     337                 :             : 
     338                 :             :     case OPT_F:
     339                 :             :       TARGET_OPTF (xstrdup (arg));
     340                 :             :       break;
     341                 :             : 
     342                 :      524798 :     case OPT_I:
     343                 :      524798 :       if (strcmp (arg, "-"))
     344                 :      524798 :         add_path (xstrdup (arg), INC_BRACKET, 0, true);
     345                 :             :       else
     346                 :             :         {
     347                 :           0 :           if (quote_chain_split)
     348                 :           0 :             error ("%<-I-%> specified twice");
     349                 :           0 :           quote_chain_split = true;
     350                 :           0 :           split_quote_chain ();
     351                 :           0 :           inform (input_location, "obsolete option %<-I-%> used, "
     352                 :             :                   "please use %<-iquote%> instead");
     353                 :             :         }
     354                 :             :       break;
     355                 :             : 
     356                 :          25 :     case OPT_M:
     357                 :          25 :     case OPT_MM:
     358                 :             :       /* When doing dependencies with -M or -MM, suppress normal
     359                 :             :          preprocessed output, but still do -dM etc. as software
     360                 :             :          depends on this.  Preprocessed output does occur if -MD, -MMD
     361                 :             :          or environment var dependency generation is used.  */
     362                 :          25 :       cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM : DEPS_USER);
     363                 :          25 :       flag_no_output = 1;
     364                 :          25 :       break;
     365                 :             : 
     366                 :        5700 :     case OPT_MD:
     367                 :        5700 :     case OPT_MMD:
     368                 :        5700 :       cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM : DEPS_USER);
     369                 :        5700 :       cpp_opts->deps.need_preprocessor_output = true;
     370                 :        5700 :       deps_file = arg;
     371                 :        5700 :       break;
     372                 :             : 
     373                 :          51 :     case OPT_fdeps_format_:
     374                 :             :       /* https://wg21.link/p1689r5 */
     375                 :          51 :       if (!strcmp (arg, "p1689r5"))
     376                 :          48 :         cpp_opts->deps.fdeps_format = FDEPS_FMT_P1689R5;
     377                 :             :       else
     378                 :           3 :         error ("%<-fdeps-format=%> unknown format %qs", arg);
     379                 :             :       break;
     380                 :             : 
     381                 :          63 :     case OPT_fdeps_file_:
     382                 :          63 :       deps_seen = true;
     383                 :          63 :       fdeps_file = arg;
     384                 :          63 :       break;
     385                 :             : 
     386                 :          63 :     case OPT_fdeps_target_:
     387                 :          63 :       deps_seen = true;
     388                 :          63 :       defer_opt (code, arg);
     389                 :          63 :       break;
     390                 :             : 
     391                 :        5644 :     case OPT_MF:
     392                 :        5644 :       deps_seen = true;
     393                 :        5644 :       deps_file = arg;
     394                 :        5644 :       break;
     395                 :             : 
     396                 :           3 :     case OPT_MG:
     397                 :           3 :       deps_seen = true;
     398                 :           3 :       cpp_opts->deps.missing_files = true;
     399                 :           3 :       break;
     400                 :             : 
     401                 :        5629 :     case OPT_MP:
     402                 :        5629 :       deps_seen = true;
     403                 :        5629 :       cpp_opts->deps.phony_targets = true;
     404                 :        5629 :       break;
     405                 :             : 
     406                 :           0 :     case OPT_Mmodules:
     407                 :             :       /* Do not set deps_seen, so the user can unconditionally turn
     408                 :             :          this on or off.  */
     409                 :           0 :       cpp_opts->deps.modules = true;
     410                 :           0 :       break;
     411                 :             : 
     412                 :           3 :     case OPT_Mno_modules:
     413                 :             :       /* Do not set deps_seen, so the user can unconditionally turn
     414                 :             :          this on or off.  */
     415                 :           3 :       cpp_opts->deps.modules = false;
     416                 :           3 :       break;
     417                 :             : 
     418                 :        5696 :     case OPT_MQ:
     419                 :        5696 :     case OPT_MT:
     420                 :        5696 :       deps_seen = true;
     421                 :        5696 :       defer_opt (code, arg);
     422                 :        5696 :       break;
     423                 :             : 
     424                 :          43 :     case OPT_P:
     425                 :          43 :       flag_no_line_commands = 1;
     426                 :          43 :       break;
     427                 :             : 
     428                 :          59 :     case OPT_U:
     429                 :          59 :       defer_opt (code, arg);
     430                 :          59 :       break;
     431                 :             : 
     432                 :       10661 :     case OPT_Wall:
     433                 :             :       /* ??? Don't add new options here. Use LangEnabledBy in c.opt.  */
     434                 :             : 
     435                 :       10661 :       cpp_opts->warn_num_sign_change = value;
     436                 :       10661 :       break;
     437                 :             : 
     438                 :       10739 :     case OPT_Wunknown_pragmas:
     439                 :             :       /* Set to greater than 1, so that even unknown pragmas in
     440                 :             :          system headers will be warned about.  */
     441                 :             :       /* ??? There is no way to handle this automatically for now.  */
     442                 :       10739 :       warn_unknown_pragmas = value * 2;
     443                 :       10739 :       break;
     444                 :             : 
     445                 :        3323 :     case OPT_ansi:
     446                 :        3323 :       if (!c_dialect_cxx ())
     447                 :        3177 :         set_std_c89 (false, true);
     448                 :             :       else
     449                 :         146 :         set_std_cxx98 (true);
     450                 :             :       break;
     451                 :             : 
     452                 :        1587 :     case OPT_d:
     453                 :        1587 :       handle_OPT_d (arg);
     454                 :        1587 :       break;
     455                 :             : 
     456                 :         613 :     case OPT_Wabi_:
     457                 :         613 :       warn_abi = true;
     458                 :         613 :       if (value == 1)
     459                 :             :         {
     460                 :           0 :           warning (0, "%<-Wabi=1%> is not supported, using =2");
     461                 :           0 :           value = 2;
     462                 :             :         }
     463                 :         613 :       warn_abi_version = value;
     464                 :         613 :       break;
     465                 :             : 
     466                 :          18 :     case OPT_fcanonical_system_headers:
     467                 :          18 :       cpp_opts->canonical_system_headers = value;
     468                 :          18 :       break;
     469                 :             : 
     470                 :          12 :     case OPT_fcond_mismatch:
     471                 :          12 :       if (!c_dialect_cxx ())
     472                 :             :         {
     473                 :          12 :           flag_cond_mismatch = value;
     474                 :          12 :           break;
     475                 :             :         }
     476                 :           0 :       warning (0, "switch %qs is no longer supported", option->opt_text);
     477                 :           0 :       break;
     478                 :             : 
     479                 :         300 :     case OPT_fbuiltin_:
     480                 :         300 :       if (value)
     481                 :             :         result = false;
     482                 :             :       else
     483                 :         300 :         disable_builtin_function (arg);
     484                 :             :       break;
     485                 :             : 
     486                 :        1090 :     case OPT_fdirectives_only:
     487                 :        1090 :       cpp_opts->directives_only = value;
     488                 :        1090 :       break;
     489                 :             : 
     490                 :           7 :     case OPT_fdollars_in_identifiers:
     491                 :           7 :       cpp_opts->dollars_in_ident = value;
     492                 :           7 :       break;
     493                 :             : 
     494                 :           8 :     case OPT_fmacro_prefix_map_:
     495                 :           8 :       add_macro_prefix_map (arg);
     496                 :           8 :       break;
     497                 :             : 
     498                 :         583 :     case OPT_ffreestanding:
     499                 :         583 :       value = !value;
     500                 :             :       /* Fall through.  */
     501                 :         591 :     case OPT_fhosted:
     502                 :         591 :       flag_hosted = value;
     503                 :         591 :       flag_no_builtin = !value;
     504                 :         591 :       break;
     505                 :             : 
     506                 :           0 :     case OPT_fconstant_string_class_:
     507                 :           0 :       constant_string_class_name = arg;
     508                 :           0 :       break;
     509                 :             : 
     510                 :           0 :     case OPT_fextended_identifiers:
     511                 :           0 :       cpp_opts->extended_identifiers = value;
     512                 :           0 :       break;
     513                 :             : 
     514                 :           4 :     case OPT_fmax_include_depth_:
     515                 :           4 :         cpp_opts->max_include_depth = value;
     516                 :           4 :       break;
     517                 :             : 
     518                 :           3 :     case OPT_foperator_names:
     519                 :           3 :       cpp_opts->operator_names = value;
     520                 :           3 :       break;
     521                 :             : 
     522                 :           0 :     case OPT_fpch_deps:
     523                 :           0 :       cpp_opts->restore_pch_deps = value;
     524                 :           0 :       break;
     525                 :             : 
     526                 :         474 :     case OPT_fpch_preprocess:
     527                 :         474 :       flag_pch_preprocess = value;
     528                 :         474 :       break;
     529                 :             : 
     530                 :        1145 :     case OPT_fpermissive:
     531                 :        1145 :       flag_permissive = value;
     532                 :        1145 :       global_dc->m_permissive = value;
     533                 :        1145 :       break;
     534                 :             : 
     535                 :         522 :     case OPT_fpreprocessed:
     536                 :         522 :       cpp_opts->preprocessed = value;
     537                 :         522 :       break;
     538                 :             : 
     539                 :           2 :     case OPT_fdebug_cpp:
     540                 :           2 :       cpp_opts->debug = value;
     541                 :           2 :       break;
     542                 :             : 
     543                 :           1 :     case OPT_ftrack_macro_expansion:
     544                 :           1 :       if (value)
     545                 :           0 :         value = 2;
     546                 :             :       /* Fall Through.  */
     547                 :             : 
     548                 :         459 :     case OPT_ftrack_macro_expansion_:
     549                 :         459 :       if (arg && *arg != '\0')
     550                 :         458 :         cpp_opts->track_macro_expansion = value;
     551                 :             :       else
     552                 :           1 :         cpp_opts->track_macro_expansion = 2;
     553                 :             :       break;
     554                 :             : 
     555                 :          71 :     case OPT_fexec_charset_:
     556                 :          71 :       cpp_opts->narrow_charset = arg;
     557                 :          71 :       break;
     558                 :             : 
     559                 :           0 :     case OPT_fwide_exec_charset_:
     560                 :           0 :       cpp_opts->wide_charset = arg;
     561                 :           0 :       break;
     562                 :             : 
     563                 :          93 :     case OPT_finput_charset_:
     564                 :          93 :       cpp_opts->input_charset = arg;
     565                 :          93 :       cpp_opts->cpp_input_charset_explicit = 1;
     566                 :          93 :       break;
     567                 :             : 
     568                 :          28 :     case OPT_ftemplate_depth_:
     569                 :          28 :       max_tinst_depth = value;
     570                 :          28 :       break;
     571                 :             : 
     572                 :          21 :     case OPT_fvisibility_inlines_hidden:
     573                 :          21 :       visibility_options.inlines_hidden = value;
     574                 :          21 :       break;
     575                 :             : 
     576                 :          22 :     case OPT_femit_struct_debug_baseonly:
     577                 :          22 :       set_struct_debug_option (&global_options, loc, "base");
     578                 :          22 :       break;
     579                 :             : 
     580                 :           8 :     case OPT_femit_struct_debug_reduced:
     581                 :           8 :       set_struct_debug_option (&global_options, loc,
     582                 :             :                                "dir:ord:sys,dir:gen:any,ind:base");
     583                 :           8 :       break;
     584                 :             : 
     585                 :          12 :     case OPT_femit_struct_debug_detailed_:
     586                 :          12 :       set_struct_debug_option (&global_options, loc, arg);
     587                 :          12 :       break;
     588                 :             : 
     589                 :          17 :     case OPT_fext_numeric_literals:
     590                 :          17 :       cpp_opts->ext_numeric_literals = value;
     591                 :          17 :       break;
     592                 :             : 
     593                 :           4 :     case OPT_idirafter:
     594                 :           4 :       add_path (xstrdup (arg), INC_AFTER, 0, true);
     595                 :           4 :       break;
     596                 :             : 
     597                 :        9679 :     case OPT_imacros:
     598                 :        9679 :     case OPT_include:
     599                 :        9679 :       defer_opt (code, arg);
     600                 :        9679 :       break;
     601                 :             : 
     602                 :        5224 :     case OPT_imultilib:
     603                 :        5224 :       imultilib = arg;
     604                 :        5224 :       break;
     605                 :             : 
     606                 :      200882 :     case OPT_iprefix:
     607                 :      200882 :       iprefix = arg;
     608                 :      200882 :       break;
     609                 :             : 
     610                 :        2734 :     case OPT_iquote:
     611                 :        2734 :       add_path (xstrdup (arg), INC_QUOTE, 0, true);
     612                 :        2734 :       break;
     613                 :             : 
     614                 :           0 :     case OPT_isysroot:
     615                 :           0 :       sysroot = arg;
     616                 :           0 :       break;
     617                 :             : 
     618                 :      451824 :     case OPT_isystem:
     619                 :      451824 :       add_path (xstrdup (arg), INC_SYSTEM, 0, true);
     620                 :      451824 :       break;
     621                 :             : 
     622                 :           0 :     case OPT_iwithprefix:
     623                 :           0 :       add_prefixed_path (arg, INC_SYSTEM);
     624                 :           0 :       break;
     625                 :             : 
     626                 :           0 :     case OPT_iwithprefixbefore:
     627                 :           0 :       add_prefixed_path (arg, INC_BRACKET);
     628                 :           0 :       break;
     629                 :             : 
     630                 :          80 :     case OPT__embed_dir_:
     631                 :          80 :       add_path (xstrdup (arg), INC_EMBED, 0, true);
     632                 :          80 :       break;
     633                 :             : 
     634                 :         981 :     case OPT_lang_asm:
     635                 :         981 :       cpp_set_lang (parse_in, CLK_ASM);
     636                 :         981 :       cpp_opts->dollars_in_ident = false;
     637                 :         981 :       break;
     638                 :             : 
     639                 :          58 :     case OPT_nostdinc:
     640                 :          58 :       std_inc = false;
     641                 :          58 :       break;
     642                 :             : 
     643                 :      104645 :     case OPT_nostdinc__:
     644                 :      104645 :       std_cxx_inc = false;
     645                 :      104645 :       break;
     646                 :             : 
     647                 :      202899 :     case OPT_o:
     648                 :      202899 :       if (!out_fname)
     649                 :      202899 :         out_fname = arg;
     650                 :             :       else
     651                 :           0 :         error ("output filename specified twice");
     652                 :             :       break;
     653                 :             : 
     654                 :           0 :     case OPT_print_objc_runtime_info:
     655                 :           0 :       print_struct_values = 1;
     656                 :           0 :       break;
     657                 :             : 
     658                 :           2 :     case OPT_remap:
     659                 :           2 :       cpp_opts->remap = 1;
     660                 :           2 :       break;
     661                 :             : 
     662                 :       13607 :     case OPT_std_c__98:
     663                 :       13607 :     case OPT_std_gnu__98:
     664                 :       13607 :       if (!preprocessing_asm_p)
     665                 :       13607 :         set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
     666                 :             :       break;
     667                 :             : 
     668                 :        5370 :     case OPT_std_c__11:
     669                 :        5370 :     case OPT_std_gnu__11:
     670                 :        5370 :       if (!preprocessing_asm_p)
     671                 :        5370 :         set_std_cxx11 (code == OPT_std_c__11 /* ISO */);
     672                 :             :       break;
     673                 :             : 
     674                 :        1187 :     case OPT_std_c__14:
     675                 :        1187 :     case OPT_std_gnu__14:
     676                 :        1187 :       if (!preprocessing_asm_p)
     677                 :        1187 :         set_std_cxx14 (code == OPT_std_c__14 /* ISO */);
     678                 :             :       break;
     679                 :             : 
     680                 :       29661 :     case OPT_std_c__17:
     681                 :       29661 :     case OPT_std_gnu__17:
     682                 :       29661 :       if (!preprocessing_asm_p)
     683                 :       29661 :         set_std_cxx17 (code == OPT_std_c__17 /* ISO */);
     684                 :             :       break;
     685                 :             : 
     686                 :        4714 :     case OPT_std_c__20:
     687                 :        4714 :     case OPT_std_gnu__20:
     688                 :        4714 :       if (!preprocessing_asm_p)
     689                 :        4714 :         set_std_cxx20 (code == OPT_std_c__20 /* ISO */);
     690                 :             :       break;
     691                 :             : 
     692                 :        2762 :     case OPT_std_c__23:
     693                 :        2762 :     case OPT_std_gnu__23:
     694                 :        2762 :       if (!preprocessing_asm_p)
     695                 :        2762 :         set_std_cxx23 (code == OPT_std_c__23 /* ISO */);
     696                 :             :       break;
     697                 :             : 
     698                 :       21039 :     case OPT_std_c__26:
     699                 :       21039 :     case OPT_std_gnu__26:
     700                 :       21039 :       if (!preprocessing_asm_p)
     701                 :       21039 :         set_std_cxx26 (code == OPT_std_c__26 /* ISO */);
     702                 :             :       break;
     703                 :             : 
     704                 :         189 :     case OPT_std_c90:
     705                 :         189 :     case OPT_std_iso9899_199409:
     706                 :         189 :       if (!preprocessing_asm_p)
     707                 :         189 :         set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
     708                 :             :       break;
     709                 :             : 
     710                 :        2951 :     case OPT_std_gnu90:
     711                 :        2951 :       if (!preprocessing_asm_p)
     712                 :        2951 :         set_std_c89 (false /* c94 */, false /* ISO */);
     713                 :             :       break;
     714                 :             : 
     715                 :         571 :     case OPT_std_c99:
     716                 :         571 :       if (!preprocessing_asm_p)
     717                 :         570 :         set_std_c99 (true /* ISO */);
     718                 :             :       break;
     719                 :             : 
     720                 :         612 :     case OPT_std_gnu99:
     721                 :         612 :       if (!preprocessing_asm_p)
     722                 :         612 :         set_std_c99 (false /* ISO */);
     723                 :             :       break;
     724                 :             : 
     725                 :         508 :     case OPT_std_c11:
     726                 :         508 :       if (!preprocessing_asm_p)
     727                 :         508 :         set_std_c11 (true /* ISO */);
     728                 :             :       break;
     729                 :             : 
     730                 :        3562 :     case OPT_std_gnu11:
     731                 :        3562 :       if (!preprocessing_asm_p)
     732                 :        3562 :         set_std_c11 (false /* ISO */);
     733                 :             :       break;
     734                 :             : 
     735                 :          38 :     case OPT_std_c17:
     736                 :          38 :       if (!preprocessing_asm_p)
     737                 :          38 :         set_std_c17 (true /* ISO */);
     738                 :             :       break;
     739                 :             : 
     740                 :         780 :     case OPT_std_gnu17:
     741                 :         780 :       if (!preprocessing_asm_p)
     742                 :         780 :         set_std_c17 (false /* ISO */);
     743                 :             :       break;
     744                 :             : 
     745                 :         774 :     case OPT_std_c23:
     746                 :         774 :       if (!preprocessing_asm_p)
     747                 :         774 :         set_std_c23 (true /* ISO */);
     748                 :             :       break;
     749                 :             : 
     750                 :         182 :     case OPT_std_gnu23:
     751                 :         182 :       if (!preprocessing_asm_p)
     752                 :         182 :         set_std_c23 (false /* ISO */);
     753                 :             :       break;
     754                 :             : 
     755                 :         139 :     case OPT_std_c2y:
     756                 :         139 :       if (!preprocessing_asm_p)
     757                 :         139 :         set_std_c2y (true /* ISO */);
     758                 :             :       break;
     759                 :             : 
     760                 :           5 :     case OPT_std_gnu2y:
     761                 :           5 :       if (!preprocessing_asm_p)
     762                 :           5 :         set_std_c2y (false /* ISO */);
     763                 :             :       break;
     764                 :             : 
     765                 :          20 :     case OPT_trigraphs:
     766                 :          20 :       cpp_opts->trigraphs = 1;
     767                 :          20 :       break;
     768                 :             : 
     769                 :        2327 :     case OPT_traditional_cpp:
     770                 :        2327 :       cpp_opts->traditional = 1;
     771                 :        2327 :       break;
     772                 :             : 
     773                 :           0 :     case OPT_fsearch_include_path:
     774                 :           0 :       cpp_opts->main_search = CMS_user;
     775                 :           0 :       break;
     776                 :             : 
     777                 :           0 :     case OPT_fsearch_include_path_:
     778                 :           0 :       if (!strcmp (arg, "user"))
     779                 :           0 :         cpp_opts->main_search = CMS_user;
     780                 :           0 :       else if (!strcmp (arg, "system"))
     781                 :           0 :         cpp_opts->main_search = CMS_system;
     782                 :             :       else
     783                 :           0 :         error ("invalid argument %qs to %<-fsearch-include-path%>", arg);
     784                 :             :       break;
     785                 :             : 
     786                 :         112 :     case OPT_v:
     787                 :         112 :       verbose = true;
     788                 :         112 :       break;
     789                 :             :     }
     790                 :             : 
     791                 :     3192543 :   switch (c_language)
     792                 :             :     {
     793                 :     1399632 :     case clk_c:
     794                 :     1399632 :       C_handle_option_auto (&global_options, &global_options_set,
     795                 :             :                             scode, arg, value,
     796                 :             :                             c_family_lang_mask, kind,
     797                 :             :                             loc, handlers, global_dc);
     798                 :     1399632 :       break;
     799                 :             : 
     800                 :           0 :     case clk_objc:
     801                 :           0 :       ObjC_handle_option_auto (&global_options, &global_options_set,
     802                 :             :                                scode, arg, value,
     803                 :             :                                c_family_lang_mask, kind,
     804                 :             :                                loc, handlers, global_dc);
     805                 :           0 :       break;
     806                 :             : 
     807                 :     1792911 :     case clk_cxx:
     808                 :     1792911 :       CXX_handle_option_auto (&global_options, &global_options_set,
     809                 :             :                               scode, arg, value,
     810                 :             :                               c_family_lang_mask, kind,
     811                 :             :                               loc, handlers, global_dc);
     812                 :     1792911 :       break;
     813                 :             : 
     814                 :           0 :     case clk_objcxx:
     815                 :           0 :       ObjCXX_handle_option_auto (&global_options, &global_options_set,
     816                 :             :                                  scode, arg, value,
     817                 :             :                                  c_family_lang_mask, kind,
     818                 :             :                                  loc, handlers, global_dc);
     819                 :           0 :       break;
     820                 :             : 
     821                 :           0 :     default:
     822                 :           0 :       gcc_unreachable ();
     823                 :             :     }
     824                 :             : 
     825                 :     3192543 :   cpp_handle_option_auto (&global_options, scode, cpp_opts);
     826                 :     3192543 :   return result;
     827                 :             : }
     828                 :             : 
     829                 :             : /* Default implementation of TARGET_HANDLE_C_OPTION.  */
     830                 :             : 
     831                 :             : bool
     832                 :           0 : default_handle_c_option (size_t code ATTRIBUTE_UNUSED,
     833                 :             :                          const char *arg ATTRIBUTE_UNUSED,
     834                 :             :                          int value ATTRIBUTE_UNUSED)
     835                 :             : {
     836                 :           0 :   return false;
     837                 :             : }
     838                 :             : 
     839                 :             : /* Post-switch processing.  */
     840                 :             : bool
     841                 :      203504 : c_common_post_options (const char **pfilename)
     842                 :             : {
     843                 :             :   /* Canonicalize the input and output filenames.  */
     844                 :      203504 :   if (in_fnames == NULL)
     845                 :             :     {
     846                 :           0 :       in_fnames = XNEWVEC (const char *, 1);
     847                 :           0 :       in_fnames[0] = "";
     848                 :             :     }
     849                 :      203504 :   else if (strcmp (in_fnames[0], "-") == 0)
     850                 :             :     {
     851                 :         407 :       if (pch_file)
     852                 :           0 :         error ("cannot use %<-%> as input filename for a precompiled header");
     853                 :             : 
     854                 :         407 :       in_fnames[0] = "";
     855                 :             :     }
     856                 :             : 
     857                 :      203504 :   if (out_fname == NULL || !strcmp (out_fname, "-"))
     858                 :         715 :     out_fname = "";
     859                 :             : 
     860                 :      203504 :   if (cpp_opts->deps.style == DEPS_NONE)
     861                 :      197779 :     check_deps_environment_vars ();
     862                 :             : 
     863                 :      203504 :   handle_deferred_opts ();
     864                 :             : 
     865                 :      203504 :   sanitize_cpp_opts ();
     866                 :             : 
     867                 :      203504 :   register_include_chains (parse_in, sysroot, iprefix, imultilib,
     868                 :      203504 :                            std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
     869                 :             : 
     870                 :             : #ifdef C_COMMON_OVERRIDE_OPTIONS
     871                 :             :   /* Some machines may reject certain combinations of C
     872                 :             :      language-specific options.  */
     873                 :             :   C_COMMON_OVERRIDE_OPTIONS;
     874                 :             : #endif
     875                 :             : 
     876                 :      203504 :   if (flag_excess_precision == EXCESS_PRECISION_DEFAULT)
     877                 :      350219 :     flag_excess_precision = (flag_iso ? EXCESS_PRECISION_STANDARD
     878                 :             :                              : EXCESS_PRECISION_FAST);
     879                 :             : 
     880                 :             :   /* ISO C restricts floating-point expression contraction to within
     881                 :             :      source-language expressions (-ffp-contract=on, currently an alias
     882                 :             :      for -ffp-contract=off).  */
     883                 :      203504 :   if (flag_iso
     884                 :       53727 :       && !c_dialect_cxx ()
     885                 :        5389 :       && (OPTION_SET_P (flag_fp_contract_mode)
     886                 :             :           == (enum fp_contract_mode) 0)
     887                 :        5389 :       && flag_unsafe_math_optimizations == 0)
     888                 :        5384 :     flag_fp_contract_mode = FP_CONTRACT_OFF;
     889                 :             : 
     890                 :             :   /* C language modes before C99 enable -fpermissive by default, but
     891                 :             :      only if -pedantic-errors is not specified.  Also treat
     892                 :             :      -fno-permissive as a subset of -pedantic-errors that does not
     893                 :             :      reject certain GNU extensions also present the defaults for later
     894                 :             :      language modes.  */
     895                 :      203504 :   if (!c_dialect_cxx ()
     896                 :      110719 :       && !flag_isoc99
     897                 :        6311 :       && !global_dc->m_pedantic_errors
     898                 :        5334 :       && !OPTION_SET_P (flag_permissive))
     899                 :             :     {
     900                 :        5333 :       flag_permissive = 1;
     901                 :        5333 :       global_dc->m_permissive = 1;
     902                 :             :     }
     903                 :             : 
     904                 :             :   /* If we are compiling C, and we are outside of a standards mode,
     905                 :             :      we can permit the new values from ISO/IEC TS 18661-3 for
     906                 :             :      FLT_EVAL_METHOD.  Otherwise, we must restrict the possible values to
     907                 :             :      the set specified in ISO C99/C11.  */
     908                 :      203504 :   if (!flag_iso
     909                 :      149777 :       && !c_dialect_cxx ()
     910                 :      105330 :       && (OPTION_SET_P (flag_permitted_flt_eval_methods)
     911                 :             :           == PERMITTED_FLT_EVAL_METHODS_DEFAULT))
     912                 :      105329 :     flag_permitted_flt_eval_methods = PERMITTED_FLT_EVAL_METHODS_TS_18661;
     913                 :             :   else
     914                 :       98175 :     flag_permitted_flt_eval_methods = PERMITTED_FLT_EVAL_METHODS_C11;
     915                 :             : 
     916                 :             :   /* C23 Annex F does not permit certain built-in functions to raise
     917                 :             :      "inexact".  */
     918                 :      203504 :   if (flag_isoc23)
     919                 :       98338 :     SET_OPTION_IF_UNSET (&global_options, &global_options_set,
     920                 :             :                          flag_fp_int_builtin_inexact, 0);
     921                 :             : 
     922                 :             :   /* By default we use C99 inline semantics in GNU99 or C99 mode.  C99
     923                 :             :      inline semantics are not supported in GNU89 or C89 mode.  */
     924                 :      203504 :   if (flag_gnu89_inline == -1)
     925                 :      203068 :     flag_gnu89_inline = !flag_isoc99;
     926                 :         436 :   else if (!flag_gnu89_inline && !flag_isoc99)
     927                 :           1 :     error ("%<-fno-gnu89-inline%> is only supported in GNU99 or C99 mode");
     928                 :             : 
     929                 :             :   /* Default to ObjC sjlj exception handling if NeXT runtime < v2.  */
     930                 :      203504 :   if (flag_objc_sjlj_exceptions < 0)
     931                 :      407008 :     flag_objc_sjlj_exceptions = (flag_next_runtime && flag_objc_abi < 2);
     932                 :      203504 :   if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
     933                 :           0 :     flag_exceptions = 1;
     934                 :             : 
     935                 :             :   /* If -ffreestanding, -fno-hosted or -fno-builtin then disable
     936                 :             :      pattern recognition.  */
     937                 :      203504 :   if (flag_no_builtin)
     938                 :         763 :     SET_OPTION_IF_UNSET (&global_options, &global_options_set,
     939                 :             :                          flag_tree_loop_distribute_patterns, 0);
     940                 :             : 
     941                 :             :   /* -Woverlength-strings is off by default, but is enabled by -Wpedantic.
     942                 :             :      It is never enabled in C++, as the minimum limit is not normative
     943                 :             :      in that standard.  */
     944                 :      203504 :   if (c_dialect_cxx ())
     945                 :       92785 :     warn_overlength_strings = 0;
     946                 :             : 
     947                 :             :   /* Wmain is enabled by default in C++ but not in C.  */
     948                 :             :   /* Wmain is disabled by default for -ffreestanding (!flag_hosted),
     949                 :             :      even if -Wall or -Wpedantic was given (warn_main will be 2 if set
     950                 :             :      by -Wall, 1 if set by -Wmain).  */
     951                 :      203504 :   if (warn_main == -1)
     952                 :      249970 :     warn_main = (c_dialect_cxx () && flag_hosted) ? 1 : 0;
     953                 :       53316 :   else if (warn_main == 2)
     954                 :       53002 :     warn_main = flag_hosted ? 1 : 0;
     955                 :             : 
     956                 :             :   /* In C, -Wall and -Wc++-compat enable -Wenum-compare; if it has not
     957                 :             :      yet been set, it is disabled by default.  In C++, it is enabled
     958                 :             :      by default.  */
     959                 :      203504 :   if (warn_enum_compare == -1)
     960                 :      194244 :     warn_enum_compare = c_dialect_cxx () ? 1 : 0;
     961                 :             : 
     962                 :             :   /* -Wpacked-bitfield-compat is on by default for the C languages.  The
     963                 :             :      warning is issued in stor-layout.cc which is not part of the front-end so
     964                 :             :      we need to selectively turn it on here.  */
     965                 :      203504 :   if (warn_packed_bitfield_compat == -1)
     966                 :      203496 :     warn_packed_bitfield_compat = 1;
     967                 :             : 
     968                 :             :   /* Special format checking options don't work without -Wformat; warn if
     969                 :             :      they are used.  */
     970                 :      203504 :   if (!warn_format)
     971                 :             :     {
     972                 :      192501 :       warning (OPT_Wformat_y2k,
     973                 :             :                "%<-Wformat-y2k%> ignored without %<-Wformat%>");
     974                 :      192501 :       warning (OPT_Wformat_extra_args,
     975                 :             :                "%<-Wformat-extra-args%> ignored without %<-Wformat%>");
     976                 :      192501 :       warning (OPT_Wformat_zero_length,
     977                 :             :                "%<-Wformat-zero-length%> ignored without %<-Wformat%>");
     978                 :      192501 :       warning (OPT_Wformat_nonliteral,
     979                 :             :                "%<-Wformat-nonliteral%> ignored without %<-Wformat%>");
     980                 :      192501 :       warning (OPT_Wformat_contains_nul,
     981                 :             :                "%<-Wformat-contains-nul%> ignored without %<-Wformat%>");
     982                 :      192501 :       warning (OPT_Wformat_security,
     983                 :             :                "%<-Wformat-security%> ignored without %<-Wformat%>");
     984                 :             :     }
     985                 :             : 
     986                 :             :   /* -Wimplicit-function-declaration is enabled by default for C99.  */
     987                 :      203504 :   if (warn_implicit_function_declaration == -1)
     988                 :      195323 :     warn_implicit_function_declaration = flag_isoc99;
     989                 :             : 
     990                 :             :   /* -Wimplicit-int is enabled by default for C99.  */
     991                 :      203504 :   if (warn_implicit_int == -1)
     992                 :      195381 :     warn_implicit_int = flag_isoc99;
     993                 :             : 
     994                 :             :   /* -Wold-style-definition is enabled by default for C23.  */
     995                 :      203504 :   if (warn_old_style_definition == -1)
     996                 :      199342 :     warn_old_style_definition = flag_isoc23;
     997                 :             : 
     998                 :             :   /* -Wshift-overflow is enabled by default in C99 and C++11 modes.  */
     999                 :      203504 :   if (warn_shift_overflow == -1)
    1000                 :      386912 :     warn_shift_overflow = cxx_dialect >= cxx11 || flag_isoc99;
    1001                 :             : 
    1002                 :             :   /* -Wmissing-parameter-name is enabled by -pedantic before C23,
    1003                 :             :      and for -Wc11-c23-compat.  */
    1004                 :      203504 :   if (warn_missing_parameter_name == -1)
    1005                 :      203501 :     warn_missing_parameter_name
    1006                 :       44911 :       = ((pedantic && !flag_isoc23 && warn_c11_c23_compat != 0)
    1007                 :      248455 :          || warn_c11_c23_compat > 0);
    1008                 :             : 
    1009                 :             :   /* Likewise for -Wfree-labels.  */
    1010                 :      203504 :   if (warn_free_labels == -1)
    1011                 :       44911 :     warn_free_labels = ((pedantic && !flag_isoc23 && warn_c11_c23_compat != 0)
    1012                 :      248455 :                         || warn_c11_c23_compat > 0);
    1013                 :             : 
    1014                 :      203504 :   if (warn_deprecated_non_prototype == -1)
    1015                 :      203501 :     warn_deprecated_non_prototype = warn_c11_c23_compat > 0;
    1016                 :             : 
    1017                 :             :   /* -Wshift-negative-value is enabled by -Wextra in C99 and C++11 to C++17
    1018                 :             :      modes.  */
    1019                 :      203504 :   if (warn_shift_negative_value == -1)
    1020                 :      406968 :     warn_shift_negative_value = (extra_warnings
    1021                 :        7601 :                                  && (cxx_dialect >= cxx11 || flag_isoc99)
    1022                 :      407082 :                                  && cxx_dialect < cxx20);
    1023                 :             : 
    1024                 :             :   /* -Wregister is enabled by default in C++17.  */
    1025                 :      203504 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set, warn_register,
    1026                 :             :                        cxx_dialect >= cxx17);
    1027                 :             : 
    1028                 :             :   /* Explicit -Wdeprecated turns on warnings from later standards.  */
    1029                 :     1593520 :   auto deprecated_in = [&](enum cxx_dialect d)
    1030                 :             :   {
    1031                 :     1390016 :     if (OPTION_SET_P (warn_deprecated)) return !!warn_deprecated;
    1032                 :     1388429 :     return (warn_deprecated && cxx_dialect >= d);
    1033                 :             :   };
    1034                 :             : 
    1035                 :             :   /* -Wcomma-subscript is enabled by default in C++20.  */
    1036                 :      203504 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1037                 :             :                        warn_comma_subscript,
    1038                 :             :                        cxx_dialect >= cxx23
    1039                 :             :                        || deprecated_in (cxx20));
    1040                 :             : 
    1041                 :             :   /* -Wvolatile is enabled by default in C++20.  */
    1042                 :      203504 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set, warn_volatile,
    1043                 :             :                        deprecated_in (cxx20));
    1044                 :             : 
    1045                 :             :   /* -Wdeprecated-enum-enum-conversion is enabled by default in C++20.  */
    1046                 :      203504 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1047                 :             :                        warn_deprecated_enum_enum_conv,
    1048                 :             :                        deprecated_in (cxx20));
    1049                 :             : 
    1050                 :             :   /* -Wdeprecated-enum-float-conversion is enabled by default in C++20.  */
    1051                 :      203504 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1052                 :             :                        warn_deprecated_enum_float_conv,
    1053                 :             :                        deprecated_in (cxx20));
    1054                 :             : 
    1055                 :             :   /* -Wdeprecated-literal-operator is enabled by default in C++23.  */
    1056                 :      203504 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1057                 :             :                        warn_deprecated_literal_operator,
    1058                 :             :                        deprecated_in (cxx23));
    1059                 :             : 
    1060                 :             :   /* -Warray-compare is enabled by default in C++20.  */
    1061                 :      203504 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1062                 :             :                        warn_array_compare,
    1063                 :             :                        warn_array_compare || deprecated_in (cxx20));
    1064                 :             : 
    1065                 :             :   /* -Wdeprecated-variadic-comma-omission is enabled by default in C++26.  */
    1066                 :      203504 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1067                 :             :                        warn_deprecated_variadic_comma_omission,
    1068                 :             :                        deprecated_in (cxx26));
    1069                 :             : 
    1070                 :             :   /* -Wtemplate-id-cdtor is enabled by default in C++20.  */
    1071                 :      233988 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1072                 :             :                        warn_template_id_cdtor,
    1073                 :             :                        cxx_dialect >= cxx20 || warn_cxx20_compat);
    1074                 :             : 
    1075                 :             :   /* Declone C++ 'structors if -Os.  */
    1076                 :      203504 :   if (flag_declone_ctor_dtor == -1)
    1077                 :      203473 :     flag_declone_ctor_dtor = optimize_size;
    1078                 :             : 
    1079                 :      203504 :   if (flag_abi_compat_version == 1)
    1080                 :             :     {
    1081                 :           0 :       warning (0, "%<-fabi-compat-version=1%> is not supported, using =2");
    1082                 :           0 :       flag_abi_compat_version = 2;
    1083                 :             :     }
    1084                 :             : 
    1085                 :             :   /* Change flag_abi_version to be the actual current ABI level, for the
    1086                 :             :      benefit of c_cpp_builtins, and to make comparison simpler.  */
    1087                 :      203504 :   const int latest_abi_version = 19;
    1088                 :             :   /* Generate compatibility aliases for ABI v13 (8.2) by default.  */
    1089                 :      203504 :   const int abi_compat_default = 13;
    1090                 :             : 
    1091                 :             : #define clamp(X) if (X == 0 || X > latest_abi_version) X = latest_abi_version
    1092                 :      203504 :   clamp (flag_abi_version);
    1093                 :      203504 :   clamp (warn_abi_version);
    1094                 :      203504 :   clamp (flag_abi_compat_version);
    1095                 :             : #undef clamp
    1096                 :             : 
    1097                 :             :   /* Default -Wabi= or -fabi-compat-version= from each other.  */
    1098                 :      203504 :   if (warn_abi_version == -1 && flag_abi_compat_version != -1)
    1099                 :         185 :     warn_abi_version = flag_abi_compat_version;
    1100                 :      203319 :   else if (flag_abi_compat_version == -1 && warn_abi_version != -1)
    1101                 :         566 :     flag_abi_compat_version = warn_abi_version;
    1102                 :      202753 :   else if (warn_abi_version == -1 && flag_abi_compat_version == -1)
    1103                 :             :     {
    1104                 :      202708 :       warn_abi_version = latest_abi_version;
    1105                 :      202708 :       if (flag_abi_version == latest_abi_version)
    1106                 :             :         {
    1107                 :      202488 :           auto_diagnostic_group d;
    1108                 :      202488 :           if (warning (OPT_Wabi, "%<-Wabi%> won%'t warn about anything"))
    1109                 :             :             {
    1110                 :           0 :               inform (input_location, "%<-Wabi%> warns about differences "
    1111                 :             :                       "from the most up-to-date ABI, which is also used "
    1112                 :             :                       "by default");
    1113                 :           0 :               inform (input_location, "use e.g. %<-Wabi=11%> to warn about "
    1114                 :             :                       "changes from GCC 7");
    1115                 :             :             }
    1116                 :      202488 :           flag_abi_compat_version = abi_compat_default;
    1117                 :      202488 :         }
    1118                 :             :       else
    1119                 :         220 :         flag_abi_compat_version = latest_abi_version;
    1120                 :             :     }
    1121                 :             : 
    1122                 :             :   /* By default, enable the new inheriting constructor semantics along with ABI
    1123                 :             :      11.  New and old should coexist fine, but it is a change in what
    1124                 :             :      artificial symbols are generated.  */
    1125                 :      406752 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1126                 :             :                        flag_new_inheriting_ctors,
    1127                 :             :                        abi_version_at_least (11));
    1128                 :             : 
    1129                 :             :   /* For GCC 7, only enable DR150 resolution by default if -std=c++17.  */
    1130                 :      203504 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set, flag_new_ttp,
    1131                 :             :                        cxx_dialect >= cxx17);
    1132                 :             : 
    1133                 :             :   /* C++11 guarantees forward progress.  */
    1134                 :      382093 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set, flag_finite_loops,
    1135                 :             :                        optimize >= 2 && cxx_dialect >= cxx11);
    1136                 :             : 
    1137                 :             :   /* It's OK to discard calls to pure/const functions that might throw.  */
    1138                 :      203504 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
    1139                 :             :                        flag_delete_dead_exceptions, true);
    1140                 :             : 
    1141                 :      203504 :   if (cxx_dialect >= cxx11)
    1142                 :             :     {
    1143                 :             :       /* If we're allowing C++0x constructs, don't warn about C++98
    1144                 :             :          identifiers which are keywords in C++0x.  */
    1145                 :       79102 :       warn_cxx11_compat = 0;
    1146                 :       79102 :       cpp_opts->cpp_warn_cxx11_compat = 0;
    1147                 :             : 
    1148                 :       79102 :       if (warn_narrowing == -1)
    1149                 :       76988 :         warn_narrowing = 1;
    1150                 :             : 
    1151                 :             :       /* Unless -f{,no-}ext-numeric-literals has been used explicitly,
    1152                 :             :          for -std=c++{11,14,17,20,23,26} default to
    1153                 :             :          -fno-ext-numeric-literals.  */
    1154                 :       79102 :       if (flag_iso && !OPTION_SET_P (flag_ext_numeric_literals))
    1155                 :       39746 :         cpp_opts->ext_numeric_literals = 0;
    1156                 :             :     }
    1157                 :      124402 :   else if (warn_narrowing == -1)
    1158                 :      123924 :     warn_narrowing = 0;
    1159                 :             : 
    1160                 :      203504 :   if (cxx_dialect >= cxx20)
    1161                 :             :     {
    1162                 :             :       /* Don't warn about C++20 compatibility changes in C++20 or later.  */
    1163                 :       28454 :       warn_cxx20_compat = 0;
    1164                 :       28454 :       cpp_opts->cpp_warn_cxx20_compat = 0;
    1165                 :             :     }
    1166                 :             : 
    1167                 :             :   /* C++17 has stricter evaluation order requirements; let's use some of them
    1168                 :             :      for earlier C++ as well, so chaining works as expected.  */
    1169                 :      203504 :   if (c_dialect_cxx ()
    1170                 :       92785 :       && flag_strong_eval_order == -1)
    1171                 :      112976 :     flag_strong_eval_order = (cxx_dialect >= cxx17 ? 2 : 1);
    1172                 :             : 
    1173                 :      203504 :   if (flag_implicit_constexpr && cxx_dialect < cxx14)
    1174                 :           0 :     flag_implicit_constexpr = false;
    1175                 :             : 
    1176                 :             :   /* Global sized deallocation is new in C++14.  */
    1177                 :      203504 :   if (flag_sized_deallocation == -1)
    1178                 :      203500 :     flag_sized_deallocation = (cxx_dialect >= cxx14);
    1179                 :             : 
    1180                 :             :   /* Pedwarn about invalid constexpr functions before C++23.  */
    1181                 :      203504 :   if (warn_invalid_constexpr == -1)
    1182                 :      203488 :     warn_invalid_constexpr = (cxx_dialect < cxx23);
    1183                 :             : 
    1184                 :             :   /* char8_t support is implicitly enabled in C++20 and C23.  */
    1185                 :      203504 :   if (flag_char8_t == -1)
    1186                 :      330170 :     flag_char8_t = (cxx_dialect >= cxx20) || flag_isoc23;
    1187                 :      203504 :   cpp_opts->unsigned_utf8char = flag_char8_t ? 1 : cpp_opts->unsigned_char;
    1188                 :             : 
    1189                 :      203504 :   cpp_opts->cpp_tabstop = global_dc->m_tabstop;
    1190                 :             : 
    1191                 :      203504 :   if (flag_extern_tls_init)
    1192                 :             :     {
    1193                 :      203502 :       if (!TARGET_SUPPORTS_ALIASES || !SUPPORTS_WEAK)
    1194                 :             :         {
    1195                 :             :           /* Lazy TLS initialization for a variable in another TU requires
    1196                 :             :              alias and weak reference support.  */
    1197                 :             :           if (flag_extern_tls_init > 0)
    1198                 :             :             sorry ("external TLS initialization functions not supported "
    1199                 :             :                    "on this target");
    1200                 :             : 
    1201                 :             :           flag_extern_tls_init = 0;
    1202                 :             :         }
    1203                 :             :       else
    1204                 :      203502 :         flag_extern_tls_init = 1;
    1205                 :             :     }
    1206                 :             : 
    1207                 :             :   /* Enable by default only for C++ and C++ with ObjC extensions.  */
    1208                 :      203504 :   if (warn_return_type == -1 && c_dialect_cxx ())
    1209                 :       89358 :     warn_return_type = 1;
    1210                 :             : 
    1211                 :             :   /* C++20 is the final version of concepts.  We still use -fconcepts
    1212                 :             :      to know when concepts are enabled.  */
    1213                 :      203504 :   if (cxx_dialect >= cxx20)
    1214                 :       28454 :     flag_concepts = 1;
    1215                 :             : 
    1216                 :             :   /* Enable lifetime extension of range based for temporaries for C++23.
    1217                 :             :      Diagnose -std=c++23 -fno-range-for-ext-temps.  */
    1218                 :      203504 :   if (cxx_dialect >= cxx23)
    1219                 :             :     {
    1220                 :       23753 :       if (OPTION_SET_P (flag_range_for_ext_temps)
    1221                 :           0 :           && !flag_range_for_ext_temps)
    1222                 :           0 :         error ("%<-fno-range-for-ext-temps%> is incompatible with C++23");
    1223                 :       23753 :       flag_range_for_ext_temps = 1;
    1224                 :             :     }
    1225                 :             :   /* Otherwise default to enabled in GNU modes but allow user to override.  */
    1226                 :      179751 :   else if (cxx_dialect >= cxx11
    1227                 :       55349 :            && !flag_iso
    1228                 :       31755 :            && !OPTION_SET_P (flag_range_for_ext_temps))
    1229                 :       31750 :     flag_range_for_ext_temps = 1;
    1230                 :             : 
    1231                 :             :   /* -fimmediate-escalation has no effect when immediate functions are not
    1232                 :             :      supported.  */
    1233                 :      203504 :   if (flag_immediate_escalation && cxx_dialect < cxx20)
    1234                 :      175050 :     flag_immediate_escalation = 0;
    1235                 :             : 
    1236                 :      203504 :   if (num_in_fnames > 1)
    1237                 :           0 :     error ("too many filenames given; type %<%s %s%> for usage",
    1238                 :             :            progname, "--help");
    1239                 :             : 
    1240                 :      203504 :   if (flag_preprocess_only)
    1241                 :             :     {
    1242                 :             :       /* Open the output now.  We must do so even if flag_no_output is
    1243                 :             :          on, because there may be other output than from the actual
    1244                 :             :          preprocessing (e.g. from -dM).  */
    1245                 :        6004 :       if (out_fname[0] == '\0')
    1246                 :         715 :         out_stream = stdout;
    1247                 :             :       else
    1248                 :        5289 :         out_stream = fopen (out_fname, "w");
    1249                 :             : 
    1250                 :        6004 :       if (out_stream == NULL)
    1251                 :           0 :         fatal_error (input_location, "opening output file %s: %m", out_fname);
    1252                 :             : 
    1253                 :        6004 :       init_pp_output (out_stream);
    1254                 :             :     }
    1255                 :             :   else
    1256                 :             :     {
    1257                 :      197500 :       init_c_lex ();
    1258                 :             : 
    1259                 :             :       /* When writing a PCH file, avoid reading some other PCH file,
    1260                 :             :          because the default address space slot then can't be used
    1261                 :             :          for the output PCH file.  */
    1262                 :      197500 :       if (pch_file)
    1263                 :             :         {
    1264                 :         478 :           c_common_no_more_pch ();
    1265                 :             :           /* Only -g0 and -gdwarf* are supported with PCH, for other
    1266                 :             :              debug formats we warn here and refuse to load any PCH files.  */
    1267                 :         478 :           if (write_symbols != NO_DEBUG && write_symbols != DWARF2_DEBUG)
    1268                 :           0 :               warning (OPT_Wdeprecated,
    1269                 :             :                        "the %qs debug info cannot be used with "
    1270                 :             :                        "pre-compiled headers",
    1271                 :             :                        debug_set_names (write_symbols & ~DWARF2_DEBUG));
    1272                 :             :           /* Let libcpp know that the main file is a header so it won't
    1273                 :             :              complain about things like #include_next and #pragma once.  */
    1274                 :         478 :           cpp_opts->main_search = CMS_header;
    1275                 :             :         }
    1276                 :      197022 :       else if (write_symbols != NO_DEBUG && write_symbols != DWARF2_DEBUG)
    1277                 :         500 :         c_common_no_more_pch ();
    1278                 :             : 
    1279                 :             :       /* Yuk.  WTF is this?  I do know ObjC relies on it somewhere.  */
    1280                 :      197500 :       input_location = UNKNOWN_LOCATION;
    1281                 :             :     }
    1282                 :             : 
    1283                 :      203504 :   struct cpp_callbacks *cb = cpp_get_callbacks (parse_in);
    1284                 :      203504 :   cb->file_change = cb_file_change;
    1285                 :      203504 :   cb->dir_change = cb_dir_change;
    1286                 :      203504 :   if (lang_hooks.preprocess_options)
    1287                 :       92785 :     lang_hooks.preprocess_options (parse_in);
    1288                 :      203504 :   cpp_post_options (parse_in);
    1289                 :      203504 :   init_global_opts_from_cpp (&global_options, cpp_get_options (parse_in));
    1290                 :             :   /* For C++23 and explicit -finput-charset=UTF-8, turn on -Winvalid-utf8
    1291                 :             :      by default and make it a pedwarn unless -Wno-invalid-utf8.  */
    1292                 :      203504 :   if (cxx_dialect >= cxx23
    1293                 :       23753 :       && cpp_opts->cpp_input_charset_explicit
    1294                 :          23 :       && strcmp (cpp_opts->input_charset, "UTF-8") == 0
    1295                 :          21 :       && (cpp_opts->cpp_warn_invalid_utf8
    1296                 :          16 :           || !global_options_set.x_warn_invalid_utf8))
    1297                 :             :     {
    1298                 :          18 :       global_options.x_warn_invalid_utf8 = 1;
    1299                 :          28 :       cpp_opts->cpp_warn_invalid_utf8 = cpp_opts->cpp_pedantic ? 2 : 1;
    1300                 :             :     }
    1301                 :             : 
    1302                 :             :   /* Let diagnostics infrastructure know how to convert input files the same
    1303                 :             :      way libcpp will do it, namely using the configured input charset and
    1304                 :             :      skipping a UTF-8 BOM if present.  */
    1305                 :      203504 :   diagnostic_initialize_input_context (global_dc,
    1306                 :             :                                        c_common_input_charset_cb, true);
    1307                 :      203504 :   input_location = UNKNOWN_LOCATION;
    1308                 :             : 
    1309                 :      407008 :   *pfilename = this_input_filename
    1310                 :      407008 :     = cpp_read_main_file (parse_in, in_fnames[0],
    1311                 :             :                           /* We'll inject preamble pieces if this is
    1312                 :             :                              not preprocessed.  */
    1313                 :      203504 :                           !cpp_opts->preprocessed);
    1314                 :             : 
    1315                 :             :   /* Don't do any compilation or preprocessing if there is no input file.  */
    1316                 :      203504 :   if (this_input_filename == NULL)
    1317                 :             :     {
    1318                 :           0 :       errorcount++;
    1319                 :           0 :       return false;
    1320                 :             :     }
    1321                 :             : 
    1322                 :      203504 :   if (flag_working_directory
    1323                 :       41479 :       && flag_preprocess_only && !flag_no_line_commands)
    1324                 :        2017 :     pp_dir_change (parse_in, get_src_pwd ());
    1325                 :             : 
    1326                 :             :   /* Disable LTO output when outputting a precompiled header.  */
    1327                 :      203504 :   if (pch_file && flag_lto)
    1328                 :             :     {
    1329                 :           0 :       flag_lto = 0;
    1330                 :           0 :       flag_generate_lto = 0;
    1331                 :             :     }
    1332                 :             : 
    1333                 :      203504 :   return flag_preprocess_only;
    1334                 :             : }
    1335                 :             : 
    1336                 :             : /* Front end initialization common to C, ObjC and C++.  */
    1337                 :             : bool
    1338                 :      203319 : c_common_init (void)
    1339                 :             : {
    1340                 :             :   /* Set up preprocessor arithmetic.  Must be done after call to
    1341                 :             :      c_common_nodes_and_builtins for type nodes to be good.  */
    1342                 :      203319 :   cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
    1343                 :      203319 :   cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
    1344                 :      203319 :   cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
    1345                 :      203319 :   cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
    1346                 :      203319 :   cpp_opts->unsigned_wchar = TYPE_UNSIGNED (wchar_type_node);
    1347                 :      203319 :   cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
    1348                 :             : 
    1349                 :             :   /* This can't happen until after wchar_precision and bytes_big_endian
    1350                 :             :      are known.  */
    1351                 :      203319 :   cpp_init_iconv (parse_in);
    1352                 :             : 
    1353                 :      203319 :   if (version_flag)
    1354                 :             :     {
    1355                 :         109 :       int i;
    1356                 :         109 :       fputs ("Compiler executable checksum: ", stderr);
    1357                 :        1962 :       for (i = 0; i < 16; i++)
    1358                 :        1744 :         fprintf (stderr, "%02x", executable_checksum[i]);
    1359                 :         109 :       putc ('\n', stderr);
    1360                 :             :     }
    1361                 :             : 
    1362                 :             :   /* Has to wait until now so that cpplib has its hash table.  */
    1363                 :      203319 :   init_pragma ();
    1364                 :             : 
    1365                 :      203319 :   if (flag_preprocess_only)
    1366                 :             :     {
    1367                 :        5999 :       c_init_preprocess ();
    1368                 :        5999 :       c_finish_options ();
    1369                 :        5999 :       preprocess_file (parse_in);
    1370                 :        5999 :       return false;
    1371                 :             :     }
    1372                 :             : 
    1373                 :             :   return true;
    1374                 :             : }
    1375                 :             : 
    1376                 :             : /* Initialize the integrated preprocessor after debug output has been
    1377                 :             :    initialized; loop over each input file.  */
    1378                 :             : void
    1379                 :      197320 : c_common_parse_file (void)
    1380                 :             : {
    1381                 :      197320 :   auto dumps = g->get_dumps ();
    1382                 :      197320 :   for (unsigned int i = 0;;)
    1383                 :             :     {
    1384                 :      197320 :       c_finish_options ();
    1385                 :             :       /* Open the dump file to use for the original dump output
    1386                 :             :          here, to be used during parsing for the current file.  */
    1387                 :      197320 :       dumps->dump_start (TDI_original, &dump_flags);
    1388                 :      197320 :       pch_init ();
    1389                 :      197320 :       push_file_scope ();
    1390                 :      197320 :       c_parse_file ();
    1391                 :      197048 :       pop_file_scope ();
    1392                 :             :       /* And end the main input file, if the debug writer wants it  */
    1393                 :      197048 :       if (debug_hooks->start_end_main_source_file)
    1394                 :       39276 :         (*debug_hooks->end_source_file) (0);
    1395                 :      197048 :       if (++i >= num_in_fnames)
    1396                 :             :         break;
    1397                 :           0 :       cpp_undef_all (parse_in);
    1398                 :           0 :       cpp_clear_file_cache (parse_in);
    1399                 :           0 :       this_input_filename
    1400                 :           0 :         = cpp_read_main_file (parse_in, in_fnames[i]);
    1401                 :             :       /* If an input file is missing, abandon further compilation.
    1402                 :             :          cpplib has issued a diagnostic.  */
    1403                 :           0 :       if (!this_input_filename)
    1404                 :             :         break;
    1405                 :           0 :       dumps->dump_finish (TDI_original);
    1406                 :             :     }
    1407                 :             : 
    1408                 :      197048 :   c_parse_final_cleanups ();
    1409                 :      197036 :   dumps->dump_finish (TDI_original);
    1410                 :      197036 : }
    1411                 :             : 
    1412                 :             : /* Common finish hook for the C, ObjC and C++ front ends.  */
    1413                 :             : void
    1414                 :      202845 : c_common_finish (void)
    1415                 :             : {
    1416                 :      202845 :   FILE *deps_stream = NULL;
    1417                 :      202845 :   FILE *fdeps_stream = NULL;
    1418                 :             : 
    1419                 :             :   /* Note that we write the dependencies even if there are errors. This is
    1420                 :             :      useful for handling outdated generated headers that now trigger errors
    1421                 :             :      (for example, with #error) which would be resolved by re-generating
    1422                 :             :      them. In a sense, this complements -MG.  */
    1423                 :      202845 :   if (cpp_opts->deps.style != DEPS_NONE)
    1424                 :             :     {
    1425                 :             :       /* If -M or -MM was seen without -MF, default output to the
    1426                 :             :          output stream.  */
    1427                 :        5720 :       if (!deps_file)
    1428                 :          22 :         deps_stream = out_stream;
    1429                 :        5698 :       else if (deps_file[0] == '-' && deps_file[1] == '\0')
    1430                 :           0 :         deps_stream = stdout;
    1431                 :             :       else
    1432                 :             :         {
    1433                 :       11396 :           deps_stream = fopen (deps_file, deps_append ? "a" : "w");
    1434                 :        5698 :           if (!deps_stream)
    1435                 :           0 :             fatal_error (input_location, "opening dependency file %s: %m",
    1436                 :             :                          deps_file);
    1437                 :             :         }
    1438                 :             :     }
    1439                 :             : 
    1440                 :             :   /* When we call cpp_finish (), it may generate some diagnostics using
    1441                 :             :      locations it remembered from the preprocessing phase, e.g. for
    1442                 :             :      -Wunused-macros.  So inform c_cpp_diagnostic () not to override those
    1443                 :             :      locations with input_location, which would be incorrect now.  */
    1444                 :      202845 :   override_libcpp_locations = false;
    1445                 :             : 
    1446                 :      202845 :   if (cpp_opts->deps.fdeps_format != FDEPS_FMT_NONE)
    1447                 :             :     {
    1448                 :          36 :       if (!fdeps_file)
    1449                 :           0 :         fdeps_stream = out_stream;
    1450                 :          36 :       else if (fdeps_file[0] == '-' && fdeps_file[1] == '\0')
    1451                 :           0 :         fdeps_stream = stdout;
    1452                 :             :       else
    1453                 :             :         {
    1454                 :          36 :           fdeps_stream = fopen (fdeps_file, "w");
    1455                 :          36 :           if (!fdeps_stream)
    1456                 :           0 :             fatal_error (input_location, "opening dependency file %s: %m",
    1457                 :             :                          fdeps_file);
    1458                 :             :         }
    1459                 :          36 :       if (fdeps_stream == deps_stream && fdeps_stream != stdout)
    1460                 :           0 :         fatal_error (input_location, "%<-MF%> and %<-fdeps-file=%> cannot share an output file %s: %m",
    1461                 :             :                      fdeps_file);
    1462                 :             :     }
    1463                 :             : 
    1464                 :             :   /* For performance, avoid tearing down cpplib's internal structures
    1465                 :             :      with cpp_destroy ().  */
    1466                 :      202845 :   cpp_finish (parse_in, deps_stream, fdeps_stream);
    1467                 :             : 
    1468                 :        5720 :   if (deps_stream && deps_stream != out_stream && deps_stream != stdout
    1469                 :      208543 :       && (ferror (deps_stream) || fclose (deps_stream)))
    1470                 :           0 :     fatal_error (input_location, "closing dependency file %s: %m", deps_file);
    1471                 :             : 
    1472                 :      202845 :   if (out_stream && (ferror (out_stream) || fclose (out_stream)))
    1473                 :           0 :     fatal_error (input_location, "when writing output to %s: %m", out_fname);
    1474                 :      202845 : }
    1475                 :             : 
    1476                 :             : /* Either of two environment variables can specify output of
    1477                 :             :    dependencies.  Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
    1478                 :             :    DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
    1479                 :             :    and DEPS_TARGET is the target to mention in the deps.  They also
    1480                 :             :    result in dependency information being appended to the output file
    1481                 :             :    rather than overwriting it, and like Sun's compiler
    1482                 :             :    SUNPRO_DEPENDENCIES suppresses the dependency on the main file.  */
    1483                 :             : static void
    1484                 :      197779 : check_deps_environment_vars (void)
    1485                 :             : {
    1486                 :      197779 :   char *spec;
    1487                 :             : 
    1488                 :      197779 :   spec = getenv ("DEPENDENCIES_OUTPUT");
    1489                 :      197779 :   if (spec)
    1490                 :           0 :     cpp_opts->deps.style = DEPS_USER;
    1491                 :             :   else
    1492                 :             :     {
    1493                 :      197779 :       spec = getenv ("SUNPRO_DEPENDENCIES");
    1494                 :      197779 :       if (spec)
    1495                 :             :         {
    1496                 :           0 :           cpp_opts->deps.style = DEPS_SYSTEM;
    1497                 :           0 :           cpp_opts->deps.ignore_main_file = true;
    1498                 :             :         }
    1499                 :             :     }
    1500                 :             : 
    1501                 :           0 :   if (spec)
    1502                 :             :     {
    1503                 :             :       /* Find the space before the DEPS_TARGET, if there is one.  */
    1504                 :           0 :       char *s = strchr (spec, ' ');
    1505                 :           0 :       if (s)
    1506                 :             :         {
    1507                 :             :           /* Let the caller perform MAKE quoting.  */
    1508                 :           0 :           defer_opt (OPT_MT, s + 1);
    1509                 :           0 :           *s = '\0';
    1510                 :             :         }
    1511                 :             : 
    1512                 :             :       /* Command line -MF overrides environment variables and default.  */
    1513                 :           0 :       if (!deps_file)
    1514                 :           0 :         deps_file = spec;
    1515                 :             : 
    1516                 :           0 :       deps_append = 1;
    1517                 :           0 :       deps_seen = true;
    1518                 :             :     }
    1519                 :      197779 : }
    1520                 :             : 
    1521                 :             : /* Handle deferred command line switches.  */
    1522                 :             : static void
    1523                 :      203504 : handle_deferred_opts (void)
    1524                 :             : {
    1525                 :             :   /* Avoid allocating the deps buffer if we don't need it.
    1526                 :             :      (This flag may be true without there having been -MT or -MQ
    1527                 :             :      options, but we'll still need the deps buffer.)  */
    1528                 :      203504 :   if (!deps_seen)
    1529                 :             :     return;
    1530                 :             : 
    1531                 :        5727 :   if (mkdeps *deps = cpp_get_deps (parse_in))
    1532                 :       34334 :     for (unsigned i = 0; i < deferred_count; i++)
    1533                 :             :       {
    1534                 :       28631 :         struct deferred_opt *opt = &deferred_opts[i];
    1535                 :             : 
    1536                 :       28631 :         if (opt->code == OPT_MT || opt->code == OPT_MQ)
    1537                 :        5696 :           deps_add_target (deps, opt->arg, opt->code == OPT_MQ);
    1538                 :       22935 :         else if (opt->code == OPT_fdeps_target_)
    1539                 :          42 :           fdeps_add_target (deps, opt->arg, true);
    1540                 :             :       }
    1541                 :             : }
    1542                 :             : 
    1543                 :             : /* These settings are appropriate for GCC, but not necessarily so for
    1544                 :             :    cpplib as a library.  */
    1545                 :             : static void
    1546                 :      203504 : sanitize_cpp_opts (void)
    1547                 :             : {
    1548                 :             :   /* If we don't know what style of dependencies to output, complain
    1549                 :             :      if any other dependency switches have been given.  */
    1550                 :      203504 :   if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
    1551                 :          24 :     error ("to generate dependencies you must specify either %<-M%> "
    1552                 :             :            "or %<-MM%>");
    1553                 :             : 
    1554                 :             :   /* -dM and dependencies suppress normal output; do it here so that
    1555                 :             :      the last -d[MDN] switch overrides earlier ones.  */
    1556                 :      203504 :   if (flag_dump_macros == 'M')
    1557                 :          80 :     flag_no_output = 1;
    1558                 :             : 
    1559                 :             :   /* By default, -fdirectives-only implies -dD.  This allows subsequent phases
    1560                 :             :      to perform proper macro expansion.  */
    1561                 :      203504 :   if (cpp_opts->directives_only && !cpp_opts->preprocessed && !flag_dump_macros)
    1562                 :          68 :     flag_dump_macros = 'D';
    1563                 :             : 
    1564                 :             :   /* Disable -dD, -dN and -dI if normal output is suppressed.  Allow
    1565                 :             :      -dM since at least glibc relies on -M -dM to work.  */
    1566                 :             :   /* Also, flag_no_output implies flag_no_line_commands, always.  */
    1567                 :      203504 :   if (flag_no_output)
    1568                 :             :     {
    1569                 :         104 :       if (flag_dump_macros != 'M')
    1570                 :          24 :         flag_dump_macros = 0;
    1571                 :         104 :       flag_dump_includes = 0;
    1572                 :         104 :       flag_no_line_commands = 1;
    1573                 :             :     }
    1574                 :      203400 :   else if (cpp_opts->deps.missing_files)
    1575                 :           1 :     error ("%<-MG%> may only be used with %<-M%> or %<-MM%>");
    1576                 :             : 
    1577                 :      203504 :   cpp_opts->unsigned_char = !flag_signed_char;
    1578                 :      203504 :   cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
    1579                 :             : 
    1580                 :             :   /* Wlong-long is disabled by default. It is enabled by:
    1581                 :             :       [-Wpedantic | -Wtraditional] -std=[gnu|c]++98 ; or
    1582                 :             :       [-Wpedantic | -Wtraditional] -std=non-c99
    1583                 :             : 
    1584                 :             :       Either -Wlong-long or -Wno-long-long override any other settings.
    1585                 :             :       ??? These conditions should be handled in c.opt.  */
    1586                 :      203504 :   if (warn_long_long == -1)
    1587                 :             :     {
    1588                 :      157845 :       warn_long_long = ((pedantic || warn_traditional)
    1589                 :      161378 :                         && (c_dialect_cxx () ? cxx_dialect == cxx98 : !flag_isoc99));
    1590                 :      161354 :       cpp_opts->cpp_warn_long_long = warn_long_long;
    1591                 :             :     }
    1592                 :             : 
    1593                 :             :   /* If we're generating preprocessor output, emit current directory
    1594                 :             :      if explicitly requested or if debugging information is enabled.
    1595                 :             :      ??? Maybe we should only do it for debugging formats that
    1596                 :             :      actually output the current directory?  */
    1597                 :      203504 :   if (flag_working_directory == -1)
    1598                 :      202237 :     flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
    1599                 :             : 
    1600                 :      203504 :   if (warn_implicit_fallthrough < 5)
    1601                 :      203500 :     cpp_opts->cpp_warn_implicit_fallthrough = warn_implicit_fallthrough;
    1602                 :             :   else
    1603                 :           4 :     cpp_opts->cpp_warn_implicit_fallthrough = 0;
    1604                 :             : 
    1605                 :      203504 :   if (cpp_opts->directives_only)
    1606                 :             :     {
    1607                 :         109 :       if (cpp_warn_unused_macros)
    1608                 :           4 :         error ("%<-fdirectives-only%> is incompatible "
    1609                 :             :                "with %<-Wunused-macros%>");
    1610                 :         109 :       if (cpp_opts->traditional)
    1611                 :           1 :         error ("%<-fdirectives-only%> is incompatible with %<-traditional%>");
    1612                 :             :     }
    1613                 :      203504 : }
    1614                 :             : 
    1615                 :             : /* Add include path with a prefix at the front of its name.  */
    1616                 :             : static void
    1617                 :           0 : add_prefixed_path (const char *suffix, incpath_kind chain)
    1618                 :             : {
    1619                 :           0 :   char *path;
    1620                 :           0 :   const char *prefix;
    1621                 :           0 :   size_t prefix_len, suffix_len;
    1622                 :             : 
    1623                 :           0 :   suffix_len = strlen (suffix);
    1624                 :           0 :   prefix     = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
    1625                 :           0 :   prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
    1626                 :             : 
    1627                 :           0 :   path = (char *) xmalloc (prefix_len + suffix_len + 1);
    1628                 :           0 :   memcpy (path, prefix, prefix_len);
    1629                 :           0 :   memcpy (path + prefix_len, suffix, suffix_len);
    1630                 :           0 :   path[prefix_len + suffix_len] = '\0';
    1631                 :             : 
    1632                 :           0 :   add_path (path, chain, 0, false);
    1633                 :           0 : }
    1634                 :             : 
    1635                 :             : /* Handle -D, -U, -A, -imacros, and the first -include.  */
    1636                 :             : static void
    1637                 :      203319 : c_finish_options (void)
    1638                 :             : {
    1639                 :      203319 :   if (!cpp_opts->preprocessed)
    1640                 :             :     {
    1641                 :      202797 :       const line_map_ordinary *bltin_map
    1642                 :      202797 :         = linemap_check_ordinary (linemap_add (line_table, LC_RENAME, 0,
    1643                 :             :                                                special_fname_builtin (), 0));
    1644                 :      202797 :       cb_file_change (parse_in, bltin_map);
    1645                 :      202797 :       linemap_line_start (line_table, 0, 1);
    1646                 :             : 
    1647                 :             :       /* Make sure all of the builtins about to be declared have
    1648                 :             :          BUILTINS_LOCATION has their location_t.  */
    1649                 :      202797 :       cpp_force_token_locations (parse_in, BUILTINS_LOCATION);
    1650                 :             : 
    1651                 :      202797 :       cpp_init_builtins (parse_in, flag_hosted);
    1652                 :      202797 :       c_cpp_builtins (parse_in);
    1653                 :             : 
    1654                 :             :       /* We're about to send user input to cpplib, so make it warn for
    1655                 :             :          things that we previously (when we sent it internal definitions)
    1656                 :             :          told it to not warn.
    1657                 :             : 
    1658                 :             :          C99 permits implementation-defined characters in identifiers.
    1659                 :             :          The documented meaning of -std= is to turn off extensions that
    1660                 :             :          conflict with the specified standard, and since a strictly
    1661                 :             :          conforming program cannot contain a '$', we do not condition
    1662                 :             :          their acceptance on the -std= setting.  */
    1663                 :      202797 :       cpp_opts->warn_dollars = (cpp_opts->cpp_pedantic && !cpp_opts->c99);
    1664                 :             : 
    1665                 :      202797 :       const line_map_ordinary *cmd_map
    1666                 :      202797 :         = linemap_check_ordinary (linemap_add (line_table, LC_RENAME, 0,
    1667                 :      202797 :                                                _("<command-line>"), 0));
    1668                 :      202797 :       cb_file_change (parse_in, cmd_map);
    1669                 :      202797 :       linemap_line_start (line_table, 0, 1);
    1670                 :             : 
    1671                 :      202797 :       bool fortify_seen_p = false;
    1672                 :      202797 :       bool cxx_assert_seen_p = false;
    1673                 :             : 
    1674                 :             :       /* All command line defines must have the same location.  */
    1675                 :      202797 :       cpp_force_token_locations (parse_in, line_table->highest_line);
    1676                 :      375974 :       for (size_t i = 0; i < deferred_count; i++)
    1677                 :             :         {
    1678                 :      173177 :           struct deferred_opt *opt = &deferred_opts[i];
    1679                 :             : 
    1680                 :      173177 :           if (opt->code == OPT_D)
    1681                 :      157692 :             cpp_define (parse_in, opt->arg);
    1682                 :       15485 :           else if (opt->code == OPT_U)
    1683                 :          59 :             cpp_undef (parse_in, opt->arg);
    1684                 :       15426 :           else if (opt->code == OPT_A)
    1685                 :             :             {
    1686                 :          10 :               if (opt->arg[0] == '-')
    1687                 :           2 :                 cpp_unassert (parse_in, opt->arg + 1);
    1688                 :             :               else
    1689                 :           8 :                 cpp_assert (parse_in, opt->arg);
    1690                 :             :             }
    1691                 :             : 
    1692                 :      173177 :           if (UNLIKELY (flag_hardened)
    1693                 :          65 :               && (opt->code == OPT_D || opt->code == OPT_U))
    1694                 :             :             {
    1695                 :          65 :               if (!fortify_seen_p)
    1696                 :          61 :                 fortify_seen_p
    1697                 :          61 :                   = (!strncmp (opt->arg, "_FORTIFY_SOURCE", 15)
    1698                 :          61 :                      && (opt->arg[15] == '\0' || opt->arg[15] == '='));
    1699                 :          65 :               if (!cxx_assert_seen_p)
    1700                 :          65 :                 cxx_assert_seen_p
    1701                 :          65 :                   = (!strncmp (opt->arg, "_GLIBCXX_ASSERTIONS", 19)
    1702                 :          65 :                      && (opt->arg[19] == '\0' || opt->arg[19] == '='));
    1703                 :             :             }
    1704                 :             :         }
    1705                 :             : 
    1706                 :      202797 :       if (flag_hardened)
    1707                 :             :         {
    1708                 :          67 :           if (!fortify_seen_p && optimize > 0)
    1709                 :          47 :             cpp_define_formatted (parse_in, "_FORTIFY_SOURCE=%u",
    1710                 :          47 :                                   targetm.fortify_source_default_level ());
    1711                 :          20 :           else if (optimize == 0)
    1712                 :          20 :             warning_at (UNKNOWN_LOCATION, OPT_Whardened,
    1713                 :             :                         "%<_FORTIFY_SOURCE%> is not enabled by %<-fhardened%> "
    1714                 :             :                         "because optimizations are turned off");
    1715                 :             :           else
    1716                 :           0 :             warning_at (UNKNOWN_LOCATION, OPT_Whardened,
    1717                 :             :                         "%<_FORTIFY_SOURCE%> is not enabled by %<-fhardened%> "
    1718                 :             :                         "because it was specified in %<-D%> or %<-U%>");
    1719                 :          67 :           if (!cxx_assert_seen_p)
    1720                 :          63 :             cpp_define (parse_in, "_GLIBCXX_ASSERTIONS");
    1721                 :             :           else
    1722                 :           4 :             warning_at (UNKNOWN_LOCATION, OPT_Whardened,
    1723                 :             :                         "%<_GLIBCXX_ASSERTIONS%> is not enabled by "
    1724                 :             :                         "%<-fhardened%> because it was specified in %<-D%> "
    1725                 :             :                         "or %<-U%>");
    1726                 :             :         }
    1727                 :             : 
    1728                 :      202797 :       cpp_stop_forcing_token_locations (parse_in);
    1729                 :             :     }
    1730                 :         522 :   else if (cpp_opts->directives_only)
    1731                 :          41 :     cpp_init_special_builtins (parse_in);
    1732                 :             : 
    1733                 :             :   /* Start the main input file, if the debug writer wants it. */
    1734                 :      203319 :   if (debug_hooks->start_end_main_source_file
    1735                 :       41410 :       && !flag_preprocess_only)
    1736                 :       39389 :     (*debug_hooks->start_source_file) (0, this_input_filename);
    1737                 :             : 
    1738                 :      203319 :   if (!cpp_opts->preprocessed)
    1739                 :             :     /* Handle -imacros after -D and -U.  */
    1740                 :      375974 :     for (size_t i = 0; i < deferred_count; i++)
    1741                 :             :       {
    1742                 :      173177 :         struct deferred_opt *opt = &deferred_opts[i];
    1743                 :             : 
    1744                 :      173177 :         if (opt->code == OPT_imacros
    1745                 :      173177 :             && cpp_push_include (parse_in, opt->arg))
    1746                 :             :           {
    1747                 :             :             /* Disable push_command_line_include callback for now.  */
    1748                 :           8 :             include_cursor = deferred_count + 1;
    1749                 :           8 :             cpp_scan_nooutput (parse_in);
    1750                 :             :           }
    1751                 :             :       }
    1752                 :             : 
    1753                 :      203319 :   include_cursor = 0;
    1754                 :      203319 :   push_command_line_include ();
    1755                 :      203319 : }
    1756                 :             : 
    1757                 :             : /* Give CPP the next file given by -include, if any.  */
    1758                 :             : static void
    1759                 :      717878 : push_command_line_include (void)
    1760                 :             : {
    1761                 :             :   /* This can happen if disabled by -imacros for example.
    1762                 :             :      Punt so that we don't set "<command-line>" as the filename for
    1763                 :             :      the header.  */
    1764                 :      717878 :   if (include_cursor > deferred_count)
    1765                 :             :     return;
    1766                 :             : 
    1767                 :      415703 :   if (!done_preinclude)
    1768                 :             :     {
    1769                 :      203319 :       done_preinclude = true;
    1770                 :      203319 :       if (flag_hosted && std_inc && !cpp_opts->preprocessed)
    1771                 :             :         {
    1772                 :      202717 :           const char *preinc = targetcm.c_preinclude ();
    1773                 :      202717 :           if (preinc && cpp_push_default_include (parse_in, preinc))
    1774                 :             :             return;
    1775                 :             :         }
    1776                 :             :     }
    1777                 :             : 
    1778                 :      212986 :   pch_cpp_save_state ();
    1779                 :             : 
    1780                 :      589531 :   while (include_cursor < deferred_count)
    1781                 :             :     {
    1782                 :      173227 :       struct deferred_opt *opt = &deferred_opts[include_cursor++];
    1783                 :             : 
    1784                 :      346403 :       if (!cpp_opts->preprocessed && opt->code == OPT_include
    1785                 :      182898 :           && cpp_push_include (parse_in, opt->arg))
    1786                 :             :         return;
    1787                 :             :     }
    1788                 :             : 
    1789                 :      203318 :   if (include_cursor == deferred_count)
    1790                 :             :     {
    1791                 :      203318 :       include_cursor++;
    1792                 :             :       /* -Wunused-macros should only warn about macros defined hereafter.  */
    1793                 :      203318 :       cpp_opts->warn_unused_macros = cpp_warn_unused_macros;
    1794                 :             :       /* Restore the line map back to the main file.  */
    1795                 :      203318 :       if (!cpp_opts->preprocessed)
    1796                 :             :         {
    1797                 :      202796 :           cpp_change_file (parse_in, LC_RENAME, this_input_filename);
    1798                 :      202796 :           if (lang_hooks.preprocess_main_file)
    1799                 :             :             /* We're starting the main file.  Inform the FE of that.  */
    1800                 :       92531 :             lang_hooks.preprocess_main_file
    1801                 :       92531 :               (parse_in, line_table, LINEMAPS_LAST_ORDINARY_MAP (line_table));
    1802                 :             :         }
    1803                 :             : 
    1804                 :             :       /* Set this here so the client can change the option if it wishes,
    1805                 :             :          and after stacking the main file so we don't trace the main file.  */
    1806                 :      203318 :       line_table->trace_includes = cpp_opts->print_include_names;
    1807                 :             :     }
    1808                 :             : }
    1809                 :             : 
    1810                 :             : /* File change callback.  Has to handle -include files.  */
    1811                 :             : static void
    1812                 :    18727041 : cb_file_change (cpp_reader *reader, const line_map_ordinary *new_map)
    1813                 :             : {
    1814                 :    18727041 :   if (flag_preprocess_only)
    1815                 :      135960 :     pp_file_change (new_map);
    1816                 :             :   else
    1817                 :    18591081 :     fe_file_change (new_map);
    1818                 :             : 
    1819                 :    18524102 :   if (new_map && cpp_opts->preprocessed
    1820                 :       37725 :       && lang_hooks.preprocess_main_file && MAIN_FILE_P (new_map)
    1821                 :    18729581 :       && ORDINARY_MAP_STARTING_LINE_NUMBER (new_map))
    1822                 :             :     /* We're starting the main file.  Inform the FE of that.  */
    1823                 :         448 :     lang_hooks.preprocess_main_file (reader, line_table, new_map);
    1824                 :             : 
    1825                 :    18727041 :   if (new_map
    1826                 :    18524102 :       && (new_map->reason == LC_ENTER || new_map->reason == LC_RENAME))
    1827                 :             :     {
    1828                 :             :       /* Signal to plugins that a file is included.  This could happen
    1829                 :             :          several times with the same file path, e.g. because of
    1830                 :             :          several '#include' or '#line' directives...  */
    1831                 :     9669593 :       invoke_plugin_callbacks
    1832                 :     9669593 :         (PLUGIN_INCLUDE_FILE,
    1833                 :     9669593 :          const_cast<char*> (ORDINARY_MAP_FILE_NAME (new_map)));
    1834                 :             :     }
    1835                 :             : 
    1836                 :    18524102 :   if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
    1837                 :             :     {
    1838                 :      514559 :       pch_cpp_save_state ();
    1839                 :      514559 :       push_command_line_include ();
    1840                 :             :     }
    1841                 :    18727040 : }
    1842                 :             : 
    1843                 :             : void
    1844                 :          52 : cb_dir_change (cpp_reader * ARG_UNUSED (pfile), const char *dir)
    1845                 :             : {
    1846                 :          52 :   if (!set_src_pwd (dir))
    1847                 :           0 :     warning (0, "too late for # directive to set debug directory");
    1848                 :          52 : }
    1849                 :             : 
    1850                 :             : /* Set the C 89 standard (with 1994 amendments if C94, without GNU
    1851                 :             :    extensions if ISO).  There is no concept of gnu94.  */
    1852                 :             : static void
    1853                 :        6317 : set_std_c89 (int c94, int iso)
    1854                 :             : {
    1855                 :        9268 :   cpp_set_lang (parse_in, c94 ? CLK_STDC94 : iso ? CLK_STDC89 : CLK_GNUC89);
    1856                 :        6317 :   flag_iso = iso;
    1857                 :        6317 :   flag_no_asm = iso;
    1858                 :        6317 :   flag_no_gnu_keywords = iso;
    1859                 :        6317 :   flag_no_nonansi_builtin = iso;
    1860                 :        6317 :   flag_isoc94 = c94;
    1861                 :        6317 :   flag_isoc99 = 0;
    1862                 :        6317 :   flag_isoc11 = 0;
    1863                 :        6317 :   flag_isoc23 = 0;
    1864                 :        6317 :   flag_isoc2y = 0;
    1865                 :        6317 :   lang_hooks.name = "GNU C89";
    1866                 :        6317 : }
    1867                 :             : 
    1868                 :             : /* Set the C 99 standard (without GNU extensions if ISO).  */
    1869                 :             : static void
    1870                 :        1182 : set_std_c99 (int iso)
    1871                 :             : {
    1872                 :        1794 :   cpp_set_lang (parse_in, iso ? CLK_STDC99 : CLK_GNUC99);
    1873                 :        1182 :   flag_no_asm = iso;
    1874                 :        1182 :   flag_no_nonansi_builtin = iso;
    1875                 :        1182 :   flag_iso = iso;
    1876                 :        1182 :   flag_isoc2y = 0;
    1877                 :        1182 :   flag_isoc23 = 0;
    1878                 :        1182 :   flag_isoc11 = 0;
    1879                 :        1182 :   flag_isoc99 = 1;
    1880                 :        1182 :   flag_isoc94 = 1;
    1881                 :        1182 :   lang_hooks.name = "GNU C99";
    1882                 :        1182 : }
    1883                 :             : 
    1884                 :             : /* Set the C 11 standard (without GNU extensions if ISO).  */
    1885                 :             : static void
    1886                 :        4070 : set_std_c11 (int iso)
    1887                 :             : {
    1888                 :        7632 :   cpp_set_lang (parse_in, iso ? CLK_STDC11 : CLK_GNUC11);
    1889                 :        4070 :   flag_no_asm = iso;
    1890                 :        4070 :   flag_no_nonansi_builtin = iso;
    1891                 :        4070 :   flag_iso = iso;
    1892                 :        4070 :   flag_isoc2y = 0;
    1893                 :        4070 :   flag_isoc23 = 0;
    1894                 :        4070 :   flag_isoc11 = 1;
    1895                 :        4070 :   flag_isoc99 = 1;
    1896                 :        4070 :   flag_isoc94 = 1;
    1897                 :        4070 :   lang_hooks.name = "GNU C11";
    1898                 :        4070 : }
    1899                 :             : 
    1900                 :             : /* Set the C 17 standard (without GNU extensions if ISO).  */
    1901                 :             : static void
    1902                 :         818 : set_std_c17 (int iso)
    1903                 :             : {
    1904                 :        1598 :   cpp_set_lang (parse_in, iso ? CLK_STDC17 : CLK_GNUC17);
    1905                 :         818 :   flag_no_asm = iso;
    1906                 :         818 :   flag_no_nonansi_builtin = iso;
    1907                 :         818 :   flag_iso = iso;
    1908                 :         818 :   flag_isoc2y = 0;
    1909                 :         818 :   flag_isoc23 = 0;
    1910                 :         818 :   flag_isoc11 = 1;
    1911                 :         818 :   flag_isoc99 = 1;
    1912                 :         818 :   flag_isoc94 = 1;
    1913                 :         818 :   lang_hooks.name = "GNU C17";
    1914                 :         818 : }
    1915                 :             : 
    1916                 :             : /* Set the C 23 standard (without GNU extensions if ISO).  */
    1917                 :             : static void
    1918                 :      111784 : set_std_c23 (int iso)
    1919                 :             : {
    1920                 :      222794 :   cpp_set_lang (parse_in, iso ? CLK_STDC23 : CLK_GNUC23);
    1921                 :      111784 :   flag_no_asm = iso;
    1922                 :      111784 :   flag_no_nonansi_builtin = iso;
    1923                 :      111784 :   flag_iso = iso;
    1924                 :      111784 :   flag_isoc2y = 0;
    1925                 :      111784 :   flag_isoc23 = 1;
    1926                 :      111784 :   flag_isoc11 = 1;
    1927                 :      111784 :   flag_isoc99 = 1;
    1928                 :      111784 :   flag_isoc94 = 1;
    1929                 :      111784 :   lang_hooks.name = "GNU C23";
    1930                 :      111784 : }
    1931                 :             : 
    1932                 :             : /* Set the C 2Y standard (without GNU extensions if ISO).  */
    1933                 :             : static void
    1934                 :         144 : set_std_c2y (int iso)
    1935                 :             : {
    1936                 :         149 :   cpp_set_lang (parse_in, iso ? CLK_STDC2Y : CLK_GNUC2Y);
    1937                 :         144 :   flag_no_asm = iso;
    1938                 :         144 :   flag_no_nonansi_builtin = iso;
    1939                 :         144 :   flag_iso = iso;
    1940                 :         144 :   flag_isoc2y = 1;
    1941                 :         144 :   flag_isoc23 = 1;
    1942                 :         144 :   flag_isoc11 = 1;
    1943                 :         144 :   flag_isoc99 = 1;
    1944                 :         144 :   flag_isoc94 = 1;
    1945                 :         144 :   lang_hooks.name = "GNU C2Y";
    1946                 :         144 : }
    1947                 :             : 
    1948                 :             : 
    1949                 :             : /* Set the C++ 98 standard (without GNU extensions if ISO).  */
    1950                 :             : static void
    1951                 :       13753 : set_std_cxx98 (int iso)
    1952                 :             : {
    1953                 :       18917 :   cpp_set_lang (parse_in, iso ? CLK_CXX98 : CLK_GNUCXX);
    1954                 :       13753 :   flag_no_gnu_keywords = iso;
    1955                 :       13753 :   flag_no_nonansi_builtin = iso;
    1956                 :       13753 :   flag_iso = iso;
    1957                 :       13753 :   flag_isoc94 = 0;
    1958                 :       13753 :   flag_isoc99 = 0;
    1959                 :       13753 :   cxx_dialect = cxx98;
    1960                 :       13753 :   lang_hooks.name = "GNU C++98";
    1961                 :       13753 : }
    1962                 :             : 
    1963                 :             : /* Set the C++ 2011 standard (without GNU extensions if ISO).  */
    1964                 :             : static void
    1965                 :        5370 : set_std_cxx11 (int iso)
    1966                 :             : {
    1967                 :        6675 :   cpp_set_lang (parse_in, iso ? CLK_CXX11 : CLK_GNUCXX11);
    1968                 :        5370 :   flag_no_gnu_keywords = iso;
    1969                 :        5370 :   flag_no_nonansi_builtin = iso;
    1970                 :        5370 :   flag_iso = iso;
    1971                 :             :   /* C++11 includes the C99 standard library.  */
    1972                 :        5370 :   flag_isoc94 = 1;
    1973                 :        5370 :   flag_isoc99 = 1;
    1974                 :        5370 :   cxx_dialect = cxx11;
    1975                 :        5370 :   lang_hooks.name = "GNU C++11";
    1976                 :        5370 : }
    1977                 :             : 
    1978                 :             : /* Set the C++ 2014 standard (without GNU extensions if ISO).  */
    1979                 :             : static void
    1980                 :        1187 : set_std_cxx14 (int iso)
    1981                 :             : {
    1982                 :        1397 :   cpp_set_lang (parse_in, iso ? CLK_CXX14 : CLK_GNUCXX14);
    1983                 :        1187 :   flag_no_gnu_keywords = iso;
    1984                 :        1187 :   flag_no_nonansi_builtin = iso;
    1985                 :        1187 :   flag_iso = iso;
    1986                 :             :   /* C++14 includes the C99 standard library.  */
    1987                 :        1187 :   flag_isoc94 = 1;
    1988                 :        1187 :   flag_isoc99 = 1;
    1989                 :        1187 :   cxx_dialect = cxx14;
    1990                 :        1187 :   lang_hooks.name = "GNU C++14";
    1991                 :        1187 : }
    1992                 :             : 
    1993                 :             : /* Set the C++ 2017 standard (without GNU extensions if ISO).  */
    1994                 :             : static void
    1995                 :      122447 : set_std_cxx17 (int iso)
    1996                 :             : {
    1997                 :      229687 :   cpp_set_lang (parse_in, iso ? CLK_CXX17 : CLK_GNUCXX17);
    1998                 :      122447 :   flag_no_gnu_keywords = iso;
    1999                 :      122447 :   flag_no_nonansi_builtin = iso;
    2000                 :      122447 :   flag_iso = iso;
    2001                 :             :   /* C++17 includes the C11 standard library.  */
    2002                 :      122447 :   flag_isoc94 = 1;
    2003                 :      122447 :   flag_isoc99 = 1;
    2004                 :      122447 :   flag_isoc11 = 1;
    2005                 :      122447 :   cxx_dialect = cxx17;
    2006                 :      122447 :   lang_hooks.name = "GNU C++17";
    2007                 :      122447 : }
    2008                 :             : 
    2009                 :             : /* Set the C++ 2020 standard (without GNU extensions if ISO).  */
    2010                 :             : static void
    2011                 :        4714 : set_std_cxx20 (int iso)
    2012                 :             : {
    2013                 :        6049 :   cpp_set_lang (parse_in, iso ? CLK_CXX20 : CLK_GNUCXX20);
    2014                 :        4714 :   flag_no_gnu_keywords = iso;
    2015                 :        4714 :   flag_no_nonansi_builtin = iso;
    2016                 :        4714 :   flag_iso = iso;
    2017                 :             :   /* C++20 includes the C11 standard library.  */
    2018                 :        4714 :   flag_isoc94 = 1;
    2019                 :        4714 :   flag_isoc99 = 1;
    2020                 :        4714 :   flag_isoc11 = 1;
    2021                 :             :   /* C++20 includes coroutines. */
    2022                 :        4714 :   flag_coroutines = true;
    2023                 :        4714 :   cxx_dialect = cxx20;
    2024                 :        4714 :   lang_hooks.name = "GNU C++20";
    2025                 :        4714 : }
    2026                 :             : 
    2027                 :             : /* Set the C++ 2023 standard (without GNU extensions if ISO).  */
    2028                 :             : static void
    2029                 :        2762 : set_std_cxx23 (int iso)
    2030                 :             : {
    2031                 :        3128 :   cpp_set_lang (parse_in, iso ? CLK_CXX23 : CLK_GNUCXX23);
    2032                 :        2762 :   flag_no_gnu_keywords = iso;
    2033                 :        2762 :   flag_no_nonansi_builtin = iso;
    2034                 :        2762 :   flag_iso = iso;
    2035                 :             :   /* C++23 includes the C11 standard library.  */
    2036                 :        2762 :   flag_isoc94 = 1;
    2037                 :        2762 :   flag_isoc99 = 1;
    2038                 :        2762 :   flag_isoc11 = 1;
    2039                 :             :   /* C++23 includes coroutines.  */
    2040                 :        2762 :   flag_coroutines = true;
    2041                 :        2762 :   cxx_dialect = cxx23;
    2042                 :        2762 :   lang_hooks.name = "GNU C++23";
    2043                 :        2762 : }
    2044                 :             : 
    2045                 :             : /* Set the C++ 2026 standard (without GNU extensions if ISO).  */
    2046                 :             : static void
    2047                 :       21039 : set_std_cxx26 (int iso)
    2048                 :             : {
    2049                 :       28318 :   cpp_set_lang (parse_in, iso ? CLK_CXX26 : CLK_GNUCXX26);
    2050                 :       21039 :   flag_no_gnu_keywords = iso;
    2051                 :       21039 :   flag_no_nonansi_builtin = iso;
    2052                 :       21039 :   flag_iso = iso;
    2053                 :             :   /* C++26 includes the C11 standard library.  */
    2054                 :       21039 :   flag_isoc94 = 1;
    2055                 :       21039 :   flag_isoc99 = 1;
    2056                 :       21039 :   flag_isoc11 = 1;
    2057                 :             :   /* C++26 includes coroutines.  */
    2058                 :       21039 :   flag_coroutines = true;
    2059                 :       21039 :   cxx_dialect = cxx26;
    2060                 :       21039 :   lang_hooks.name = "GNU C++26";
    2061                 :       21039 : }
    2062                 :             : 
    2063                 :             : /* Args to -d specify what to dump.  Silently ignore
    2064                 :             :    unrecognized options; they may be aimed at toplev.cc.  */
    2065                 :             : static void
    2066                 :        1587 : handle_OPT_d (const char *arg)
    2067                 :             : {
    2068                 :        1587 :   char c;
    2069                 :             : 
    2070                 :        3174 :   while ((c = *arg++) != '\0')
    2071                 :        1587 :     switch (c)
    2072                 :             :       {
    2073                 :         777 :       case 'M':                 /* Dump macros only.  */
    2074                 :         777 :       case 'N':                 /* Dump names.  */
    2075                 :         777 :       case 'D':                 /* Dump definitions.  */
    2076                 :         777 :       case 'U':                 /* Dump used macros.  */
    2077                 :         777 :         flag_dump_macros = c;
    2078                 :         777 :         break;
    2079                 :             : 
    2080                 :           2 :       case 'I':
    2081                 :           2 :         flag_dump_includes = 1;
    2082                 :           2 :         break;
    2083                 :             :       }
    2084                 :        1587 : }
        

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.