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