LCOV - code coverage report
Current view: top level - gcc/cp - g++spec.c (source / functions) Hit Total Coverage
Test: gcc.info Lines: 152 175 86.9 %
Date: 2020-03-28 11:57:23 Functions: 2 2 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /* Specific flags and argument handling of the C++ front end.
       2                 :            :    Copyright (C) 1996-2020 Free Software Foundation, Inc.
       3                 :            : 
       4                 :            : This file is part of GCC.
       5                 :            : 
       6                 :            : GCC is free software; you can redistribute it and/or modify
       7                 :            : it under the terms of the GNU General Public License as published by
       8                 :            : the Free Software Foundation; either version 3, or (at your option)
       9                 :            : any later version.
      10                 :            : 
      11                 :            : GCC is distributed in the hope that it will be useful,
      12                 :            : but WITHOUT ANY WARRANTY; without even the implied warranty of
      13                 :            : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14                 :            : GNU General Public License for more details.
      15                 :            : 
      16                 :            : You should have received a copy of the GNU General Public License
      17                 :            : along with GCC; see the file COPYING3.  If not see
      18                 :            : <http://www.gnu.org/licenses/>.  */
      19                 :            : 
      20                 :            : #include "config.h"
      21                 :            : #include "system.h"
      22                 :            : #include "coretypes.h"
      23                 :            : #include "tm.h"
      24                 :            : #include "opts.h"
      25                 :            : 
      26                 :            : /* This bit is set if we saw a `-xfoo' language specification.  */
      27                 :            : #define LANGSPEC        (1<<1)
      28                 :            : /* This bit is set if they did `-lm' or `-lmath'.  */
      29                 :            : #define MATHLIB         (1<<2)
      30                 :            : /* This bit is set if they did `-lrt' or equivalent.  */
      31                 :            : #define TIMELIB         (1<<3)
      32                 :            : /* This bit is set if they did `-lc'.  */
      33                 :            : #define WITHLIBC        (1<<4)
      34                 :            : /* Skip this option.  */
      35                 :            : #define SKIPOPT         (1<<5)
      36                 :            : 
      37                 :            : #ifndef MATH_LIBRARY
      38                 :            : #define MATH_LIBRARY "m"
      39                 :            : #endif
      40                 :            : #ifndef MATH_LIBRARY_PROFILE
      41                 :            : #define MATH_LIBRARY_PROFILE MATH_LIBRARY
      42                 :            : #endif
      43                 :            : 
      44                 :            : #ifndef TIME_LIBRARY
      45                 :            : #define TIME_LIBRARY ""
      46                 :            : #endif
      47                 :            : 
      48                 :            : #ifndef LIBSTDCXX
      49                 :            : #define LIBSTDCXX "stdc++"
      50                 :            : #endif
      51                 :            : #ifndef LIBSTDCXX_PROFILE
      52                 :            : #define LIBSTDCXX_PROFILE LIBSTDCXX
      53                 :            : #endif
      54                 :            : #ifndef LIBSTDCXX_STATIC
      55                 :            : #define LIBSTDCXX_STATIC NULL
      56                 :            : #endif
      57                 :            : 
      58                 :            : void
      59                 :      79576 : lang_specific_driver (struct cl_decoded_option **in_decoded_options,
      60                 :            :                       unsigned int *in_decoded_options_count,
      61                 :            :                       int *in_added_libraries)
      62                 :            : {
      63                 :      79576 :   unsigned int i, j;
      64                 :            : 
      65                 :            :   /* If nonzero, the user gave us the `-p' or `-pg' flag.  */
      66                 :      79576 :   int saw_profile_flag = 0;
      67                 :            : 
      68                 :            :   /* What do with libstdc++:
      69                 :            :      -1 means we should not link in libstdc++
      70                 :            :      0  means we should link in libstdc++ if it is needed
      71                 :            :      1  means libstdc++ is needed and should be linked in.
      72                 :            :      2  means libstdc++ is needed and should be linked statically.  */
      73                 :      79576 :   int library = 0;
      74                 :            : 
      75                 :            :   /* The number of arguments being added to what's in argv, other than
      76                 :            :      libraries.  We use this to track the number of times we've inserted
      77                 :            :      -xc++/-xnone.  */
      78                 :      79576 :   int added = 0;
      79                 :            : 
      80                 :            :   /* The new argument list will be contained in this.  */
      81                 :      79576 :   struct cl_decoded_option *new_decoded_options;
      82                 :            : 
      83                 :            :   /* Nonzero if we saw a `-xfoo' language specification on the
      84                 :            :      command line.  Used to avoid adding our own -xc++ if the user
      85                 :            :      already gave a language for the file.  */
      86                 :      79576 :   int saw_speclang = 0;
      87                 :            : 
      88                 :            :   /* "-lm" or "-lmath" if it appears on the command line.  */
      89                 :      79576 :   const struct cl_decoded_option *saw_math = NULL;
      90                 :            : 
      91                 :            :   /* "-lrt" or eqivalent if it appears on the command line.  */
      92                 :      79576 :   const struct cl_decoded_option *saw_time = NULL;
      93                 :            : 
      94                 :            :   /* "-lc" if it appears on the command line.  */
      95                 :      79576 :   const struct cl_decoded_option *saw_libc = NULL;
      96                 :            : 
      97                 :            :   /* An array used to flag each argument that needs a bit set for
      98                 :            :      LANGSPEC, MATHLIB, TIMELIB, or WITHLIBC.  */
      99                 :      79576 :   int *args;
     100                 :            : 
     101                 :            :   /* By default, we throw on the math library if we have one.  */
     102                 :      79576 :   int need_math = (MATH_LIBRARY[0] != '\0');
     103                 :            : 
     104                 :            :   /* By default, we throw on the time library if we have one.  */
     105                 :      79576 :   int need_time = (TIME_LIBRARY[0] != '\0');
     106                 :            : 
     107                 :            :   /* True if we saw -static.  */
     108                 :      79576 :   int static_link = 0;
     109                 :            : 
     110                 :            :   /* True if we should add -shared-libgcc to the command-line.  */
     111                 :      79576 :   int shared_libgcc = 1;
     112                 :            : 
     113                 :            :   /* The total number of arguments with the new stuff.  */
     114                 :      79576 :   unsigned int argc;
     115                 :            : 
     116                 :            :   /* The argument list.  */
     117                 :      79576 :   struct cl_decoded_option *decoded_options;
     118                 :            : 
     119                 :            :   /* The number of libraries added in.  */
     120                 :      79576 :   int added_libraries;
     121                 :            : 
     122                 :            :   /* The total number of arguments with the new stuff.  */
     123                 :      79576 :   unsigned int num_args = 1;
     124                 :            : 
     125                 :      79576 :   argc = *in_decoded_options_count;
     126                 :      79576 :   decoded_options = *in_decoded_options;
     127                 :      79576 :   added_libraries = *in_added_libraries;
     128                 :            : 
     129                 :      79576 :   args = XCNEWVEC (int, argc);
     130                 :            : 
     131                 :    1739200 :   for (i = 1; i < argc; i++)
     132                 :            :     {
     133                 :    1659620 :       const char *arg = decoded_options[i].arg;
     134                 :    1659620 :       if (decoded_options[i].errors & CL_ERR_MISSING_ARG)
     135                 :          0 :         continue; /* Avoid examining arguments of options missing them.  */
     136                 :            : 
     137                 :    1659620 :       switch (decoded_options[i].opt_index)
     138                 :            :         {
     139                 :        256 :         case OPT_nostdlib:
     140                 :        256 :         case OPT_nodefaultlibs:
     141                 :        256 :           library = -1;
     142                 :        256 :           break;
     143                 :            : 
     144                 :      18126 :         case OPT_l:
     145                 :      18126 :           if (strcmp (arg, MATH_LIBRARY) == 0)
     146                 :            :             {
     147                 :      17905 :               args[i] |= MATHLIB;
     148                 :      17905 :               need_math = 0;
     149                 :            :             }
     150                 :        221 :           else if (strcmp (arg, TIME_LIBRARY) == 0)
     151                 :            :             {
     152                 :          0 :               args[i] |= TIMELIB;
     153                 :          0 :               need_time = 0;
     154                 :            :             }
     155                 :        221 :           else if (strcmp (arg, "c") == 0)
     156                 :          0 :             args[i] |= WITHLIBC;
     157                 :            :           else
     158                 :            :             /* Unrecognized libraries (e.g. -lfoo) may require libstdc++.  */
     159                 :        221 :             library = (library == 0) ? 1 : library;
     160                 :            :           break;
     161                 :            : 
     162                 :            :         case OPT_pg:
     163                 :            :         case OPT_p:
     164                 :    1659620 :           saw_profile_flag++;
     165                 :            :           break;
     166                 :            : 
     167                 :       2574 :         case OPT_x:
     168                 :       2574 :           if (library == 0
     169                 :       2517 :               && (strcmp (arg, "c++") == 0
     170                 :       2517 :                   || strcmp (arg, "c++-cpp-output") == 0
     171                 :       2517 :                   || strcmp (arg, "objective-c++") == 0
     172                 :       2517 :                   || strcmp (arg, "objective-c++-cpp-output") == 0))
     173                 :          0 :             library = 1;
     174                 :            :                 
     175                 :            :           saw_speclang = 1;
     176                 :            :           break;
     177                 :            : 
     178                 :       5104 :         case OPT_Xlinker:
     179                 :       5104 :         case OPT_Wl_:
     180                 :            :           /* Arguments that go directly to the linker might be .o files,
     181                 :            :              or something, and so might cause libstdc++ to be needed.  */
     182                 :       5104 :           if (library == 0)
     183                 :          0 :             library = 1;
     184                 :            :           break;
     185                 :            : 
     186                 :      60625 :         case OPT_c:
     187                 :      60625 :         case OPT_r:
     188                 :      60625 :         case OPT_S:
     189                 :      60625 :         case OPT_E:
     190                 :      60625 :         case OPT_M:
     191                 :      60625 :         case OPT_MM:
     192                 :      60625 :         case OPT_fsyntax_only:
     193                 :            :           /* Don't specify libraries if we won't link, since that would
     194                 :            :              cause a warning.  */
     195                 :      60625 :           library = -1;
     196                 :      60625 :           break;
     197                 :            : 
     198                 :         24 :         case OPT_static:
     199                 :         24 :           static_link = 1;
     200                 :         24 :           break;
     201                 :            : 
     202                 :          1 :         case OPT_static_libgcc:
     203                 :          1 :           shared_libgcc = 0;
     204                 :          1 :           break;
     205                 :            : 
     206                 :          2 :         case OPT_static_libstdc__:
     207                 :          2 :           library = library >= 0 ? 2 : library;
     208                 :          2 :           args[i] |= SKIPOPT;
     209                 :          2 :           break;
     210                 :            : 
     211                 :      84621 :         case OPT_SPECIAL_input_file:
     212                 :      84621 :           {
     213                 :      84621 :             int len;
     214                 :            : 
     215                 :            :             /* We don't do this anymore, since we don't get them with minus
     216                 :            :                signs on them.  */
     217                 :      84621 :             if (arg[0] == '\0' || arg[1] == '\0')
     218                 :          0 :               continue;
     219                 :            : 
     220                 :      84621 :             if (saw_speclang)
     221                 :            :               {
     222                 :       2565 :                 saw_speclang = 0;
     223                 :       2565 :                 continue;
     224                 :            :               }
     225                 :            : 
     226                 :            :             /* If the filename ends in .[chi], put options around it.
     227                 :            :                But not if a specified -x option is currently active.  */
     228                 :      82056 :             len = strlen (arg);
     229                 :      82056 :             if (len > 2
     230                 :      82056 :                 && (arg[len - 1] == 'c'
     231                 :      65531 :                     || arg[len - 1] == 'i'
     232                 :      65531 :                     || arg[len - 1] == 'h')
     233                 :      16525 :                 && arg[len - 2] == '.')
     234                 :            :               {
     235                 :       7592 :                 args[i] |= LANGSPEC;
     236                 :       7592 :                 added += 2;
     237                 :            :               }
     238                 :            : 
     239                 :            :             /* If we don't know that this is a header file, we might
     240                 :            :                need to be linking in the libraries.  */
     241                 :      82056 :             if (library == 0)
     242                 :            :               {
     243                 :      65598 :                 if ((len <= 2 || strcmp (arg + (len - 2), ".H") != 0)
     244                 :      65598 :                     && (len <= 2 || strcmp (arg + (len - 2), ".h") != 0)
     245                 :      65553 :                     && (len <= 4 || strcmp (arg + (len - 4), ".hpp") != 0)
     246                 :      65553 :                     && (len <= 3 || strcmp (arg + (len - 3), ".hp") != 0)
     247                 :      65553 :                     && (len <= 4 || strcmp (arg + (len - 4), ".hxx") != 0)
     248                 :      65553 :                     && (len <= 4 || strcmp (arg + (len - 4), ".h++") != 0)
     249                 :      65553 :                     && (len <= 4 || strcmp (arg + (len - 4), ".HPP") != 0)
     250                 :      65553 :                     && (len <= 4 || strcmp (arg + (len - 4), ".tcc") != 0)
     251                 :      65553 :                     && (len <= 3 || strcmp (arg + (len - 3), ".hh") != 0))
     252                 :      65553 :                   library = 1;
     253                 :            :               }
     254                 :            :           }
     255                 :            :           break;
     256                 :            :         }
     257                 :            :     }
     258                 :            : 
     259                 :            :   /* There's no point adding -shared-libgcc if we don't have a shared
     260                 :            :      libgcc.  */
     261                 :            : #ifndef ENABLE_SHARED_LIBGCC
     262                 :            :   shared_libgcc = 0;
     263                 :            : #endif
     264                 :            : 
     265                 :            :   /* Add one for shared_libgcc or extra static library.  */
     266                 :      79576 :   num_args = argc + added + need_math + (library > 0) * 4 + 1;
     267                 :      79576 :   new_decoded_options = XNEWVEC (struct cl_decoded_option, num_args);
     268                 :            : 
     269                 :      79576 :   i = 0;
     270                 :      79576 :   j = 0;
     271                 :            : 
     272                 :            :   /* Copy the 0th argument, i.e., the name of the program itself.  */
     273                 :      79576 :   new_decoded_options[j++] = decoded_options[i++];
     274                 :            : 
     275                 :            :   /* NOTE: We start at 1 now, not 0.  */
     276                 :    1739200 :   while (i < argc)
     277                 :            :     {
     278                 :    1659620 :       new_decoded_options[j] = decoded_options[i];
     279                 :            : 
     280                 :            :       /* Make sure -lstdc++ is before the math library, since libstdc++
     281                 :            :          itself uses those math routines.  */
     282                 :    1659620 :       if (!saw_math && (args[i] & MATHLIB) && library > 0)
     283                 :            :         {
     284                 :      17900 :           --j;
     285                 :      17900 :           saw_math = &decoded_options[i];
     286                 :            :         }
     287                 :            : 
     288                 :    1659620 :       if (!saw_time && (args[i] & TIMELIB) && library > 0)
     289                 :            :         {
     290                 :          0 :           --j;
     291                 :          0 :           saw_time = &decoded_options[i];
     292                 :            :         }
     293                 :            : 
     294                 :    1659620 :       if (!saw_libc && (args[i] & WITHLIBC) && library > 0)
     295                 :            :         {
     296                 :          0 :           --j;
     297                 :          0 :           saw_libc = &decoded_options[i];
     298                 :            :         }
     299                 :            : 
     300                 :            :       /* Wrap foo.[chi] files in a language specification to
     301                 :            :          force the gcc compiler driver to run cc1plus on them.  */
     302                 :    1659620 :       if (args[i] & LANGSPEC)
     303                 :            :         {
     304                 :       7592 :           const char *arg = decoded_options[i].arg;
     305                 :       7592 :           int len = strlen (arg);
     306                 :       7592 :           switch (arg[len - 1])
     307                 :            :             {
     308                 :       7592 :             case 'c':
     309                 :       7592 :               generate_option (OPT_x, "c++", 1, CL_DRIVER,
     310                 :       7592 :                                &new_decoded_options[j++]);
     311                 :       7592 :               break;
     312                 :          0 :             case 'i':
     313                 :          0 :               generate_option (OPT_x, "c++-cpp-output", 1, CL_DRIVER,
     314                 :          0 :                                &new_decoded_options[j++]);
     315                 :          0 :               break;
     316                 :          0 :             case 'h':
     317                 :          0 :               generate_option (OPT_x, "c++-header", 1, CL_DRIVER,
     318                 :          0 :                                &new_decoded_options[j++]);
     319                 :          0 :               break;
     320                 :          0 :             default:
     321                 :          0 :               gcc_unreachable ();
     322                 :            :             }
     323                 :       7592 :           new_decoded_options[j++] = decoded_options[i];
     324                 :       7592 :           generate_option (OPT_x, "none", 1, CL_DRIVER,
     325                 :       7592 :                            &new_decoded_options[j]);
     326                 :            :         }
     327                 :            : 
     328                 :    1659620 :       if ((args[i] & SKIPOPT) != 0)
     329                 :          2 :         --j;
     330                 :            : 
     331                 :    1659620 :       i++;
     332                 :    1659620 :       j++;
     333                 :            :     }
     334                 :            : 
     335                 :            :   /* Add `-lstdc++' if we haven't already done so.  */
     336                 :      79576 :   if (library > 0)
     337                 :            :     {
     338                 :            : #ifdef HAVE_LD_STATIC_DYNAMIC
     339                 :      18267 :       if (library > 1 && !static_link)
     340                 :            :         {
     341                 :          2 :           generate_option (OPT_Wl_, LD_STATIC_OPTION, 1, CL_DRIVER,
     342                 :          2 :                            &new_decoded_options[j]);
     343                 :          2 :           j++;
     344                 :            :         }
     345                 :            : #endif
     346                 :      18267 :       generate_option (OPT_l,
     347                 :            :                        saw_profile_flag ? LIBSTDCXX_PROFILE : LIBSTDCXX, 1,
     348                 :      18267 :                        CL_DRIVER, &new_decoded_options[j]);
     349                 :      18267 :       added_libraries++;
     350                 :      18267 :       j++;
     351                 :            :       /* Add target-dependent static library, if necessary.  */
     352                 :      18267 :       if ((static_link || library > 1) && LIBSTDCXX_STATIC != NULL)
     353                 :            :         {
     354                 :            :           generate_option (OPT_l, LIBSTDCXX_STATIC, 1,
     355                 :            :                            CL_DRIVER, &new_decoded_options[j]);
     356                 :            :           added_libraries++;
     357                 :            :           j++;
     358                 :            :         }
     359                 :            : #ifdef HAVE_LD_STATIC_DYNAMIC
     360                 :      18267 :       if (library > 1 && !static_link)
     361                 :            :         {
     362                 :          2 :           generate_option (OPT_Wl_, LD_DYNAMIC_OPTION, 1, CL_DRIVER,
     363                 :          2 :                            &new_decoded_options[j]);
     364                 :          2 :           j++;
     365                 :            :         }
     366                 :            : #endif
     367                 :            :     }
     368                 :      79576 :   if (saw_math)
     369                 :      17900 :     new_decoded_options[j++] = *saw_math;
     370                 :      61676 :   else if (library > 0 && need_math)
     371                 :            :     {
     372                 :        367 :       generate_option (OPT_l,
     373                 :            :                        saw_profile_flag ? MATH_LIBRARY_PROFILE : MATH_LIBRARY,
     374                 :        367 :                        1, CL_DRIVER, &new_decoded_options[j]);
     375                 :        367 :       added_libraries++;
     376                 :        367 :       j++;
     377                 :            :     }
     378                 :      79576 :   if (saw_time)
     379                 :          0 :     new_decoded_options[j++] = *saw_time;
     380                 :            :   else if (library > 0 && need_time)
     381                 :            :     {
     382                 :            :       generate_option (OPT_l, TIME_LIBRARY, 1, CL_DRIVER,
     383                 :            :                        &new_decoded_options[j]);
     384                 :            :       added_libraries++;
     385                 :            :       j++;
     386                 :            :     }
     387                 :      79576 :   if (saw_libc)
     388                 :          0 :     new_decoded_options[j++] = *saw_libc;
     389                 :      79576 :   if (shared_libgcc && !static_link)
     390                 :      79551 :     generate_option (OPT_shared_libgcc, NULL, 1, CL_DRIVER,
     391                 :      79551 :                      &new_decoded_options[j++]);
     392                 :            : 
     393                 :      79576 :   *in_decoded_options_count = j;
     394                 :      79576 :   *in_decoded_options = new_decoded_options;
     395                 :      79576 :   *in_added_libraries = added_libraries;
     396                 :      79576 : }
     397                 :            : 
     398                 :            : /* Called before linking.  Returns 0 on success and -1 on failure.  */
     399                 :      62194 : int lang_specific_pre_link (void)  /* Not used for C++.  */
     400                 :            : {
     401                 :      62194 :   return 0;
     402                 :            : }
     403                 :            : 
     404                 :            : /* Number of extra output files that lang_specific_pre_link may generate.  */
     405                 :            : int lang_specific_extra_outfiles = 0;  /* Not used for C++.  */

Generated by: LCOV version 1.0

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 --enable-host-shared. GCC test suite is run with the built compiler.