LCOV - code coverage report
Current view: top level - gcc/fortran - options.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 88.8 % 448 398
Test Date: 2024-09-28 13:20:55 Functions: 85.7 % 14 12
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* Parse and display command line options.
       2                 :             :    Copyright (C) 2000-2024 Free Software Foundation, Inc.
       3                 :             :    Contributed by Andy Vaught
       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 "target.h"
      25                 :             : #include "tree.h"
      26                 :             : #include "gfortran.h"
      27                 :             : #include "diagnostic.h"       /* For global_dc.  */
      28                 :             : #include "opts.h"
      29                 :             : #include "toplev.h"  /* For save_decoded_options.  */
      30                 :             : #include "cpp.h"
      31                 :             : #include "langhooks.h"
      32                 :             : 
      33                 :             : gfc_option_t gfc_option;
      34                 :             : 
      35                 :             : #define SET_FLAG(flag, condition, on_value, off_value) \
      36                 :             :   do \
      37                 :             :     { \
      38                 :             :       if (condition) \
      39                 :             :         flag = (on_value); \
      40                 :             :       else \
      41                 :             :         flag = (off_value); \
      42                 :             :     } while (0)
      43                 :             : 
      44                 :             : #define SET_BITFLAG2(m) m
      45                 :             : 
      46                 :             : #define SET_BITFLAG(flag, condition, value) \
      47                 :             :   SET_BITFLAG2 (SET_FLAG (flag, condition, (flag | (value)), (flag & ~(value))))
      48                 :             : 
      49                 :             : 
      50                 :             : /* Set flags that control warnings and errors for different
      51                 :             :    Fortran standards to their default values.  Keep in sync with
      52                 :             :    libgfortran/runtime/compile_options.c (init_compile_options).  */
      53                 :             : 
      54                 :             : static void
      55                 :       31332 : set_default_std_flags (void)
      56                 :             : {
      57                 :       31332 :   gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
      58                 :             :     | GFC_STD_F2003 | GFC_STD_F2008 | GFC_STD_F95 | GFC_STD_F77
      59                 :             :     | GFC_STD_F2008_OBS | GFC_STD_GNU | GFC_STD_LEGACY
      60                 :             :     | GFC_STD_F2018 | GFC_STD_F2018_DEL | GFC_STD_F2018_OBS | GFC_STD_F2023
      61                 :             :     | GFC_STD_F2023_DEL;
      62                 :       31332 :   gfc_option.warn_std = GFC_STD_F2018_DEL | GFC_STD_F95_DEL | GFC_STD_LEGACY
      63                 :             :     | GFC_STD_F2023_DEL;
      64                 :         385 : }
      65                 :             : 
      66                 :             : /* Set (or unset) the DEC extension flags.  */
      67                 :             : 
      68                 :             : static void
      69                 :       30374 : set_dec_flags (int value)
      70                 :             : {
      71                 :             :   /* Set (or unset) other DEC compatibility extensions.  */
      72                 :       30374 :   SET_BITFLAG (flag_dollar_ok, value, value);
      73                 :       30374 :   SET_BITFLAG (flag_cray_pointer, value, value);
      74                 :       30374 :   SET_BITFLAG (flag_dec_structure, value, value);
      75                 :       30374 :   SET_BITFLAG (flag_dec_intrinsic_ints, value, value);
      76                 :       30374 :   SET_BITFLAG (flag_dec_static, value, value);
      77                 :       30374 :   SET_BITFLAG (flag_dec_math, value, value);
      78                 :       30374 :   SET_BITFLAG (flag_dec_include, value, value);
      79                 :       30374 :   SET_BITFLAG (flag_dec_format_defaults, value, value);
      80                 :       30374 :   SET_BITFLAG (flag_dec_blank_format_item, value, value);
      81                 :       30374 :   SET_BITFLAG (flag_dec_char_conversions, value, value);
      82                 :       30374 : }
      83                 :             : 
      84                 :             : /* Finalize DEC flags.  */
      85                 :             : 
      86                 :             : static void
      87                 :       30163 : post_dec_flags (int value)
      88                 :             : {
      89                 :             :   /* Don't warn for legacy code if -fdec is given; however, setting -fno-dec
      90                 :             :      does not force these warnings.  We make one final determination on this
      91                 :             :      at the end because -std= is always set first; thus, we can avoid
      92                 :             :      clobbering the user's desired standard settings in gfc_handle_option
      93                 :             :      e.g. when -fdec and -fno-dec are both given.  */
      94                 :           0 :   if (value)
      95                 :             :     {
      96                 :         199 :       gfc_option.allow_std |= GFC_STD_F95_OBS | GFC_STD_F95_DEL
      97                 :             :         | GFC_STD_GNU | GFC_STD_LEGACY;
      98                 :         199 :       gfc_option.warn_std &= ~(GFC_STD_LEGACY | GFC_STD_F95_DEL);
      99                 :             :     }
     100                 :           0 : }
     101                 :             : 
     102                 :             : /* Enable (or disable) -finit-local-zero.  */
     103                 :             : 
     104                 :             : static void
     105                 :       30217 : set_init_local_zero (int value)
     106                 :             : {
     107                 :       30217 :   gfc_option.flag_init_integer_value = 0;
     108                 :       30217 :   gfc_option.flag_init_character_value = (char)0;
     109                 :             : 
     110                 :          53 :   SET_FLAG (gfc_option.flag_init_integer, value, GFC_INIT_INTEGER_ON,
     111                 :             :             GFC_INIT_INTEGER_OFF);
     112                 :       30217 :   SET_FLAG (gfc_option.flag_init_logical, value, GFC_INIT_LOGICAL_FALSE,
     113                 :             :             GFC_INIT_LOGICAL_OFF);
     114                 :       30217 :   SET_FLAG (gfc_option.flag_init_character, value, GFC_INIT_CHARACTER_ON,
     115                 :             :             GFC_INIT_CHARACTER_OFF);
     116                 :          53 :   SET_FLAG (flag_init_real, value, GFC_INIT_REAL_ZERO, GFC_INIT_REAL_OFF);
     117                 :          53 : }
     118                 :             : 
     119                 :             : /* Return language mask for Fortran options.  */
     120                 :             : 
     121                 :             : unsigned int
     122                 :      334097 : gfc_option_lang_mask (void)
     123                 :             : {
     124                 :      334097 :   return CL_Fortran;
     125                 :             : }
     126                 :             : 
     127                 :             : /* Initialize options structure OPTS.  */
     128                 :             : 
     129                 :             : void
     130                 :       30418 : gfc_init_options_struct (struct gcc_options *opts)
     131                 :             : {
     132                 :       30418 :   opts->x_flag_errno_math = 0;
     133                 :       30418 :   opts->frontend_set_flag_errno_math = true;
     134                 :       30418 :   opts->x_flag_associative_math = -1;
     135                 :       30418 :   opts->frontend_set_flag_associative_math = true;
     136                 :       30418 : }
     137                 :             : 
     138                 :             : /* Get ready for options handling. Keep in sync with
     139                 :             :    libgfortran/runtime/compile_options.c (init_compile_options).  */
     140                 :             : 
     141                 :             : void
     142                 :       30164 : gfc_init_options (unsigned int decoded_options_count,
     143                 :             :                   struct cl_decoded_option *decoded_options)
     144                 :             : {
     145                 :       30164 :   gfc_source_file = NULL;
     146                 :       30164 :   gfc_option.module_dir = NULL;
     147                 :       30164 :   gfc_option.source_form = FORM_UNKNOWN;
     148                 :             :   /* The following is not quite right as Fortran since 2023 has: "A statement
     149                 :             :       shall not have more than one million characters."  This can already be
     150                 :             :       reached by 'just' 100 lines with 10,000 characters each.  */
     151                 :       30164 :   gfc_option.max_continue_fixed = 1000000;
     152                 :       30164 :   gfc_option.max_continue_free = 1000000;
     153                 :       30164 :   gfc_option.max_identifier_length = GFC_MAX_SYMBOL_LEN;
     154                 :       30164 :   gfc_option.max_errors = 25;
     155                 :             : 
     156                 :       30164 :   gfc_option.flag_preprocessed = 0;
     157                 :       30164 :   gfc_option.flag_d_lines = -1;
     158                 :       30164 :   set_init_local_zero (0);
     159                 :             :   
     160                 :       30164 :   gfc_option.fpe = 0;
     161                 :             :   /* All except GFC_FPE_INEXACT.  */
     162                 :       30164 :   gfc_option.fpe_summary = GFC_FPE_INVALID | GFC_FPE_DENORMAL
     163                 :             :                            | GFC_FPE_ZERO | GFC_FPE_OVERFLOW
     164                 :             :                            | GFC_FPE_UNDERFLOW;
     165                 :       30164 :   gfc_option.rtcheck = 0;
     166                 :             : 
     167                 :       30164 :   set_dec_flags (0);
     168                 :       30164 :   set_default_std_flags ();
     169                 :             : 
     170                 :             :   /* Initialize cpp-related options.  */
     171                 :       30164 :   gfc_cpp_init_options (decoded_options_count, decoded_options);
     172                 :       30164 :   gfc_diagnostics_init ();
     173                 :       30164 : }
     174                 :             : 
     175                 :             : 
     176                 :             : /* Determine the source form from the filename extension.  We assume
     177                 :             :    case insensitivity.  */
     178                 :             : 
     179                 :             : static gfc_source_form
     180                 :       28369 : form_from_filename (const char *filename)
     181                 :             : {
     182                 :       28369 :   static const struct
     183                 :             :   {
     184                 :             :     const char *extension;
     185                 :             :     gfc_source_form form;
     186                 :             :   }
     187                 :             :   exttype[] =
     188                 :             :   {
     189                 :             :     {
     190                 :             :     ".f90", FORM_FREE}
     191                 :             :     ,
     192                 :             :     {
     193                 :             :     ".f95", FORM_FREE}
     194                 :             :     ,
     195                 :             :     {
     196                 :             :     ".f03", FORM_FREE}
     197                 :             :     ,
     198                 :             :     {
     199                 :             :     ".f08", FORM_FREE}
     200                 :             :     ,
     201                 :             :     {
     202                 :             :     ".fii", FORM_FREE}
     203                 :             :     ,
     204                 :             :     {
     205                 :             :     ".fi", FORM_FIXED}
     206                 :             :     ,
     207                 :             :     {
     208                 :             :     ".f", FORM_FIXED}
     209                 :             :     ,
     210                 :             :     {
     211                 :             :     ".for", FORM_FIXED}
     212                 :             :     ,
     213                 :             :     {
     214                 :             :     ".ftn", FORM_FIXED}
     215                 :             :     ,
     216                 :             :     {
     217                 :             :     "", FORM_UNKNOWN}
     218                 :             :   };            /* sentinel value */
     219                 :             : 
     220                 :       28369 :   gfc_source_form f_form;
     221                 :       28369 :   const char *fileext;
     222                 :       28369 :   int i;
     223                 :             : 
     224                 :             :   /* Find end of file name.  Note, filename is either a NULL pointer or
     225                 :             :      a NUL terminated string.  */
     226                 :       28369 :   i = 0;
     227                 :     2536773 :   while (filename[i] != '\0')
     228                 :     2508404 :     i++;
     229                 :             : 
     230                 :             :   /* Find last period.  */
     231                 :      141845 :   while (i >= 0 && (filename[i] != '.'))
     232                 :      113476 :     i--;
     233                 :             : 
     234                 :             :   /* Did we see a file extension?  */
     235                 :       28369 :   if (i < 0)
     236                 :             :     return FORM_UNKNOWN; /* Nope  */
     237                 :             : 
     238                 :             :   /* Get file extension and compare it to others.  */
     239                 :       28369 :   fileext = &(filename[i]);
     240                 :             : 
     241                 :       28369 :   i = -1;
     242                 :       28369 :   f_form = FORM_UNKNOWN;
     243                 :       33839 :   do
     244                 :             :     {
     245                 :       33839 :       i++;
     246                 :       33839 :       if (strcasecmp (fileext, exttype[i].extension) == 0)
     247                 :             :         {
     248                 :       28369 :           f_form = exttype[i].form;
     249                 :       28369 :           break;
     250                 :             :         }
     251                 :             :     }
     252                 :        5470 :   while (exttype[i].form != FORM_UNKNOWN);
     253                 :             : 
     254                 :             :   return f_form;
     255                 :             : }
     256                 :             : 
     257                 :             : 
     258                 :             : /* Finalize commandline options.  */
     259                 :             : 
     260                 :             : bool
     261                 :       30164 : gfc_post_options (const char **pfilename)
     262                 :             : {
     263                 :       30164 :   const char *filename = *pfilename, *canon_source_file = NULL;
     264                 :       30164 :   char *source_path;
     265                 :       30164 :   bool verbose_missing_dir_warn;
     266                 :       30164 :   int i;
     267                 :             : 
     268                 :             :   /* This needs to be after the commandline has been processed.
     269                 :             :      In Fortran, the options is by default enabled, in C/C++
     270                 :             :      by default disabled.
     271                 :             :      If not enabled explicitly by the user, only warn for -I
     272                 :             :      and -J, otherwise warn for all include paths.  */
     273                 :       30164 :   verbose_missing_dir_warn
     274                 :       60328 :     = (OPTION_SET_P (cpp_warn_missing_include_dirs)
     275                 :       30164 :        && global_options.x_cpp_warn_missing_include_dirs);
     276                 :       30164 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
     277                 :             :                        cpp_warn_missing_include_dirs, 1);
     278                 :       30164 :   gfc_check_include_dirs (verbose_missing_dir_warn);
     279                 :             : 
     280                 :       30859 :   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
     281                 :             :                        flag_free_line_length,
     282                 :             :                        (gfc_option.allow_std & GFC_STD_F2023) ? 10000 : 132);
     283                 :             : 
     284                 :             :   /* Finalize DEC flags.  */
     285                 :       30163 :   post_dec_flags (flag_dec);
     286                 :             : 
     287                 :             :   /* Excess precision other than "fast" requires front-end
     288                 :             :      support.  */
     289                 :       30163 :   if (flag_excess_precision == EXCESS_PRECISION_STANDARD)
     290                 :           0 :     sorry ("%<-fexcess-precision=standard%> for Fortran");
     291                 :       30163 :   else if (flag_excess_precision == EXCESS_PRECISION_FLOAT16)
     292                 :           0 :     sorry ("%<-fexcess-precision=16%> for Fortran");
     293                 :             : 
     294                 :       30163 :   flag_excess_precision = EXCESS_PRECISION_FAST;
     295                 :             : 
     296                 :             :   /* Fortran allows associative math - but we cannot reassociate if
     297                 :             :      we want traps or signed zeros. Cf. also flag_protect_parens.  */
     298                 :       30163 :   if (flag_associative_math == -1)
     299                 :       60154 :     flag_associative_math = (!flag_trapping_math && !flag_signed_zeros);
     300                 :             : 
     301                 :       30163 :   if (flag_protect_parens == -1)
     302                 :       30162 :     flag_protect_parens = !optimize_fast;
     303                 :             : 
     304                 :             :   /* -Ofast sets implies -fstack-arrays unless an explicit size is set for
     305                 :             :      stack arrays.  */
     306                 :       30163 :   if (flag_stack_arrays == -1 && flag_max_stack_var_size == -2)
     307                 :       30143 :     flag_stack_arrays = optimize_fast;
     308                 :             : 
     309                 :             :   /* By default, disable (re)allocation during assignment for -std=f95,
     310                 :             :      and enable it for F2003/F2008/GNU/Legacy.  */
     311                 :       30163 :   if (flag_realloc_lhs == -1)
     312                 :             :     {
     313                 :       30105 :       if (gfc_option.allow_std & GFC_STD_F2003)
     314                 :       29963 :         flag_realloc_lhs = 1;
     315                 :             :       else
     316                 :         142 :         flag_realloc_lhs = 0;
     317                 :             :     }
     318                 :             : 
     319                 :             :   /* -fbounds-check is equivalent to -fcheck=bounds */
     320                 :       30163 :   if (flag_bounds_check)
     321                 :         997 :     gfc_option.rtcheck |= GFC_RTCHECK_BOUNDS;
     322                 :             : 
     323                 :       30163 :   if (flag_compare_debug)
     324                 :           9 :     flag_dump_fortran_original = 0;
     325                 :             : 
     326                 :             :   /* Make -fmax-errors visible to gfortran's diagnostic machinery.  */
     327                 :       30163 :   if (OPTION_SET_P (flag_max_errors))
     328                 :          32 :     gfc_option.max_errors = flag_max_errors;
     329                 :             : 
     330                 :             :   /* Verify the input file name.  */
     331                 :       30163 :   if (!filename || strcmp (filename, "-") == 0)
     332                 :             :     {
     333                 :           0 :       filename = "";
     334                 :             :     }
     335                 :             : 
     336                 :       30163 :   if (gfc_option.flag_preprocessed)
     337                 :             :     {
     338                 :             :       /* For preprocessed files, if the first tokens are of the form # NUM.
     339                 :             :          handle the directives so we know the original file name.  */
     340                 :           3 :       gfc_source_file = gfc_read_orig_filename (filename, &canon_source_file);
     341                 :           3 :       if (gfc_source_file == NULL)
     342                 :           0 :         gfc_source_file = filename;
     343                 :             :       else
     344                 :           3 :         *pfilename = gfc_source_file;
     345                 :             :     }
     346                 :             :   else
     347                 :       30160 :     gfc_source_file = filename;
     348                 :             : 
     349                 :       30163 :   if (canon_source_file == NULL)
     350                 :       30161 :     canon_source_file = gfc_source_file;
     351                 :             : 
     352                 :             :   /* Adds the path where the source file is to the list of include files.  */
     353                 :             : 
     354                 :       30163 :   i = strlen (canon_source_file);
     355                 :      566501 :   while (i > 0 && !IS_DIR_SEPARATOR (canon_source_file[i]))
     356                 :      536338 :     i--;
     357                 :             : 
     358                 :       30163 :   if (i != 0)
     359                 :             :     {
     360                 :       30002 :       source_path = (char *) alloca (i + 1);
     361                 :       30002 :       memcpy (source_path, canon_source_file, i);
     362                 :       30002 :       source_path[i] = 0;
     363                 :             :       /* Only warn if the directory is different from the input file as
     364                 :             :          if that one is not found, already an error is shown.  */
     365                 :       30002 :       bool warn = gfc_option.flag_preprocessed && gfc_source_file != filename;
     366                 :       30002 :       gfc_add_include_path (source_path, true, true, warn, false);
     367                 :             :     }
     368                 :             :   else
     369                 :         161 :     gfc_add_include_path (".", true, true, false, false);
     370                 :             : 
     371                 :       30163 :   if (canon_source_file != gfc_source_file)
     372                 :           2 :     free (CONST_CAST (char *, canon_source_file));
     373                 :             : 
     374                 :             :   /* Decide which form the file will be read in as.  */
     375                 :             : 
     376                 :       30163 :   if (gfc_option.source_form != FORM_UNKNOWN)
     377                 :        1794 :     gfc_current_form = gfc_option.source_form;
     378                 :             :   else
     379                 :             :     {
     380                 :       28369 :       gfc_current_form = form_from_filename (filename);
     381                 :             : 
     382                 :       28369 :       if (gfc_current_form == FORM_UNKNOWN)
     383                 :             :         {
     384                 :           0 :           gfc_current_form = FORM_FREE;
     385                 :           0 :           main_input_filename = filename;
     386                 :           0 :           gfc_warning_now (0, "Reading file %qs as free form", 
     387                 :           0 :                            (filename[0] == '\0') ? "<stdin>" : filename);
     388                 :             :         }
     389                 :             :     }
     390                 :             : 
     391                 :             :   /* If the user specified -fd-lines-as-{code|comments} verify that we're
     392                 :             :      in fixed form.  */
     393                 :       30163 :   if (gfc_current_form == FORM_FREE)
     394                 :             :     {
     395                 :       28384 :       if (gfc_option.flag_d_lines == 0)
     396                 :           0 :         gfc_warning_now (0, "%<-fd-lines-as-comments%> has no effect "
     397                 :             :                            "in free form");
     398                 :       28384 :       else if (gfc_option.flag_d_lines == 1)
     399                 :           0 :         gfc_warning_now (0, "%<-fd-lines-as-code%> has no effect in free form");
     400                 :             : 
     401                 :       28384 :       if (warn_line_truncation == -1)
     402                 :       27481 :           warn_line_truncation = 1;
     403                 :             : 
     404                 :             :       /* Enable -Werror=line-truncation when -Werror and -Wno-error have
     405                 :             :          not been set.  */
     406                 :       28376 :       if (warn_line_truncation && !OPTION_SET_P (warnings_are_errors)
     407                 :       56760 :           && option_unspecified_p (OPT_Wline_truncation))
     408                 :       27022 :         diagnostic_classify_diagnostic (global_dc, OPT_Wline_truncation,
     409                 :             :                                         DK_ERROR, UNKNOWN_LOCATION);
     410                 :             :     }
     411                 :             :   else
     412                 :             :     {
     413                 :             :       /* With -fdec, set -fd-lines-as-comments by default in fixed form.  */
     414                 :        1779 :       if (flag_dec && gfc_option.flag_d_lines == -1)
     415                 :           9 :         gfc_option.flag_d_lines = 0;
     416                 :             : 
     417                 :        1779 :       if (warn_line_truncation == -1)
     418                 :        1773 :         warn_line_truncation = 0;
     419                 :             :     }
     420                 :             : 
     421                 :             :   /* If -pedantic, warn about the use of GNU extensions.  */
     422                 :       30163 :   if (pedantic && (gfc_option.allow_std & GFC_STD_GNU) != 0)
     423                 :       14816 :     gfc_option.warn_std |= GFC_STD_GNU;
     424                 :             :   /* -std=legacy -pedantic is effectively -std=gnu.  */
     425                 :       30163 :   if (pedantic && (gfc_option.allow_std & GFC_STD_LEGACY) != 0)
     426                 :       14816 :     gfc_option.warn_std |= GFC_STD_F95_OBS | GFC_STD_F95_DEL | GFC_STD_LEGACY;
     427                 :             : 
     428                 :             :   /* If the user didn't explicitly specify -f(no)-second-underscore we
     429                 :             :      use it if we're trying to be compatible with f2c, and not
     430                 :             :      otherwise.  */
     431                 :       30163 :   if (flag_second_underscore == -1)
     432                 :       30152 :     flag_second_underscore = flag_f2c;
     433                 :             : 
     434                 :       30163 :   if (!flag_automatic && flag_max_stack_var_size != -2
     435                 :           0 :       && flag_max_stack_var_size != 0)
     436                 :           0 :     gfc_warning_now (0, "Flag %<-fno-automatic%> overwrites %<-fmax-stack-var-size=%d%>",
     437                 :             :                      flag_max_stack_var_size);
     438                 :       30163 :   else if (!flag_automatic && flag_recursive)
     439                 :           8 :     gfc_warning_now (OPT_Woverwrite_recursive, "Flag %<-fno-automatic%> "
     440                 :             :                      "overwrites %<-frecursive%>");
     441                 :       30155 :   else if (!flag_automatic && (flag_openmp || flag_openacc))
     442                 :           0 :     gfc_warning_now (0, "Flag %<-fno-automatic%> overwrites %<-frecursive%> "
     443                 :             :                      "implied by %qs", flag_openmp ? "-fopenmp" : "-fopenacc");
     444                 :       30155 :   else if (flag_max_stack_var_size != -2 && flag_recursive)
     445                 :           0 :     gfc_warning_now (0, "Flag %<-frecursive%> overwrites %<-fmax-stack-var-size=%d%>",
     446                 :             :                      flag_max_stack_var_size);
     447                 :       30155 :   else if (flag_max_stack_var_size != -2 && (flag_openmp || flag_openacc))
     448                 :           0 :     gfc_warning_now (0, "Flag %<-fmax-stack-var-size=%d%> overwrites "
     449                 :             :                      "%<-frecursive%> implied by %qs", flag_max_stack_var_size,
     450                 :             :                      flag_openmp ? "-fopenmp" : "-fopenacc");
     451                 :             : 
     452                 :             :   /* Implement -frecursive as -fmax-stack-var-size=-1.  */
     453                 :       30163 :   if (flag_recursive)
     454                 :          21 :     flag_max_stack_var_size = -1;
     455                 :             : 
     456                 :             :   /* Implied -frecursive; implemented as -fmax-stack-var-size=-1.  */
     457                 :       30163 :   if (flag_max_stack_var_size == -2 && flag_automatic
     458                 :       30070 :       && (flag_openmp || flag_openacc))
     459                 :             :     {
     460                 :        4238 :       flag_recursive = 1;
     461                 :        4238 :       flag_max_stack_var_size = -1;
     462                 :             :     }
     463                 :             : 
     464                 :             :   /* Set flag_stack_arrays correctly.  */
     465                 :       30163 :   if (flag_stack_arrays == -1)
     466                 :          15 :     flag_stack_arrays = 0;
     467                 :             : 
     468                 :             :   /* Set default.  */
     469                 :       30163 :   if (flag_max_stack_var_size == -2)
     470                 :       25889 :     flag_max_stack_var_size = 65536;
     471                 :             : 
     472                 :             :   /* Implement -fno-automatic as -fmax-stack-var-size=0.  */
     473                 :       30163 :   if (!flag_automatic)
     474                 :          65 :     flag_max_stack_var_size = 0;
     475                 :             : 
     476                 :             :   /* Decide inlining preference depending on optimization if nothing was
     477                 :             :      specified on the command line.  */
     478                 :       30163 :   if ((flag_inline_intrinsics & GFC_FLAG_INLINE_INTRINSIC_MAXLOC)
     479                 :             :       == GFC_FLAG_INLINE_INTRINSIC_MAXLOC_UNSET)
     480                 :             :     {
     481                 :       30161 :       if (optimize == 0 || optimize_size != 0)
     482                 :        7794 :         flag_inline_intrinsics &= ~GFC_FLAG_INLINE_INTRINSIC_MAXLOC;
     483                 :             :       else
     484                 :       22367 :         flag_inline_intrinsics |= GFC_FLAG_INLINE_INTRINSIC_MAXLOC;
     485                 :             :     }
     486                 :       30163 :   if ((flag_inline_intrinsics & GFC_FLAG_INLINE_INTRINSIC_MINLOC)
     487                 :             :       == GFC_FLAG_INLINE_INTRINSIC_MINLOC_UNSET)
     488                 :             :     {
     489                 :       30162 :       if (optimize == 0 || optimize_size != 0)
     490                 :        7795 :         flag_inline_intrinsics &= ~GFC_FLAG_INLINE_INTRINSIC_MINLOC;
     491                 :             :       else
     492                 :       22367 :         flag_inline_intrinsics |= GFC_FLAG_INLINE_INTRINSIC_MINLOC;
     493                 :             :     }
     494                 :             : 
     495                 :             :   /* If the user did not specify an inline matmul limit, inline up to the BLAS
     496                 :             :      limit or up to 30 if no external BLAS is specified.  */
     497                 :             : 
     498                 :       30163 :   if (flag_inline_matmul_limit < 0)
     499                 :             :     {
     500                 :       30116 :       if (flag_external_blas)
     501                 :           9 :         flag_inline_matmul_limit = flag_blas_matmul_limit;
     502                 :             :       else
     503                 :       30107 :         flag_inline_matmul_limit = 30;
     504                 :             :     }
     505                 :             : 
     506                 :             :   /* Optimization implies front end optimization, unless the user
     507                 :             :      specified it directly.  */
     508                 :             : 
     509                 :       30163 :   if (flag_frontend_optimize == -1)
     510                 :       34020 :     flag_frontend_optimize = optimize && !optimize_debug;
     511                 :             : 
     512                 :             :   /* Same for front end loop interchange.  */
     513                 :             : 
     514                 :       30163 :   if (flag_frontend_loop_interchange == -1)
     515                 :       30159 :     flag_frontend_loop_interchange = optimize;
     516                 :             : 
     517                 :             :   /* Do inline packing by default if optimizing, but not if
     518                 :             :      optimizing for size.  */
     519                 :       30163 :   if (flag_inline_arg_packing == -1)
     520                 :       37957 :     flag_inline_arg_packing = optimize && !optimize_size;
     521                 :             : 
     522                 :       30163 :   if (flag_max_array_constructor < 65535)
     523                 :           0 :     flag_max_array_constructor = 65535;
     524                 :             : 
     525                 :       30163 :   if (flag_fixed_line_length != 0 && flag_fixed_line_length < 7)
     526                 :           0 :     gfc_fatal_error ("Fixed line length must be at least seven");
     527                 :             : 
     528                 :       30163 :   if (flag_free_line_length != 0 && flag_free_line_length < 4)
     529                 :           0 :     gfc_fatal_error ("Free line length must be at least three");
     530                 :             : 
     531                 :       30163 :   if (flag_max_subrecord_length > MAX_SUBRECORD_LENGTH)
     532                 :           0 :     gfc_fatal_error ("Maximum subrecord length cannot exceed %d",
     533                 :             :                      MAX_SUBRECORD_LENGTH);
     534                 :             : 
     535                 :       30163 :   gfc_cpp_post_options (verbose_missing_dir_warn);
     536                 :             : 
     537                 :       30163 :   if (gfc_option.allow_std & GFC_STD_F2008)
     538                 :       29770 :     lang_hooks.name = "GNU Fortran2008";
     539                 :         393 :   else if (gfc_option.allow_std & GFC_STD_F2003)
     540                 :         251 :     lang_hooks.name = "GNU Fortran2003";
     541                 :             : 
     542                 :       30163 :   return gfc_cpp_preprocess_only ();
     543                 :             : }
     544                 :             : 
     545                 :             : 
     546                 :             : static void
     547                 :           8 : gfc_handle_module_path_options (const char *arg)
     548                 :             : {
     549                 :             : 
     550                 :           8 :   if (gfc_option.module_dir != NULL)
     551                 :           0 :     gfc_fatal_error ("gfortran: Only one %<-J%> option allowed");
     552                 :             : 
     553                 :           8 :   gfc_option.module_dir = XCNEWVEC (char, strlen (arg) + 2);
     554                 :           8 :   strcpy (gfc_option.module_dir, arg);
     555                 :             : 
     556                 :           8 :   gfc_add_include_path (gfc_option.module_dir, true, false, true, true);
     557                 :             : 
     558                 :           8 :   strcat (gfc_option.module_dir, "/");
     559                 :           8 : }
     560                 :             : 
     561                 :             : 
     562                 :             : /* Handle options -ffpe-trap= and -ffpe-summary=.  */
     563                 :             : 
     564                 :             : static void
     565                 :           6 : gfc_handle_fpe_option (const char *arg, bool trap)
     566                 :             : {
     567                 :           6 :   int result, pos = 0, n;
     568                 :             :   /* precision is a backwards compatibility alias for inexact.  */
     569                 :           6 :   static const char * const exception[] = { "invalid", "denormal", "zero",
     570                 :             :                                             "overflow", "underflow",
     571                 :             :                                             "inexact", "precision", NULL };
     572                 :           6 :   static const int opt_exception[] = { GFC_FPE_INVALID, GFC_FPE_DENORMAL,
     573                 :             :                                        GFC_FPE_ZERO, GFC_FPE_OVERFLOW,
     574                 :             :                                        GFC_FPE_UNDERFLOW, GFC_FPE_INEXACT,
     575                 :             :                                        GFC_FPE_INEXACT,
     576                 :             :                                        0 };
     577                 :             : 
     578                 :             :   /* As the default for -ffpe-summary= is nonzero, set it to 0.  */
     579                 :           6 :   if (!trap)
     580                 :           0 :     gfc_option.fpe_summary = 0;
     581                 :             : 
     582                 :          18 :   while (*arg)
     583                 :             :     {
     584                 :          18 :       while (*arg == ',')
     585                 :           6 :         arg++;
     586                 :             : 
     587                 :         102 :       while (arg[pos] && arg[pos] != ',')
     588                 :          90 :         pos++;
     589                 :             : 
     590                 :          12 :       result = 0;
     591                 :          12 :       if (strncmp ("none", arg, pos) == 0)
     592                 :             :         {
     593                 :           0 :           if (trap)
     594                 :           0 :             gfc_option.fpe = 0;
     595                 :             :           else
     596                 :           0 :             gfc_option.fpe_summary = 0;
     597                 :           0 :           arg += pos;
     598                 :           0 :           pos = 0;
     599                 :           0 :           continue;
     600                 :             :         }
     601                 :          12 :       else if (!trap && strncmp ("all", arg, pos) == 0)
     602                 :             :         {
     603                 :           0 :           gfc_option.fpe_summary = GFC_FPE_INVALID | GFC_FPE_DENORMAL
     604                 :             :                                    | GFC_FPE_ZERO | GFC_FPE_OVERFLOW
     605                 :             :                                    | GFC_FPE_UNDERFLOW | GFC_FPE_INEXACT;
     606                 :           0 :           arg += pos;
     607                 :           0 :           pos = 0;
     608                 :           0 :           continue;
     609                 :             :         }
     610                 :             :       else
     611                 :          30 :         for (n = 0; exception[n] != NULL; n++)
     612                 :             :           {
     613                 :          30 :           if (exception[n] && strncmp (exception[n], arg, pos) == 0)
     614                 :             :             {
     615                 :          12 :               if (trap)
     616                 :          12 :                 gfc_option.fpe |= opt_exception[n];
     617                 :             :               else
     618                 :           0 :                 gfc_option.fpe_summary |= opt_exception[n];
     619                 :             :               arg += pos;
     620                 :             :               pos = 0;
     621                 :             :               result = 1;
     622                 :             :               break;
     623                 :             :             }
     624                 :             :           }
     625                 :          12 :       if (!result && trap)
     626                 :           0 :         gfc_fatal_error ("Argument to %<-ffpe-trap%> is not valid: %s", arg);
     627                 :          12 :       else if (!result)
     628                 :           0 :         gfc_fatal_error ("Argument to %<-ffpe-summary%> is not valid: %s", arg);
     629                 :             : 
     630                 :             :     }
     631                 :           6 : }
     632                 :             : 
     633                 :             : 
     634                 :             : static void
     635                 :         381 : gfc_handle_runtime_check_option (const char *arg)
     636                 :             : {
     637                 :         381 :   int result, pos = 0, n;
     638                 :         381 :   static const char * const optname[] = { "all", "bounds", "array-temps",
     639                 :             :                                           "recursion", "do", "pointer",
     640                 :             :                                           "mem", "bits", NULL };
     641                 :         381 :   static const int optmask[] = { GFC_RTCHECK_ALL, GFC_RTCHECK_BOUNDS,
     642                 :             :                                  GFC_RTCHECK_ARRAY_TEMPS,
     643                 :             :                                  GFC_RTCHECK_RECURSION, GFC_RTCHECK_DO,
     644                 :             :                                  GFC_RTCHECK_POINTER, GFC_RTCHECK_MEM,
     645                 :             :                                  GFC_RTCHECK_BITS, 0 };
     646                 :             :  
     647                 :         762 :   while (*arg)
     648                 :             :     {
     649                 :         381 :       while (*arg == ',')
     650                 :           0 :         arg++;
     651                 :             : 
     652                 :        2228 :       while (arg[pos] && arg[pos] != ',')
     653                 :        1847 :         pos++;
     654                 :             : 
     655                 :        1276 :       result = 0;
     656                 :        1276 :       for (n = 0; optname[n] != NULL; n++)
     657                 :             :         {
     658                 :        1276 :           if (optname[n] && strncmp (optname[n], arg, pos) == 0)
     659                 :             :             {
     660                 :         375 :               gfc_option.rtcheck |= optmask[n];
     661                 :         375 :               arg += pos;
     662                 :         375 :               pos = 0;
     663                 :         375 :               result = 1;
     664                 :         375 :               break;
     665                 :             :             }
     666                 :         901 :           else if (optname[n] && pos > 3 && startswith (arg, "no-")
     667                 :          12 :                    && strncmp (optname[n], arg+3, pos-3) == 0)
     668                 :             :             {
     669                 :           6 :               gfc_option.rtcheck &= ~optmask[n];
     670                 :           6 :               arg += pos;
     671                 :           6 :               pos = 0;
     672                 :           6 :               result = 1;
     673                 :           6 :               break;
     674                 :             :             }
     675                 :             :         }
     676                 :         381 :       if (!result)
     677                 :           0 :         gfc_fatal_error ("Argument to %<-fcheck%> is not valid: %s", arg);
     678                 :             :     }
     679                 :         381 : }
     680                 :             : 
     681                 :             : 
     682                 :             : /* Handle command-line options.  Returns 0 if unrecognized, 1 if
     683                 :             :    recognized and handled.  */
     684                 :             : 
     685                 :             : bool
     686                 :      200982 : gfc_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value,
     687                 :             :                    int kind ATTRIBUTE_UNUSED, location_t loc ATTRIBUTE_UNUSED,
     688                 :             :                    const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
     689                 :             : {
     690                 :      200982 :   bool result = true;
     691                 :      200982 :   enum opt_code code = (enum opt_code) scode;
     692                 :             : 
     693                 :      200982 :   if (gfc_cpp_handle_option (scode, arg, value) == 1)
     694                 :             :     return true;
     695                 :             : 
     696                 :      162219 :   switch (code)
     697                 :             :     {
     698                 :      106176 :     default:
     699                 :      106176 :       if (cl_options[code].flags & gfc_option_lang_mask ())
     700                 :             :         break;
     701                 :      162219 :       result = false;
     702                 :             :       break;
     703                 :             : 
     704                 :          12 :     case OPT_fcheck_array_temporaries:
     705                 :          12 :       SET_BITFLAG (gfc_option.rtcheck, value, GFC_RTCHECK_ARRAY_TEMPS);
     706                 :             :       break;
     707                 :             :       
     708                 :           4 :     case OPT_fd_lines_as_code:
     709                 :           4 :       gfc_option.flag_d_lines = 1;
     710                 :           4 :       break;
     711                 :             : 
     712                 :           1 :     case OPT_fd_lines_as_comments:
     713                 :           1 :       gfc_option.flag_d_lines = 0;
     714                 :           1 :       break;
     715                 :             : 
     716                 :        1793 :     case OPT_ffixed_form:
     717                 :        1793 :       gfc_option.source_form = FORM_FIXED;
     718                 :        1793 :       break;
     719                 :             : 
     720                 :          15 :     case OPT_ffree_form:
     721                 :          15 :       gfc_option.source_form = FORM_FREE;
     722                 :          15 :       break;
     723                 :             : 
     724                 :       33766 :     case OPT_fintrinsic_modules_path:
     725                 :       33766 :     case OPT_fintrinsic_modules_path_:
     726                 :             : 
     727                 :             :       /* This is needed because omp_lib.h is in a directory together
     728                 :             :          with intrinsic modules.  Do no warn because during testing
     729                 :             :          without an installed compiler, we would get lots of bogus
     730                 :             :          warnings for a missing include directory.  */
     731                 :       33766 :       gfc_add_include_path (arg, false, false, false, true);
     732                 :             : 
     733                 :       33766 :       gfc_add_intrinsic_modules_path (arg);
     734                 :       33766 :       break;
     735                 :             : 
     736                 :           3 :     case OPT_fpreprocessed:
     737                 :           3 :       gfc_option.flag_preprocessed = value;
     738                 :           3 :       break;
     739                 :             : 
     740                 :           0 :     case OPT_fmax_identifier_length_:
     741                 :           0 :       if (value > GFC_MAX_SYMBOL_LEN)
     742                 :           0 :         gfc_fatal_error ("Maximum supported identifier length is %d",
     743                 :             :                          GFC_MAX_SYMBOL_LEN);
     744                 :           0 :       gfc_option.max_identifier_length = value;
     745                 :           0 :       break;
     746                 :             : 
     747                 :          53 :     case OPT_finit_local_zero:
     748                 :          53 :       set_init_local_zero (value);
     749                 :          53 :       break;
     750                 :             : 
     751                 :          19 :     case OPT_finit_logical_:
     752                 :          19 :       if (!strcasecmp (arg, "false"))
     753                 :           6 :         gfc_option.flag_init_logical = GFC_INIT_LOGICAL_FALSE;
     754                 :          13 :       else if (!strcasecmp (arg, "true"))
     755                 :          13 :         gfc_option.flag_init_logical = GFC_INIT_LOGICAL_TRUE;
     756                 :             :       else
     757                 :           0 :         gfc_fatal_error ("Unrecognized option to %<-finit-logical%>: %s",
     758                 :             :                          arg);
     759                 :             :       break;
     760                 :             : 
     761                 :          38 :     case OPT_finit_integer_:
     762                 :          38 :       gfc_option.flag_init_integer = GFC_INIT_INTEGER_ON;
     763                 :          38 :       gfc_option.flag_init_integer_value = strtol (arg, NULL, 10);
     764                 :          38 :       break;
     765                 :             : 
     766                 :          19 :     case OPT_finit_character_:
     767                 :          19 :       if (value >= 0 && value <= 127)
     768                 :             :         {
     769                 :          19 :           gfc_option.flag_init_character = GFC_INIT_CHARACTER_ON;
     770                 :          19 :           gfc_option.flag_init_character_value = (char)value;
     771                 :             :         }
     772                 :             :       else
     773                 :           0 :         gfc_fatal_error ("The value of n in %<-finit-character=n%> must be "
     774                 :             :                          "between 0 and 127");
     775                 :          19 :       break;
     776                 :             : 
     777                 :       17828 :     case OPT_I:
     778                 :       17828 :       gfc_add_include_path (arg, true, false, true, true);
     779                 :       17828 :       break;
     780                 :             : 
     781                 :           8 :     case OPT_J:
     782                 :           8 :       gfc_handle_module_path_options (arg);
     783                 :           8 :       break;
     784                 :             : 
     785                 :           6 :     case OPT_ffpe_trap_:
     786                 :           6 :       gfc_handle_fpe_option (arg, true);
     787                 :           6 :       break;
     788                 :             : 
     789                 :           0 :     case OPT_ffpe_summary_:
     790                 :           0 :       gfc_handle_fpe_option (arg, false);
     791                 :           0 :       break;
     792                 :             : 
     793                 :         142 :     case OPT_std_f95:
     794                 :         142 :       gfc_option.allow_std = GFC_STD_OPT_F95;
     795                 :         142 :       gfc_option.warn_std = GFC_STD_F95_OBS;
     796                 :         142 :       gfc_option.max_continue_fixed = 19;
     797                 :         142 :       gfc_option.max_continue_free = 39;
     798                 :         142 :       gfc_option.max_identifier_length = 31;
     799                 :         142 :       warn_ampersand = 1;
     800                 :         142 :       warn_tabs = 1;
     801                 :         142 :       break;
     802                 :             : 
     803                 :         251 :     case OPT_std_f2003:
     804                 :         251 :       gfc_option.allow_std = GFC_STD_OPT_F03;
     805                 :         251 :       gfc_option.warn_std = GFC_STD_F95_OBS;
     806                 :         251 :       gfc_option.max_continue_fixed = 255;
     807                 :         251 :       gfc_option.max_continue_free = 255;
     808                 :         251 :       gfc_option.max_identifier_length = 63;
     809                 :         251 :       warn_ampersand = 1;
     810                 :         251 :       warn_tabs = 1;
     811                 :         251 :       break;
     812                 :             : 
     813                 :         244 :     case OPT_std_f2008:
     814                 :         244 :       gfc_option.allow_std = GFC_STD_OPT_F08;
     815                 :         244 :       gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F2008_OBS;
     816                 :         244 :       gfc_option.max_continue_free = 255;
     817                 :         244 :       gfc_option.max_continue_fixed = 255;
     818                 :         244 :       gfc_option.max_identifier_length = 63;
     819                 :         244 :       warn_ampersand = 1;
     820                 :         244 :       warn_tabs = 1;
     821                 :         244 :       break;
     822                 :             : 
     823                 :          60 :     case OPT_std_f2008ts:
     824                 :          60 :     case OPT_std_f2018:
     825                 :          60 :       gfc_option.allow_std = GFC_STD_OPT_F18;
     826                 :          60 :       gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F2008_OBS
     827                 :             :         | GFC_STD_F2018_OBS;
     828                 :          60 :       gfc_option.max_continue_free = 255;
     829                 :          60 :       gfc_option.max_continue_fixed = 255;
     830                 :          60 :       gfc_option.max_identifier_length = 63;
     831                 :          60 :       warn_ampersand = 1;
     832                 :          60 :       warn_tabs = 1;
     833                 :          60 :       break;
     834                 :             : 
     835                 :           9 :     case OPT_std_f2023:
     836                 :           9 :       gfc_option.allow_std = GFC_STD_OPT_F23;
     837                 :           9 :       gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F2008_OBS
     838                 :             :         | GFC_STD_F2018_OBS;
     839                 :           9 :       gfc_option.max_identifier_length = 63;
     840                 :           9 :       warn_ampersand = 1;
     841                 :           9 :       warn_tabs = 1;
     842                 :           9 :       break;
     843                 :             : 
     844                 :         385 :     case OPT_std_gnu:
     845                 :         385 :       set_default_std_flags ();
     846                 :         385 :       break;
     847                 :             : 
     848                 :         783 :     case OPT_std_legacy:
     849                 :         783 :       set_default_std_flags ();
     850                 :         783 :       gfc_option.warn_std = 0;
     851                 :         783 :       break;
     852                 :             : 
     853                 :             :     case OPT_fshort_enums:
     854                 :             :       /* Handled in language-independent code.  */
     855                 :             :       break;
     856                 :             : 
     857                 :         381 :     case OPT_fcheck_:
     858                 :         381 :       gfc_handle_runtime_check_option (arg);
     859                 :         381 :       break;
     860                 :             : 
     861                 :         210 :     case OPT_fdec:
     862                 :             :       /* Set (or unset) the DEC extension flags.  */
     863                 :         210 :       set_dec_flags (value);
     864                 :         210 :       break;
     865                 :             : 
     866                 :           1 :     case OPT_fbuiltin_:
     867                 :             :       /* We only handle -fno-builtin-omp_is_initial_device.  */
     868                 :           1 :       if (value)
     869                 :             :         return false;  /* Not supported. */
     870                 :           1 :       if (!strcmp ("omp_is_initial_device", arg))
     871                 :           1 :         gfc_option.disable_omp_is_initial_device = true;
     872                 :             :       else
     873                 :           0 :         warning (0, "command-line option %<-fno-builtin-%s%> is not valid for "
     874                 :             :                  "Fortran", arg);
     875                 :             :       break;
     876                 :             : 
     877                 :             :     }
     878                 :             : 
     879                 :      162219 :   Fortran_handle_option_auto (&global_options, &global_options_set, 
     880                 :             :                               scode, arg, value, 
     881                 :             :                               gfc_option_lang_mask (), kind,
     882                 :             :                               loc, handlers, global_dc);
     883                 :      162219 :   return result;
     884                 :             : }
     885                 :             : 
     886                 :             : 
     887                 :             : /* Return a string with the options passed to the compiler; used for
     888                 :             :    Fortran's compiler_options() intrinsic.  */
     889                 :             : 
     890                 :             : char *
     891                 :           8 : gfc_get_option_string (void)
     892                 :             : {
     893                 :           8 :   unsigned j;
     894                 :           8 :   size_t len, pos;
     895                 :           8 :   char *result;
     896                 :             : 
     897                 :             :   /* Allocate and return a one-character string with '\0'.  */
     898                 :           8 :   if (!save_decoded_options_count)
     899                 :           0 :     return XCNEWVEC (char, 1);
     900                 :             : 
     901                 :             :   /* Determine required string length.  */
     902                 :             : 
     903                 :             :   len = 0;
     904                 :         180 :   for (j = 1; j < save_decoded_options_count; j++)
     905                 :             :     {
     906                 :         172 :       switch (save_decoded_options[j].opt_index)
     907                 :             :         {
     908                 :             :         case OPT_o:
     909                 :             :         case OPT_d:
     910                 :             :         case OPT_dumpbase:
     911                 :             :         case OPT_dumpbase_ext:
     912                 :             :         case OPT_dumpdir:
     913                 :             :         case OPT_quiet:
     914                 :             :         case OPT_version:
     915                 :             :         case OPT_fintrinsic_modules_path:
     916                 :             :         case OPT_fintrinsic_modules_path_:
     917                 :             :           /* Ignore these.  */
     918                 :             :           break;
     919                 :         126 :         default:
     920                 :             :           /* Ignore file names.  */
     921                 :         126 :           if (save_decoded_options[j].orig_option_with_args_text[0] == '-')
     922                 :         118 :             len += 1
     923                 :         118 :                  + strlen (save_decoded_options[j].orig_option_with_args_text);
     924                 :             :         }
     925                 :             :     }
     926                 :             : 
     927                 :           8 :   result = XCNEWVEC (char, len);
     928                 :             : 
     929                 :           8 :   pos = 0; 
     930                 :         188 :   for (j = 1; j < save_decoded_options_count; j++)
     931                 :             :     {
     932                 :         172 :       switch (save_decoded_options[j].opt_index)
     933                 :             :         {
     934                 :          46 :         case OPT_o:
     935                 :          46 :         case OPT_d:
     936                 :          46 :         case OPT_dumpbase:
     937                 :          46 :         case OPT_dumpbase_ext:
     938                 :          46 :         case OPT_dumpdir:
     939                 :          46 :         case OPT_quiet:
     940                 :          46 :         case OPT_version:
     941                 :          46 :         case OPT_fintrinsic_modules_path:
     942                 :          46 :         case OPT_fintrinsic_modules_path_:
     943                 :             :           /* Ignore these.  */
     944                 :          46 :           continue;
     945                 :             : 
     946                 :             :         case OPT_cpp_:
     947                 :             :           /* Use "-cpp" rather than "-cpp=<temporary file>".  */
     948                 :             :           len = 4;
     949                 :             :           break;
     950                 :             : 
     951                 :         126 :         default:
     952                 :             :           /* Ignore file names.  */
     953                 :         126 :           if (save_decoded_options[j].orig_option_with_args_text[0] != '-')
     954                 :           8 :             continue;
     955                 :             : 
     956                 :         118 :           len = strlen (save_decoded_options[j].orig_option_with_args_text);
     957                 :             :         }
     958                 :             : 
     959                 :         118 :       memcpy (&result[pos], save_decoded_options[j].orig_option_with_args_text, len);
     960                 :         118 :       pos += len;
     961                 :         118 :       result[pos++] = ' ';
     962                 :             :     }
     963                 :             : 
     964                 :           8 :   result[--pos] = '\0';
     965                 :           8 :   return result;
     966                 :             : }
     967                 :             : 
     968                 :             : #undef SET_BITFLAG
     969                 :             : #undef SET_BITFLAG2
     970                 :             : #undef SET_FLAG
        

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.