LCOV - code coverage report
Current view: top level - gcc - langhooks.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 70.0 % 330 231
Test Date: 2025-10-18 14:39:06 Functions: 68.1 % 72 49
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* Default language-specific hooks.
       2                 :             :    Copyright (C) 2001-2025 Free Software Foundation, Inc.
       3                 :             :    Contributed by Alexandre Oliva  <aoliva@redhat.com>
       4                 :             : 
       5                 :             : This file is part of GCC.
       6                 :             : 
       7                 :             : GCC is free software; you can redistribute it and/or modify
       8                 :             : it under the terms of the GNU General Public License as published by
       9                 :             : the Free Software Foundation; either version 3, or (at your option)
      10                 :             : any later version.
      11                 :             : 
      12                 :             : GCC is distributed in the hope that it will be useful,
      13                 :             : but WITHOUT ANY WARRANTY; without even the implied warranty of
      14                 :             : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15                 :             : GNU General Public License 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                 :             : #define INCLUDE_VECTOR
      22                 :             : #include "config.h"
      23                 :             : #include "system.h"
      24                 :             : #include "coretypes.h"
      25                 :             : #include "target.h"
      26                 :             : #include "rtl.h"
      27                 :             : #include "tree.h"
      28                 :             : #include "timevar.h"
      29                 :             : #include "stringpool.h"
      30                 :             : #include "diagnostic.h"
      31                 :             : #include "intl.h"
      32                 :             : #include "toplev.h"
      33                 :             : #include "attribs.h"
      34                 :             : #include "gimplify.h"
      35                 :             : #include "langhooks.h"
      36                 :             : #include "tree-diagnostic.h"
      37                 :             : #include "output.h"
      38                 :             : #include "timevar.h"
      39                 :             : #include "stor-layout.h"
      40                 :             : #include "cgraph.h"
      41                 :             : #include "debug.h"
      42                 :             : #include "diagnostics/text-sink.h"
      43                 :             : 
      44                 :             : /* Do nothing; in many cases the default hook.  */
      45                 :             : 
      46                 :             : void
      47                 :       72689 : lhd_do_nothing (void)
      48                 :             : {
      49                 :       72689 : }
      50                 :             : 
      51                 :             : /* Do nothing (tree).  */
      52                 :             : 
      53                 :             : void
      54                 :     4731910 : lhd_do_nothing_t (tree ARG_UNUSED (t))
      55                 :             : {
      56                 :     4731910 : }
      57                 :             : 
      58                 :             : /* Pass through (tree).  */
      59                 :             : tree
      60                 :         424 : lhd_pass_through_t (tree t)
      61                 :             : {
      62                 :         424 :   return t;
      63                 :             : }
      64                 :             : 
      65                 :             : /* Do nothing (int, int, int).  Return NULL_TREE.  */
      66                 :             : 
      67                 :             : tree
      68                 :           0 : lhd_do_nothing_iii_return_null_tree (int ARG_UNUSED (i),
      69                 :             :                                      int ARG_UNUSED (j),
      70                 :             :                                      int ARG_UNUSED (k))
      71                 :             : {
      72                 :           0 :   return NULL_TREE;
      73                 :             : }
      74                 :             : 
      75                 :             : /* Do nothing (function).  */
      76                 :             : 
      77                 :             : void
      78                 :           0 : lhd_do_nothing_f (struct function * ARG_UNUSED (f))
      79                 :             : {
      80                 :           0 : }
      81                 :             : 
      82                 :             : /* Do nothing (return NULL_TREE).  */
      83                 :             : 
      84                 :             : tree
      85                 :           0 : lhd_return_null_tree (tree ARG_UNUSED (t))
      86                 :             : {
      87                 :           0 :   return NULL_TREE;
      88                 :             : }
      89                 :             : 
      90                 :             : /* Do nothing (return NULL_TREE).  */
      91                 :             : 
      92                 :             : tree
      93                 :        9125 : lhd_return_null_const_tree (const_tree ARG_UNUSED (t))
      94                 :             : {
      95                 :        9125 :   return NULL_TREE;
      96                 :             : }
      97                 :             : 
      98                 :             : /* The default post options hook.  */
      99                 :             : 
     100                 :             : bool
     101                 :        1276 : lhd_post_options (const char ** ARG_UNUSED (pfilename))
     102                 :             : {
     103                 :             :   /* Excess precision other than "fast" requires front-end
     104                 :             :      support.  */
     105                 :        1276 :   flag_excess_precision = EXCESS_PRECISION_FAST;
     106                 :        1276 :   return false;
     107                 :             : }
     108                 :             : 
     109                 :             : /* Called from by print-tree.cc.  */
     110                 :             : 
     111                 :             : void
     112                 :          71 : lhd_print_tree_nothing (FILE * ARG_UNUSED (file),
     113                 :             :                         tree ARG_UNUSED (node),
     114                 :             :                         int ARG_UNUSED (indent))
     115                 :             : {
     116                 :          71 : }
     117                 :             : 
     118                 :             : /* Called from check_global_declaration.  */
     119                 :             : 
     120                 :             : bool
     121                 :           6 : lhd_warn_unused_global_decl (const_tree decl)
     122                 :             : {
     123                 :             :   /* This is what used to exist in check_global_declaration.  Probably
     124                 :             :      not many of these actually apply to non-C languages.  */
     125                 :             : 
     126                 :           6 :   if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl))
     127                 :             :     return false;
     128                 :           6 :   if (VAR_P (decl) && TREE_READONLY (decl))
     129                 :             :     return false;
     130                 :           6 :   if (DECL_IN_SYSTEM_HEADER (decl))
     131                 :             :     return false;
     132                 :             : 
     133                 :             :   return true;
     134                 :             : }
     135                 :             : 
     136                 :             : /* Set the DECL_ASSEMBLER_NAME for DECL.  */
     137                 :             : void
     138                 :     6330697 : lhd_set_decl_assembler_name (tree decl)
     139                 :             : {
     140                 :     6330697 :   tree id;
     141                 :             : 
     142                 :             :   /* set_decl_assembler_name may be called on TYPE_DECL to record ODR
     143                 :             :      name for C++ types.  By default types have no ODR names.  */
     144                 :     6330697 :   if (TREE_CODE (decl) == TYPE_DECL)
     145                 :             :     return;
     146                 :             : 
     147                 :             :   /* The language-independent code should never use the
     148                 :             :      DECL_ASSEMBLER_NAME for lots of DECLs.  Only FUNCTION_DECLs and
     149                 :             :      VAR_DECLs for variables with static storage duration need a real
     150                 :             :      DECL_ASSEMBLER_NAME.  */
     151                 :     6287376 :   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL
     152                 :             :               || (VAR_P (decl)
     153                 :             :                   && (TREE_STATIC (decl)
     154                 :             :                       || DECL_EXTERNAL (decl)
     155                 :             :                       || TREE_PUBLIC (decl))));
     156                 :             : 
     157                 :             :   /* By default, assume the name to use in assembly code is the same
     158                 :             :      as that used in the source language.  (That's correct for C, and
     159                 :             :      GCC used to set DECL_ASSEMBLER_NAME to the same value as
     160                 :             :      DECL_NAME in build_decl, so this choice provides backwards
     161                 :             :      compatibility with existing front-ends.  This assumption is wrapped
     162                 :             :      in a target hook, to allow for target-specific modification of the
     163                 :             :      identifier.
     164                 :             : 
     165                 :             :      Can't use just the variable's own name for a variable whose scope
     166                 :             :      is less than the whole compilation.  Concatenate a distinguishing
     167                 :             :      number.  */
     168                 :             : 
     169                 :     6287376 :   if (TREE_PUBLIC (decl) || DECL_FILE_SCOPE_P (decl))
     170                 :     6059440 :     id = targetm.mangle_decl_assembler_name (decl, DECL_NAME (decl));
     171                 :             :   else
     172                 :             :     {
     173                 :      227936 :       const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
     174                 :      227936 :       static unsigned long num;
     175                 :      227936 :       char *label;
     176                 :             : 
     177                 :      227936 :       ASM_FORMAT_PRIVATE_NAME (label, name, num++);
     178                 :      227936 :       id = get_identifier (label);
     179                 :             :     }
     180                 :             : 
     181                 :     6287376 :   SET_DECL_ASSEMBLER_NAME (decl, id);
     182                 :             : }
     183                 :             : 
     184                 :             : /* Forcibly overwrite the DECL_ASSEMBLER_NAME for DECL to NAME.  */
     185                 :             : void
     186                 :   174857209 : lhd_overwrite_decl_assembler_name (tree decl, tree name)
     187                 :             : {
     188                 :   174857209 :   DECL_ASSEMBLER_NAME_RAW (decl) = name;
     189                 :   174857209 : }
     190                 :             : 
     191                 :             : /* Type promotion for variable arguments.  */
     192                 :             : tree
     193                 :           0 : lhd_type_promotes_to (tree ARG_UNUSED (type))
     194                 :             : {
     195                 :           0 :   gcc_unreachable ();
     196                 :             : }
     197                 :             : 
     198                 :             : /* Registration of machine- or os-specific builtin types.  */
     199                 :             : void
     200                 :      128428 : lhd_register_builtin_type (tree ARG_UNUSED (type),
     201                 :             :                            const char * ARG_UNUSED (name))
     202                 :             : {
     203                 :      128428 : }
     204                 :             : 
     205                 :             : /* Invalid use of an incomplete type.  */
     206                 :             : void
     207                 :           0 : lhd_incomplete_type_error (location_t ARG_UNUSED (loc),
     208                 :             :                            const_tree ARG_UNUSED (value), const_tree type)
     209                 :             : {
     210                 :           0 :   gcc_assert (TREE_CODE (type) == ERROR_MARK);
     211                 :           0 :   return;
     212                 :             : }
     213                 :             : 
     214                 :             : /* Provide a default routine for alias sets that always returns -1.  This
     215                 :             :    is used by languages that don't need to do anything special.  */
     216                 :             : 
     217                 :             : alias_set_type
     218                 :  1029416392 : lhd_get_alias_set (tree ARG_UNUSED (t))
     219                 :             : {
     220                 :  1029416392 :   return -1;
     221                 :             : }
     222                 :             : 
     223                 :             : /* This is the default decl_printable_name function.  */
     224                 :             : 
     225                 :             : const char *
     226                 :     7919408 : lhd_decl_printable_name (tree decl, int ARG_UNUSED (verbosity))
     227                 :             : {
     228                 :     7919408 :   gcc_assert (decl && DECL_NAME (decl));
     229                 :     7919408 :   return IDENTIFIER_POINTER (DECL_NAME (decl));
     230                 :             : }
     231                 :             : 
     232                 :             : /* This is the default dwarf_name function.  */
     233                 :             : 
     234                 :             : const char *
     235                 :     7572989 : lhd_dwarf_name (tree t, int verbosity)
     236                 :             : {
     237                 :     7572989 :   gcc_assert (DECL_P (t));
     238                 :             : 
     239                 :     7572989 :   return lang_hooks.decl_printable_name (t, verbosity);
     240                 :             : }
     241                 :             : 
     242                 :             : /* This compares two types for equivalence ("compatible" in C-based languages).
     243                 :             :    This routine should only return 1 if it is sure.  It should not be used
     244                 :             :    in contexts where erroneously returning 0 causes problems.  */
     245                 :             : 
     246                 :             : int
     247                 :           0 : lhd_types_compatible_p (tree x, tree y)
     248                 :             : {
     249                 :           0 :   return TYPE_MAIN_VARIANT (x) == TYPE_MAIN_VARIANT (y);
     250                 :             : }
     251                 :             : 
     252                 :             : /* lang_hooks.tree_dump.dump_tree:  Dump language-specific parts of tree
     253                 :             :    nodes.  Returns nonzero if it does not want the usual dumping of the
     254                 :             :    second argument.  */
     255                 :             : 
     256                 :             : bool
     257                 :           0 : lhd_tree_dump_dump_tree (void *di ATTRIBUTE_UNUSED, tree t ATTRIBUTE_UNUSED)
     258                 :             : {
     259                 :           0 :   return false;
     260                 :             : }
     261                 :             : 
     262                 :             : /* lang_hooks.tree_dump.type_qual:  Determine type qualifiers in a
     263                 :             :    language-specific way.  */
     264                 :             : 
     265                 :             : int
     266                 :           4 : lhd_tree_dump_type_quals (const_tree t)
     267                 :             : {
     268                 :           4 :   return TYPE_QUALS (t);
     269                 :             : }
     270                 :             : 
     271                 :             : /* lang_hooks.gimplify_expr re-writes *EXPR_P into GIMPLE form.  */
     272                 :             : 
     273                 :             : int
     274                 :    82446993 : lhd_gimplify_expr (tree *expr_p ATTRIBUTE_UNUSED,
     275                 :             :                    gimple_seq *pre_p ATTRIBUTE_UNUSED,
     276                 :             :                    gimple_seq *post_p ATTRIBUTE_UNUSED)
     277                 :             : {
     278                 :    82446993 :   return GS_UNHANDLED;
     279                 :             : }
     280                 :             : 
     281                 :             : /* lang_hooks.tree_size: Determine the size of a tree with code C,
     282                 :             :    which is a language-specific tree code in category tcc_constant,
     283                 :             :    tcc_exceptional or tcc_type.  The default expects never to be called.  */
     284                 :             : size_t
     285                 :           0 : lhd_tree_size (enum tree_code c ATTRIBUTE_UNUSED)
     286                 :             : {
     287                 :           0 :   gcc_unreachable ();
     288                 :             : }
     289                 :             : 
     290                 :             : /* Return true if decl, which is a function decl, may be called by a
     291                 :             :    sibcall.  */
     292                 :             : 
     293                 :             : bool
     294                 :      127990 : lhd_decl_ok_for_sibcall (const_tree decl ATTRIBUTE_UNUSED)
     295                 :             : {
     296                 :      127990 :   return true;
     297                 :             : }
     298                 :             : 
     299                 :             : /* Generic global declaration processing.  This is meant to be called
     300                 :             :    by the front-ends at the end of parsing.  C/C++ do their own thing,
     301                 :             :    but other front-ends may call this.  */
     302                 :             : 
     303                 :             : void
     304                 :       30824 : global_decl_processing (void)
     305                 :             : {
     306                 :       30824 :   tree globals, decl, *vec;
     307                 :       30824 :   int len, i;
     308                 :             : 
     309                 :       30824 :   timevar_stop (TV_PHASE_PARSING);
     310                 :       30824 :   timevar_start (TV_PHASE_DEFERRED);
     311                 :             :   /* Really define vars that have had only a tentative definition.
     312                 :             :      Really output inline functions that must actually be callable
     313                 :             :      and have not been output so far.  */
     314                 :             : 
     315                 :       30824 :   globals = lang_hooks.decls.getdecls ();
     316                 :       30824 :   len = list_length (globals);
     317                 :       30824 :   vec = XNEWVEC (tree, len);
     318                 :             : 
     319                 :             :   /* Process the decls in reverse order--earliest first.
     320                 :             :      Put them into VEC from back to front, then take out from front.  */
     321                 :             : 
     322                 :   138298243 :   for (i = 0, decl = globals; i < len; i++, decl = DECL_CHAIN (decl))
     323                 :   138236595 :     vec[len - i - 1] = decl;
     324                 :             : 
     325                 :       30824 :   wrapup_global_declarations (vec, len);
     326                 :       30824 :   timevar_stop (TV_PHASE_DEFERRED);
     327                 :             : 
     328                 :       30824 :   timevar_start (TV_PHASE_PARSING);
     329                 :       30824 :   free (vec);
     330                 :       30824 : }
     331                 :             : 
     332                 :             : /* Called to perform language-specific initialization of CTX.  */
     333                 :             : void
     334                 :       79233 : lhd_initialize_diagnostics (diagnostics::context *ctx ATTRIBUTE_UNUSED)
     335                 :             : {
     336                 :       79233 : }
     337                 :             : 
     338                 :             : /* Called to register dumps.  */
     339                 :             : void
     340                 :      169977 : lhd_register_dumps (gcc::dump_manager *)
     341                 :             : {
     342                 :      169977 : }
     343                 :             : 
     344                 :             : /* Called to perform language-specific options initialization.  */
     345                 :             : void
     346                 :       32873 : lhd_init_options (unsigned int decoded_options_count ATTRIBUTE_UNUSED,
     347                 :             :                   struct cl_decoded_option *decoded_options ATTRIBUTE_UNUSED)
     348                 :             : {
     349                 :       32873 : }
     350                 :             : 
     351                 :             : /* By default, always complain about options for the wrong language.  */
     352                 :             : bool
     353                 :           6 : lhd_complain_wrong_lang_p (const struct cl_option *option ATTRIBUTE_UNUSED)
     354                 :             : {
     355                 :           6 :   return true;
     356                 :             : }
     357                 :             : 
     358                 :             : /* By default, no language-specific options are valid.  */
     359                 :             : bool
     360                 :           0 : lhd_handle_option (size_t code ATTRIBUTE_UNUSED,
     361                 :             :                    const char *arg ATTRIBUTE_UNUSED,
     362                 :             :                    HOST_WIDE_INT value ATTRIBUTE_UNUSED,
     363                 :             :                    int kind ATTRIBUTE_UNUSED,
     364                 :             :                    location_t loc ATTRIBUTE_UNUSED,
     365                 :             :                    const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
     366                 :             : {
     367                 :           0 :   return false;
     368                 :             : }
     369                 :             : 
     370                 :             : /* The default function to print out name of current function that caused
     371                 :             :    an error.  */
     372                 :             : void
     373                 :      105652 : lhd_print_error_function (diagnostics::text_sink &text_output,
     374                 :             :                           const char *file,
     375                 :             :                           const diagnostics::diagnostic_info *diagnostic)
     376                 :             : {
     377                 :      105652 :   diagnostics::context *const context = &text_output.get_context ();
     378                 :      105652 :   if (diagnostic_last_function_changed (context, diagnostic))
     379                 :             :     {
     380                 :       15525 :       pretty_printer *const pp = text_output.get_printer ();
     381                 :       15525 :       char *old_prefix = pp_take_prefix (pp);
     382                 :       15525 :       tree abstract_origin = diagnostic_abstract_origin (diagnostic);
     383                 :       15525 :       char *new_prefix = (file && abstract_origin == NULL)
     384                 :       15525 :                          ? text_output.file_name_as_prefix (file) : NULL;
     385                 :             : 
     386                 :       15525 :       pp_set_prefix (pp, new_prefix);
     387                 :             : 
     388                 :       15525 :       if (current_function_decl == NULL)
     389                 :         589 :         pp_printf (pp, _("At top level:"));
     390                 :             :       else
     391                 :             :         {
     392                 :       14936 :           tree fndecl, ao;
     393                 :             : 
     394                 :       14936 :           if (abstract_origin)
     395                 :             :             {
     396                 :         187 :               ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin);
     397                 :         187 :               gcc_assert (TREE_CODE (ao) == FUNCTION_DECL);
     398                 :             :               fndecl = ao;
     399                 :             :             }
     400                 :             :           else
     401                 :             :             fndecl = current_function_decl;
     402                 :             : 
     403                 :       14936 :           if (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE)
     404                 :           6 :             pp_printf
     405                 :           6 :               (pp, _("In member function %qs"),
     406                 :           6 :                identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)));
     407                 :             :           else
     408                 :       14930 :             pp_printf
     409                 :       14930 :               (pp, _("In function %qs"),
     410                 :       14930 :                identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)));
     411                 :             : 
     412                 :       15186 :           while (abstract_origin)
     413                 :             :             {
     414                 :         250 :               location_t *locus;
     415                 :         250 :               tree block = abstract_origin;
     416                 :             : 
     417                 :         250 :               locus = &BLOCK_SOURCE_LOCATION (block);
     418                 :         250 :               fndecl = NULL;
     419                 :         250 :               block = BLOCK_SUPERCONTEXT (block);
     420                 :         525 :               while (block && TREE_CODE (block) == BLOCK
     421                 :         550 :                      && BLOCK_ABSTRACT_ORIGIN (block))
     422                 :             :                 {
     423                 :          88 :                   ao = BLOCK_ABSTRACT_ORIGIN (block);
     424                 :          88 :                   if (TREE_CODE (ao) == FUNCTION_DECL)
     425                 :             :                     {
     426                 :             :                       fndecl = ao;
     427                 :             :                       break;
     428                 :             :                     }
     429                 :          25 :                   else if (TREE_CODE (ao) != BLOCK)
     430                 :             :                     break;
     431                 :             : 
     432                 :          25 :                   block = BLOCK_SUPERCONTEXT (block);
     433                 :             :                 }
     434                 :         250 :               if (fndecl)
     435                 :             :                 abstract_origin = block;
     436                 :             :               else
     437                 :             :                 {
     438                 :         435 :                   while (block && TREE_CODE (block) == BLOCK)
     439                 :         248 :                     block = BLOCK_SUPERCONTEXT (block);
     440                 :             : 
     441                 :         187 :                   if (block && TREE_CODE (block) == FUNCTION_DECL)
     442                 :             :                     fndecl = block;
     443                 :             :                   abstract_origin = NULL;
     444                 :             :                 }
     445                 :             :               if (fndecl)
     446                 :             :                 {
     447                 :         250 :                   expanded_location s = expand_location (*locus);
     448                 :         250 :                   pp_comma (pp);
     449                 :         250 :                   pp_newline (pp);
     450                 :         250 :                   if (s.file != NULL)
     451                 :             :                     {
     452                 :         250 :                       if (context->m_show_column)
     453                 :         250 :                         pp_printf (pp,
     454                 :         250 :                                    _("    inlined from %qs at %r%s:%d:%d%R"),
     455                 :         250 :                                    identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)),
     456                 :             :                                    "locus", s.file, s.line, s.column);
     457                 :             :                       else
     458                 :           0 :                         pp_printf (pp,
     459                 :           0 :                                    _("    inlined from %qs at %r%s:%d%R"),
     460                 :           0 :                                    identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)),
     461                 :             :                                    "locus", s.file, s.line);
     462                 :             : 
     463                 :             :                     }
     464                 :             :                   else
     465                 :           0 :                     pp_printf (pp, _("    inlined from %qs"),
     466                 :           0 :                                identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)));
     467                 :             :                 }
     468                 :             :             }
     469                 :       14936 :           pp_colon (pp);
     470                 :             :         }
     471                 :             : 
     472                 :       15525 :       diagnostic_set_last_function (context, diagnostic);
     473                 :       15525 :       pp_newline_and_flush (pp);
     474                 :       15525 :       pp->set_prefix (old_prefix);
     475                 :             :     }
     476                 :      105652 : }
     477                 :             : 
     478                 :             : tree
     479                 :      227378 : lhd_make_node (enum tree_code code)
     480                 :             : {
     481                 :      227378 :   return make_node (code);
     482                 :             : }
     483                 :             : 
     484                 :             : /* Default implementation of LANG_HOOKS_SIMULATE_ENUM_DECL.  Assume a
     485                 :             :    simple int-based enumerator (which is all the hook can be used for
     486                 :             :    at present) and push each decl individually without any decoration.
     487                 :             : 
     488                 :             :    This definition is suitable for LTO and is generic enough that it
     489                 :             :    might be reusable elsewhere.  */
     490                 :             : tree
     491                 :           0 : lhd_simulate_enum_decl (location_t loc, const char *name,
     492                 :             :                         vec<string_int_pair> *values_ptr)
     493                 :             : {
     494                 :           0 :   tree enumtype = lang_hooks.types.make_type (ENUMERAL_TYPE);
     495                 :           0 :   tree enumdecl = build_decl (loc, TYPE_DECL, get_identifier (name), enumtype);
     496                 :           0 :   TYPE_STUB_DECL (enumtype) = enumdecl;
     497                 :             : 
     498                 :           0 :   tree value_chain = NULL_TREE;
     499                 :           0 :   string_int_pair *value;
     500                 :           0 :   vec<string_int_pair> values = *values_ptr;
     501                 :           0 :   unsigned int i;
     502                 :           0 :   FOR_EACH_VEC_ELT (values, i, value)
     503                 :             :     {
     504                 :           0 :       tree value_decl = build_decl (loc, CONST_DECL,
     505                 :             :                                     get_identifier (value->first), enumtype);
     506                 :           0 :       DECL_INITIAL (value_decl) = build_int_cst (integer_type_node,
     507                 :           0 :                                                  value->second);
     508                 :           0 :       lang_hooks.decls.pushdecl (value_decl);
     509                 :           0 :       value_chain = tree_cons (value_decl, DECL_INITIAL (value_decl),
     510                 :             :                                value_chain);
     511                 :             :     }
     512                 :             : 
     513                 :           0 :   TYPE_MIN_VALUE (enumtype) = TYPE_MIN_VALUE (integer_type_node);
     514                 :           0 :   TYPE_MAX_VALUE (enumtype) = TYPE_MAX_VALUE (integer_type_node);
     515                 :           0 :   SET_TYPE_ALIGN (enumtype, TYPE_ALIGN (integer_type_node));
     516                 :           0 :   TYPE_PRECISION (enumtype) = TYPE_PRECISION (integer_type_node);
     517                 :           0 :   layout_type (enumtype);
     518                 :           0 :   lang_hooks.decls.pushdecl (enumdecl);
     519                 :             : 
     520                 :           0 :   return enumtype;
     521                 :             : }
     522                 :             : 
     523                 :             : /* Default implementation of LANG_HOOKS_SIMULATE_RECORD_DECL.
     524                 :             :    Just create a normal RECORD_TYPE and a TYPE_DECL for it.  */
     525                 :             : tree
     526                 :           0 : lhd_simulate_record_decl (location_t loc, const char *name,
     527                 :             :                           array_slice<const tree> fields)
     528                 :             : {
     529                 :           0 :   for (unsigned int i = 1; i < fields.size (); ++i)
     530                 :             :     /* Reversed by finish_builtin_struct.  */
     531                 :           0 :     DECL_CHAIN (fields[i]) = fields[i - 1];
     532                 :             : 
     533                 :           0 :   tree type = lang_hooks.types.make_type (RECORD_TYPE);
     534                 :           0 :   finish_builtin_struct (type, name, fields.back (), NULL_TREE);
     535                 :             : 
     536                 :           0 :   tree decl = build_decl (loc, TYPE_DECL, get_identifier (name), type);
     537                 :           0 :   lang_hooks.decls.pushdecl (decl);
     538                 :             : 
     539                 :           0 :   return type;
     540                 :             : }
     541                 :             : 
     542                 :             : /* Default implementation of LANG_HOOKS_TYPE_FOR_SIZE.
     543                 :             :    Return an integer type with PRECISION bits of precision,
     544                 :             :    that is unsigned if UNSIGNEDP is nonzero, otherwise signed.  */
     545                 :             : 
     546                 :             : tree
     547                 :      119258 : lhd_type_for_size (unsigned precision, int unsignedp)
     548                 :             : {
     549                 :      119258 :   int i;
     550                 :             : 
     551                 :      119258 :   if (precision == TYPE_PRECISION (integer_type_node))
     552                 :       23884 :     return unsignedp ? unsigned_type_node : integer_type_node;
     553                 :             : 
     554                 :       95374 :   if (precision == TYPE_PRECISION (signed_char_type_node))
     555                 :       23841 :     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
     556                 :             : 
     557                 :       71533 :   if (precision == TYPE_PRECISION (short_integer_type_node))
     558                 :       23842 :     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
     559                 :             : 
     560                 :       47691 :   if (precision == TYPE_PRECISION (long_integer_type_node))
     561                 :       23851 :     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
     562                 :             : 
     563                 :       23840 :   if (precision == TYPE_PRECISION (long_long_integer_type_node))
     564                 :           0 :     return unsignedp
     565                 :           0 :            ? long_long_unsigned_type_node
     566                 :           0 :            : long_long_integer_type_node;
     567                 :             : 
     568                 :       23840 :   for (i = 0; i < NUM_INT_N_ENTS; i ++)
     569                 :       23840 :     if (int_n_enabled_p[i]
     570                 :       23840 :         && precision == int_n_data[i].bitsize)
     571                 :       23840 :       return (unsignedp ? int_n_trees[i].unsigned_type
     572                 :       23840 :               : int_n_trees[i].signed_type);
     573                 :             : 
     574                 :           0 :   if (precision <= TYPE_PRECISION (intQI_type_node))
     575                 :           0 :     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
     576                 :             : 
     577                 :           0 :   if (precision <= TYPE_PRECISION (intHI_type_node))
     578                 :           0 :     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
     579                 :             : 
     580                 :           0 :   if (precision <= TYPE_PRECISION (intSI_type_node))
     581                 :           0 :     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
     582                 :             : 
     583                 :           0 :   if (precision <= TYPE_PRECISION (intDI_type_node))
     584                 :           0 :     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
     585                 :             : 
     586                 :           0 :   if (precision <= TYPE_PRECISION (intTI_type_node))
     587                 :           0 :     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
     588                 :             : 
     589                 :             :   return NULL_TREE;
     590                 :             : }
     591                 :             : 
     592                 :             : HOST_WIDE_INT
     593                 :     4463714 : lhd_to_target_charset (HOST_WIDE_INT c)
     594                 :             : {
     595                 :     4463714 :   return c;
     596                 :             : }
     597                 :             : 
     598                 :             : tree
     599                 :  1116339736 : lhd_expr_to_decl (tree expr, bool *tc ATTRIBUTE_UNUSED, bool *se ATTRIBUTE_UNUSED)
     600                 :             : {
     601                 :  1116339736 :   return expr;
     602                 :             : }
     603                 :             : 
     604                 :             : /* Return sharing kind if OpenMP sharing attribute of DECL is
     605                 :             :    predetermined, OMP_CLAUSE_DEFAULT_UNSPECIFIED otherwise.  */
     606                 :             : 
     607                 :             : enum omp_clause_default_kind
     608                 :           0 : lhd_omp_predetermined_sharing (tree decl)
     609                 :             : {
     610                 :           0 :   if (DECL_ARTIFICIAL (decl))
     611                 :           0 :     return OMP_CLAUSE_DEFAULT_SHARED;
     612                 :             :   return OMP_CLAUSE_DEFAULT_UNSPECIFIED;
     613                 :             : }
     614                 :             : 
     615                 :             : /* Return sharing kind if OpenMP mapping attribute of DECL is
     616                 :             :    predetermined, OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED otherwise.  */
     617                 :             : 
     618                 :             : enum omp_clause_defaultmap_kind
     619                 :           0 : lhd_omp_predetermined_mapping (tree decl)
     620                 :             : {
     621                 :           0 :   if (DECL_ARTIFICIAL (decl))
     622                 :           0 :     return OMP_CLAUSE_DEFAULTMAP_TO;
     623                 :             :   return OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED;
     624                 :             : }
     625                 :             : 
     626                 :             : /* Generate code to copy SRC to DST.  */
     627                 :             : 
     628                 :             : tree
     629                 :           0 : lhd_omp_assignment (tree clause ATTRIBUTE_UNUSED, tree dst, tree src)
     630                 :             : {
     631                 :           0 :   return build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src);
     632                 :             : }
     633                 :             : 
     634                 :             : /* Finalize clause C.  */
     635                 :             : 
     636                 :             : void
     637                 :       49668 : lhd_omp_finish_clause (tree, gimple_seq *, bool)
     638                 :             : {
     639                 :       49668 : }
     640                 :             : 
     641                 :             : /* Return array size; cf. omp_array_data.  */
     642                 :             : 
     643                 :             : tree
     644                 :           0 : lhd_omp_array_size (tree, gimple_seq *)
     645                 :             : {
     646                 :           0 :   return NULL_TREE;
     647                 :             : }
     648                 :             : 
     649                 :             : /* Returns true when additional mappings for a decl are needed.  */
     650                 :             : 
     651                 :             : bool
     652                 :       36493 : lhd_omp_deep_mapping_p (const gimple *, tree)
     653                 :             : {
     654                 :       36493 :   return false;
     655                 :             : }
     656                 :             : 
     657                 :             : /* Returns number of additional mappings for a decl.  */
     658                 :             : 
     659                 :             : tree
     660                 :       40834 : lhd_omp_deep_mapping_cnt (const gimple *, tree, gimple_seq *)
     661                 :             : {
     662                 :       40834 :   return NULL_TREE;
     663                 :             : }
     664                 :             : 
     665                 :             : /* Do the additional mappings.  */
     666                 :             : 
     667                 :             : void
     668                 :           0 : lhd_omp_deep_mapping (const gimple *, tree, unsigned HOST_WIDE_INT, tree, tree,
     669                 :             :                       tree, tree, tree, gimple_seq *)
     670                 :             : {
     671                 :           0 : }
     672                 :             : 
     673                 :             : /* Look up an OpenMP "declare mapper" mapper.  */
     674                 :             : 
     675                 :             : tree
     676                 :           0 : lhd_omp_mapper_lookup (tree, tree)
     677                 :             : {
     678                 :           0 :   return NULL_TREE;
     679                 :             : }
     680                 :             : 
     681                 :             : /* Given the representation used by the front-end to contain a mapper
     682                 :             :    directive, return the statement for the directive itself.  */
     683                 :             : 
     684                 :             : tree
     685                 :           0 : lhd_omp_extract_mapper_directive (tree)
     686                 :             : {
     687                 :           0 :   return error_mark_node;
     688                 :             : }
     689                 :             : 
     690                 :             : /* Return a simplified form for OMP_ARRAY_SECTION argument, or
     691                 :             :    error_mark_node if impossible.  */
     692                 :             : 
     693                 :             : tree
     694                 :           0 : lhd_omp_map_array_section (location_t, tree)
     695                 :             : {
     696                 :           0 :   return error_mark_node;
     697                 :             : }
     698                 :             : 
     699                 :             : /* Return true if DECL is a scalar variable (for the purpose of
     700                 :             :    implicit firstprivatization & mapping). Only if alloc_ptr_ok
     701                 :             :    are allocatables and pointers accepted. */
     702                 :             : 
     703                 :             : bool
     704                 :       23330 : lhd_omp_scalar_p (tree decl, bool ptr_ok)
     705                 :             : {
     706                 :       23330 :   tree type = TREE_TYPE (decl);
     707                 :       23330 :   if (TREE_CODE (type) == REFERENCE_TYPE)
     708                 :        3910 :     type = TREE_TYPE (type);
     709                 :       23330 :   if (TREE_CODE (type) == COMPLEX_TYPE)
     710                 :          36 :     type = TREE_TYPE (type);
     711                 :       23330 :   if (INTEGRAL_TYPE_P (type)
     712                 :       23330 :       || SCALAR_FLOAT_TYPE_P (type)
     713                 :       10513 :       || (ptr_ok && TREE_CODE (type) == POINTER_TYPE))
     714                 :       12837 :     return true;
     715                 :             :   return false;
     716                 :             : }
     717                 :             : 
     718                 :             : /* Return static initializer for DECL.  */
     719                 :             : 
     720                 :             : tree *
     721                 :        4294 : lhd_omp_get_decl_init (tree decl)
     722                 :             : {
     723                 :        4294 :   return &DECL_INITIAL (decl);
     724                 :             : }
     725                 :             : 
     726                 :             : /* Free any extra memory used to hold initializer information for
     727                 :             :    variable declarations.  */
     728                 :             : 
     729                 :             : void
     730                 :        5128 : lhd_omp_finish_decl_inits (void)
     731                 :             : {
     732                 :        5128 : }
     733                 :             : 
     734                 :             : /* Register language specific type size variables as potentially OpenMP
     735                 :             :    firstprivate variables.  */
     736                 :             : 
     737                 :             : void
     738                 :        9251 : lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *c ATTRIBUTE_UNUSED,
     739                 :             :                                    tree t ATTRIBUTE_UNUSED)
     740                 :             : {
     741                 :        9251 : }
     742                 :             : 
     743                 :             : /* Common function for add_builtin_function, add_builtin_function_ext_scope
     744                 :             :    and simulate_builtin_function_decl.  */
     745                 :             : 
     746                 :             : static tree
     747                 :   832841430 : build_builtin_function (location_t location, const char *name, tree type,
     748                 :             :                         int function_code, enum built_in_class cl,
     749                 :             :                         const char *library_name, tree attrs)
     750                 :             : {
     751                 :   832841430 :   tree   id = get_identifier (name);
     752                 :   832841430 :   tree decl = build_decl (location, FUNCTION_DECL, id, type);
     753                 :             : 
     754                 :   832841430 :   TREE_PUBLIC (decl)         = 1;
     755                 :   832841430 :   DECL_EXTERNAL (decl)       = 1;
     756                 :             : 
     757                 :   832841430 :   set_decl_built_in_function (decl, cl, function_code);
     758                 :             : 
     759                 :   832841430 :   if (library_name)
     760                 :             :     {
     761                 :   266750562 :       tree libname = get_identifier (library_name);
     762                 :             : 
     763                 :   266750562 :       libname = targetm.mangle_decl_assembler_name (decl, libname);
     764                 :   266750562 :       SET_DECL_ASSEMBLER_NAME (decl, libname);
     765                 :             :     }
     766                 :             : 
     767                 :             :   /* Possibly apply some default attributes to this built-in function.  */
     768                 :   832841430 :   if (attrs)
     769                 :   485847632 :     decl_attributes (&decl, attrs, ATTR_FLAG_BUILT_IN);
     770                 :             :   else
     771                 :   346993798 :     decl_attributes (&decl, NULL_TREE, 0);
     772                 :             : 
     773                 :   832841430 :   return decl;
     774                 :             : }
     775                 :             : 
     776                 :             : /* Create a builtin function.  */
     777                 :             : 
     778                 :             : tree
     779                 :   821824655 : add_builtin_function (const char *name,
     780                 :             :                       tree type,
     781                 :             :                       int function_code,
     782                 :             :                       enum built_in_class cl,
     783                 :             :                       const char *library_name,
     784                 :             :                       tree attrs)
     785                 :             : {
     786                 :   821824655 :   tree decl = build_builtin_function (BUILTINS_LOCATION, name, type,
     787                 :             :                                       function_code, cl, library_name, attrs);
     788                 :   821824655 :   return lang_hooks.builtin_function (decl);
     789                 :             : }
     790                 :             : 
     791                 :             : /* Like add_builtin_function, but make sure the scope is the external scope.
     792                 :             :    This is used to delay putting in back end builtin functions until the ISA
     793                 :             :    that defines the builtin is declared via function specific target options,
     794                 :             :    which can save memory for machines like the x86_64 that have multiple ISAs.
     795                 :             :    If this points to the same function as builtin_function, the backend must
     796                 :             :    add all of the builtins at program initialization time.  */
     797                 :             : 
     798                 :             : tree
     799                 :    11016775 : add_builtin_function_ext_scope (const char *name,
     800                 :             :                                 tree type,
     801                 :             :                                 int function_code,
     802                 :             :                                 enum built_in_class cl,
     803                 :             :                                 const char *library_name,
     804                 :             :                                 tree attrs)
     805                 :             : {
     806                 :    11016775 :   tree decl = build_builtin_function (BUILTINS_LOCATION, name, type,
     807                 :             :                                       function_code, cl, library_name, attrs);
     808                 :    11016775 :   return lang_hooks.builtin_function_ext_scope (decl);
     809                 :             : }
     810                 :             : 
     811                 :             : /* Simulate a declaration of a target-specific built-in function at
     812                 :             :    location LOCATION, as though it had been declared directly in the
     813                 :             :    source language.  NAME is the name of the function, TYPE is its function
     814                 :             :    type, FUNCTION_CODE is the target-specific function code, LIBRARY_NAME
     815                 :             :    is the name of the underlying library function (NULL if none) and
     816                 :             :    ATTRS is a list of function attributes.
     817                 :             : 
     818                 :             :    Return the decl of the declared function.  */
     819                 :             : 
     820                 :             : tree
     821                 :           0 : simulate_builtin_function_decl (location_t location, const char *name,
     822                 :             :                                 tree type, int function_code,
     823                 :             :                                 const char *library_name, tree attrs)
     824                 :             : {
     825                 :           0 :   tree decl = build_builtin_function (location, name, type,
     826                 :             :                                       function_code, BUILT_IN_MD,
     827                 :             :                                       library_name, attrs);
     828                 :           0 :   tree new_decl = lang_hooks.simulate_builtin_function_decl (decl);
     829                 :             : 
     830                 :             :   /* Give the front end a chance to create a new decl if necessary,
     831                 :             :      but if the front end discards the decl in favour of a conflicting
     832                 :             :      (erroneous) previous definition, return the decl that we tried but
     833                 :             :      failed to add.  This allows the caller to process the returned decl
     834                 :             :      normally, even though the source code won't be able to use it.  */
     835                 :           0 :   if (TREE_CODE (new_decl) == FUNCTION_DECL
     836                 :           0 :       && fndecl_built_in_p (new_decl, function_code, BUILT_IN_MD))
     837                 :           0 :     return new_decl;
     838                 :             : 
     839                 :             :   return decl;
     840                 :             : }
     841                 :             : 
     842                 :             : tree
     843                 :           0 : lhd_builtin_function (tree decl)
     844                 :             : {
     845                 :           0 :   lang_hooks.decls.pushdecl (decl);
     846                 :           0 :   return decl;
     847                 :             : }
     848                 :             : 
     849                 :             : /* Create a builtin type.  */
     850                 :             : 
     851                 :             : tree
     852                 :           0 : add_builtin_type (const char *name, tree type)
     853                 :             : {
     854                 :           0 :   tree   id = get_identifier (name);
     855                 :           0 :   tree decl = build_decl (BUILTINS_LOCATION, TYPE_DECL, id, type);
     856                 :           0 :   return lang_hooks.decls.pushdecl (decl);
     857                 :             : }
     858                 :             : 
     859                 :             : /* LTO hooks.  */
     860                 :             : 
     861                 :             : /* Used to save and restore any previously active section.  */
     862                 :             : static section *saved_section;
     863                 :             : 
     864                 :             : 
     865                 :             : /* Begin a new LTO output section named NAME.  This default implementation
     866                 :             :    saves the old section and emits assembly code to switch to the new
     867                 :             :    section.  */
     868                 :             : 
     869                 :             : void
     870                 :      435390 : lhd_begin_section (const char *name)
     871                 :             : {
     872                 :      435390 :   section *section;
     873                 :             : 
     874                 :             :   /* Save the old section so we can restore it in lto_end_asm_section.  */
     875                 :      435390 :   gcc_assert (!saved_section);
     876                 :      435390 :   saved_section = in_section;
     877                 :      435390 :   if (!saved_section)
     878                 :       23004 :     saved_section = text_section;
     879                 :             : 
     880                 :             :   /* Create a new section and switch to it.  */
     881                 :      435390 :   section = get_section (name, SECTION_DEBUG | SECTION_EXCLUDE, NULL, true);
     882                 :      435390 :   switch_to_section (section);
     883                 :      435390 : }
     884                 :             : 
     885                 :             : 
     886                 :             : /* Write DATA of length LEN to the current LTO output section.  This default
     887                 :             :    implementation just calls assemble_string.  */
     888                 :             : 
     889                 :             : void
     890                 :     4749372 : lhd_append_data (const void *data, size_t len, void *)
     891                 :             : {
     892                 :     4749372 :   if (data)
     893                 :             :     {
     894                 :     4749372 :       timevar_push (TV_IPA_LTO_OUTPUT);
     895                 :     4749372 :       assemble_string ((const char *)data, len);
     896                 :     4749372 :       timevar_pop (TV_IPA_LTO_OUTPUT);
     897                 :             :     }
     898                 :     4749372 : }
     899                 :             : 
     900                 :             : 
     901                 :             : /* Finish the current LTO output section.  This default implementation emits
     902                 :             :    assembly code to switch to any section previously saved by
     903                 :             :    lhd_begin_section.  */
     904                 :             : 
     905                 :             : void
     906                 :      435390 : lhd_end_section (void)
     907                 :             : {
     908                 :      435390 :   if (saved_section)
     909                 :             :     {
     910                 :      435390 :       switch_to_section (saved_section);
     911                 :      435390 :       saved_section = NULL;
     912                 :             :     }
     913                 :      435390 : }
     914                 :             : 
     915                 :             : /* Default implementation of enum_underlying_base_type using type_for_size.  */
     916                 :             : 
     917                 :             : tree
     918                 :       89717 : lhd_enum_underlying_base_type (const_tree enum_type)
     919                 :             : {
     920                 :       89717 :   return lang_hooks.types.type_for_size (TYPE_PRECISION (enum_type),
     921                 :       89717 :                                          TYPE_UNSIGNED (enum_type));
     922                 :             : }
     923                 :             : 
     924                 :             : /* Default implementation of LANG_HOOKS_GET_SUBSTRING_LOCATION.  */
     925                 :             : 
     926                 :             : const char *
     927                 :         541 : lhd_get_substring_location (const substring_loc &, location_t *)
     928                 :             : {
     929                 :         541 :   return "unimplemented";
     930                 :             : }
     931                 :             : 
     932                 :             : /* Default implementation of LANG_HOOKS_DECL_DWARF_ATTRIBUTE.  Don't add
     933                 :             :    any attributes.  */
     934                 :             : 
     935                 :             : int
     936                 :     6056991 : lhd_decl_dwarf_attribute (const_tree, int)
     937                 :             : {
     938                 :     6056991 :   return -1;
     939                 :             : }
     940                 :             : 
     941                 :             : /* Default implementation of LANG_HOOKS_TYPE_DWARF_ATTRIBUTE.  Don't add
     942                 :             :    any attributes.  */
     943                 :             : 
     944                 :             : int
     945                 :      114122 : lhd_type_dwarf_attribute (const_tree, int)
     946                 :             : {
     947                 :      114122 :   return -1;
     948                 :             : }
     949                 :             : 
     950                 :             : /* Default implementation of LANG_HOOKS_UNIT_SIZE_WITHOUT_REUSABLE_PADDING.
     951                 :             :    Just return TYPE_SIZE_UNIT unadjusted.  */
     952                 :             : 
     953                 :             : tree
     954                 :        7608 : lhd_unit_size_without_reusable_padding (tree t)
     955                 :             : {
     956                 :        7608 :   return TYPE_SIZE_UNIT (t);
     957                 :             : }
     958                 :             : 
     959                 :             : /* Default implementation for the finalize_early_debug hook.  */
     960                 :             : 
     961                 :             : void
     962                 :       51934 : lhd_finalize_early_debug (void)
     963                 :             : {
     964                 :             :   /* Emit early debug for reachable functions, and by consequence,
     965                 :             :      locally scoped symbols.  */
     966                 :       51934 :   struct cgraph_node *cnode;
     967                 :      574149 :   FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (cnode)
     968                 :      522215 :     (*debug_hooks->early_global_decl) (cnode->decl);
     969                 :       51934 : }
     970                 :             : 
     971                 :             : /* Default implementation of LANG_HOOKS_GET_SARIF_SOURCE_LANGUAGE.  */
     972                 :             : 
     973                 :             : const char *
     974                 :           0 : lhd_get_sarif_source_language (const char *)
     975                 :             : {
     976                 :           0 :   return NULL;
     977                 :             : }
     978                 :             : 
     979                 :             : /* Returns true if the current lang_hooks represents the GNU C frontend.  */
     980                 :             : 
     981                 :             : bool
     982                 :      527369 : lang_GNU_C (void)
     983                 :             : {
     984                 :      527369 :   return (startswith (lang_hooks.name, "GNU C")
     985                 :      527369 :           && (lang_hooks.name[5] == '\0' || ISDIGIT (lang_hooks.name[5])));
     986                 :             : }
     987                 :             : 
     988                 :             : /* Returns true if the current lang_hooks represents the GNU C++ frontend.  */
     989                 :             : 
     990                 :             : bool
     991                 :       17440 : lang_GNU_CXX (void)
     992                 :             : {
     993                 :       17440 :   return startswith (lang_hooks.name, "GNU C++");
     994                 :             : }
     995                 :             : 
     996                 :             : /* Returns true if the current lang_hooks represents the GNU Fortran frontend.  */
     997                 :             : 
     998                 :             : bool
     999                 :      209611 : lang_GNU_Fortran (void)
    1000                 :             : {
    1001                 :      209611 :   return startswith (lang_hooks.name, "GNU Fortran");
    1002                 :             : }
    1003                 :             : 
    1004                 :             : /* Returns true if the current lang_hooks represents the GNU Objective-C
    1005                 :             :    frontend.  */
    1006                 :             : 
    1007                 :             : bool
    1008                 :      120508 : lang_GNU_OBJC (void)
    1009                 :             : {
    1010                 :      120508 :   return startswith (lang_hooks.name, "GNU Objective-C");
    1011                 :             : }
        

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.