OK.

On Fri, Oct 14, 2016 at 1:29 PM, Jakub Jelinek <ja...@redhat.com> wrote:
> Hi!
>
> Before early dwarf changes, if we wanted to note some decl property so that
> some corresponding DWARF attribute can be emitted, we had to use some
> generic IL bit for that.  Now a langhook can be used instead (hopefully for
> 7.x even with LTO), but having a single langhook for each such bit looks
> excessive to me, when all we actually want is forward some bits from the C++
> FE lang structures/macros to dwarf2out.
>
> So, this patch introduces a lang hook through which dwarf2out can ask if
> some DW_AT_* attribute should be added to decl (it is dwarf2out's business
> to guard it with dwarf_version, dwarf_strict and other conditions), and the
> lang hook just returns -1 if nothing should be added (most attributes we
> care about here have either boolean 0/1 or small unsigned integer values),
> or the value of the attribute that should be added.
>
> I've converted 3 attributes to this new langhook.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> 2016-10-14  Jakub Jelinek  <ja...@redhat.com>
>
>         * langhooks.h (struct lang_hooks_for_decls): Remove
>         function_decl_explicit_p, function_decl_deleted_p and
>         function_decl_defaulted hooks.  Add decl_dwarf_attribute hook.
>         * langhooks-def.h (lhd_decl_dwarf_attribute): Declare.
>         (LANG_HOOKS_FUNCTION_DECL_EXPLICIT_P,
>         LANG_HOOKS_FUNCTION_DECL_DELETED_P,
>         LANG_HOOKS_FUNCTION_DECL_DEFAULTED): Remove.
>         (LANG_HOOKS_DECL_DWARF_ATTRIBUTE): Define.
>         (LANG_HOOKS_DECLS): Remove LANG_HOOKS_FUNCTION_DECL_EXPLICIT_P,
>         LANG_HOOKS_FUNCTION_DECL_DELETED_P and
>         LANG_HOOKS_FUNCTION_DECL_DEFAULTED.  Add
>         LANG_HOOKS_DECL_DWARF_ATTRIBUTE.
>         * langhooks.c (lhd_decl_dwarf_attribute): New function.
>         * dwarf2out.c (gen_subprogram_die): Use
>         lang_hooks.decls.decl_dwarf_attribute instead of
>         lang_hooks.decls.function_decl_*.
> cp/
>         * cp-objcp-common.h (cp_function_decl_explicit_p,
>         cp_function_decl_deleted_p, cp_function_decl_defaulted): Remove.
>         (cp_decl_dwarf_attribute): Declare.
>         (LANG_HOOKS_FUNCTION_DECL_EXPLICIT_P,
>         LANG_HOOKS_FUNCTION_DECL_DELETED_P,
>         LANG_HOOKS_FUNCTION_DECL_DEFAULTED): Remove.
>         (LANG_HOOKS_DECL_DWARF_ATTRIBUTE): Redefine.
>         * cp-objcp-common.c (cp_function_decl_explicit_p,
>         cp_function_decl_deleted_p, cp_function_decl_defaulted): Remove.
>         (cp_decl_dwarf_attribute): New function.
>
> --- gcc/langhooks.h.jj  2016-10-13 10:24:46.000000000 +0200
> +++ gcc/langhooks.h     2016-10-14 14:27:07.806695803 +0200
> @@ -182,16 +182,9 @@ struct lang_hooks_for_decls
>    /* Returns the chain of decls so far in the current scope level.  */
>    tree (*getdecls) (void);
>
> -  /* Returns true if DECL is explicit member function.  */
> -  bool (*function_decl_explicit_p) (const_tree);
> -
> -  /* Returns true if DECL is C++11 deleted special member function.  */
> -  bool (*function_decl_deleted_p) (const_tree);
> -
> -  /* Returns 0 if DECL is NOT a C++11 defaulted special member
> -     function, 1 if it is explicitly defaulted within the class body,
> -     or 2 if it is explicitly defaulted outside the class body.  */
> -  int (*function_decl_defaulted) (const_tree);
> +  /* Returns -1 if dwarf ATTR shouldn't be added for DECL, or the attribute
> +     value otherwise.  */
> +  int (*decl_dwarf_attribute) (const_tree, int);
>
>    /* Returns True if the parameter is a generic parameter decl
>       of a generic type, e.g a template template parameter for the C++ FE.  */
> --- gcc/langhooks-def.h.jj      2016-10-13 10:28:19.000000000 +0200
> +++ gcc/langhooks-def.h 2016-10-14 14:29:09.535146412 +0200
> @@ -83,6 +83,7 @@ extern bool lhd_omp_mappable_type (tree)
>
>  extern const char *lhd_get_substring_location (const substring_loc &,
>                                                location_t *out_loc);
> +extern int lhd_decl_dwarf_attribute (const_tree, int);
>
>  #define LANG_HOOKS_NAME                        "GNU unknown"
>  #define LANG_HOOKS_IDENTIFIER_SIZE     sizeof (struct lang_identifier)
> @@ -213,9 +214,7 @@ extern tree lhd_make_node (enum tree_cod
>  #define LANG_HOOKS_GLOBAL_BINDINGS_P global_bindings_p
>  #define LANG_HOOKS_PUSHDECL    pushdecl
>  #define LANG_HOOKS_GETDECLS    getdecls
> -#define LANG_HOOKS_FUNCTION_DECL_EXPLICIT_P hook_bool_const_tree_false
> -#define LANG_HOOKS_FUNCTION_DECL_DELETED_P hook_bool_const_tree_false
> -#define LANG_HOOKS_FUNCTION_DECL_DEFAULTED hook_int_const_tree_0
> +#define LANG_HOOKS_DECL_DWARF_ATTRIBUTE lhd_decl_dwarf_attribute
>  #define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL lhd_warn_unused_global_decl
>  #define LANG_HOOKS_POST_COMPILATION_PARSING_CLEANUPS NULL
>  #define LANG_HOOKS_DECL_OK_FOR_SIBCALL lhd_decl_ok_for_sibcall
> @@ -236,9 +235,7 @@ extern tree lhd_make_node (enum tree_cod
>    LANG_HOOKS_GLOBAL_BINDINGS_P, \
>    LANG_HOOKS_PUSHDECL, \
>    LANG_HOOKS_GETDECLS, \
> -  LANG_HOOKS_FUNCTION_DECL_EXPLICIT_P, \
> -  LANG_HOOKS_FUNCTION_DECL_DELETED_P, \
> -  LANG_HOOKS_FUNCTION_DECL_DEFAULTED, \
> +  LANG_HOOKS_DECL_DWARF_ATTRIBUTE, \
>    LANG_HOOKS_GENERIC_GENERIC_PARAMETER_DECL_P, \
>    LANG_HOOKS_FUNCTION_PARM_EXPANDED_FROM_PACK_P, \
>    LANG_HOOKS_GET_GENERIC_FUNCTION_DECL, \
> --- gcc/langhooks.c.jj  2016-10-13 10:28:19.000000000 +0200
> +++ gcc/langhooks.c     2016-10-14 14:27:16.810581200 +0200
> @@ -693,6 +693,15 @@ lhd_get_substring_location (const substr
>    return "unimplemented";
>  }
>
> +/* Default implementation of LANG_HOOKS_DECL_DWARF_ATTRIBUTE.  Don't add
> +   any attributes.  */
> +
> +int
> +lhd_decl_dwarf_attribute (const_tree, int)
> +{
> +  return -1;
> +}
> +
>  /* Returns true if the current lang_hooks represents the GNU C frontend.  */
>
>  bool
> --- gcc/dwarf2out.c.jj  2016-10-14 12:31:50.000000000 +0200
> +++ gcc/dwarf2out.c     2016-10-14 14:37:15.481961156 +0200
> @@ -20625,20 +20625,19 @@ gen_subprogram_die (tree decl, dw_die_re
>           /* When we process the method declaration, we haven't seen
>              the out-of-class defaulted definition yet, so we have to
>              recheck now.  */
> -         int defaulted = lang_hooks.decls.function_decl_defaulted (decl);
> -         if (defaulted && (dwarf_version >= 5 || ! dwarf_strict)
> +         if ((dwarf_version >= 5 || ! dwarf_strict)
>               && !get_AT (subr_die, DW_AT_defaulted))
> -           switch (defaulted)
> -             {
> -             case 2:
> -               add_AT_unsigned (subr_die, DW_AT_defaulted,
> -                                DW_DEFAULTED_out_of_class);
> -               break;
> -
> -             case 1: /* This must have been handled before.  */
> -             default:
> -               gcc_unreachable ();
> -             }
> +           {
> +             int defaulted
> +               = lang_hooks.decls.decl_dwarf_attribute (decl,
> +                                                        DW_AT_defaulted);
> +             if (defaulted != -1)
> +               {
> +                 /* Other values must have been handled before.  */
> +                 gcc_assert (defaulted == DW_DEFAULTED_out_of_class);
> +                 add_AT_unsigned (subr_die, DW_AT_defaulted, defaulted);
> +               }
> +           }
>         }
>      }
>    /* Create a fresh DIE for anything else.  */
> @@ -20681,40 +20680,28 @@ gen_subprogram_die (tree decl, dw_die_re
>
>           /* If this is an explicit function declaration then generate
>              a DW_AT_explicit attribute.  */
> -         if (lang_hooks.decls.function_decl_explicit_p (decl)
> -             && (dwarf_version >= 3 || !dwarf_strict))
> +         if ((dwarf_version >= 3 || !dwarf_strict)
> +             && lang_hooks.decls.decl_dwarf_attribute (decl,
> +                                                       DW_AT_explicit) == 1)
>             add_AT_flag (subr_die, DW_AT_explicit, 1);
>
>           /* If this is a C++11 deleted special function member then generate
>              a DW_AT_deleted attribute.  */
> -         if (lang_hooks.decls.function_decl_deleted_p (decl)
> -             && (dwarf_version >= 5 || ! dwarf_strict))
> +         if ((dwarf_version >= 5 || !dwarf_strict)
> +             && lang_hooks.decls.decl_dwarf_attribute (decl,
> +                                                       DW_AT_deleted) == 1)
>             add_AT_flag (subr_die, DW_AT_deleted, 1);
>
>           /* If this is a C++11 defaulted special function member then
>              generate a DW_AT_GNU_defaulted attribute.  */
> -         int defaulted = lang_hooks.decls.function_decl_defaulted (decl);
> -         if (defaulted && (dwarf_version >= 5 || ! dwarf_strict))
> -           switch (defaulted)
> -             {
> -             case 1:
> -               add_AT_unsigned (subr_die, DW_AT_defaulted,
> -                                DW_DEFAULTED_in_class);
> -               break;
> -
> -               /* It is likely that this will never hit, since we
> -                  don't have the out-of-class definition yet when we
> -                  process the class definition and the method
> -                  declaration.  We recheck elsewhere, but leave it
> -                  here just in case.  */
> -             case 2:
> -               add_AT_unsigned (subr_die, DW_AT_defaulted,
> -                                DW_DEFAULTED_out_of_class);
> -               break;
> -
> -             default:
> -               gcc_unreachable ();
> -             }
> +         if (dwarf_version >= 5 || !dwarf_strict)
> +           {
> +             int defaulted
> +               = lang_hooks.decls.decl_dwarf_attribute (decl,
> +                                                        DW_AT_defaulted);
> +             if (defaulted != -1)
> +               add_AT_unsigned (subr_die, DW_AT_defaulted, defaulted);
> +           }
>         }
>      }
>    /* Tag abstract instances with DW_AT_inline.  */
> --- gcc/cp/cp-objcp-common.h.jj 2016-08-12 11:12:46.000000000 +0200
> +++ gcc/cp/cp-objcp-common.h    2016-10-14 14:27:45.223219556 +0200
> @@ -26,9 +26,7 @@ along with GCC; see the file COPYING3.
>  extern tree objcp_tsubst_copy_and_build (tree, tree, tsubst_flags_t,
>                                          tree, bool);
>
> -extern bool cp_function_decl_explicit_p (const_tree decl);
> -extern bool cp_function_decl_deleted_p (const_tree decl);
> -extern int cp_function_decl_defaulted (const_tree decl);
> +extern int cp_decl_dwarf_attribute (const_tree, int);
>  extern void cp_common_init_ts (void);
>
>  /* Lang hooks that are shared between C++ and ObjC++ are defined here.  Hooks
> @@ -131,12 +129,8 @@ extern void cp_common_init_ts (void);
>  #define LANG_HOOKS_TO_TARGET_CHARSET c_common_to_target_charset
>  #undef LANG_HOOKS_GIMPLIFY_EXPR
>  #define LANG_HOOKS_GIMPLIFY_EXPR cp_gimplify_expr
> -#undef LANG_HOOKS_FUNCTION_DECL_EXPLICIT_P
> -#define LANG_HOOKS_FUNCTION_DECL_EXPLICIT_P cp_function_decl_explicit_p
> -#undef LANG_HOOKS_FUNCTION_DECL_DELETED_P
> -#define LANG_HOOKS_FUNCTION_DECL_DELETED_P cp_function_decl_deleted_p
> -#undef LANG_HOOKS_FUNCTION_DECL_DEFAULTED
> -#define LANG_HOOKS_FUNCTION_DECL_DEFAULTED cp_function_decl_defaulted
> +#undef LANG_HOOKS_DECL_DWARF_ATTRIBUTE
> +#define LANG_HOOKS_DECL_DWARF_ATTRIBUTE cp_decl_dwarf_attribute
>  #undef LANG_HOOKS_OMP_PREDETERMINED_SHARING
>  #define LANG_HOOKS_OMP_PREDETERMINED_SHARING cxx_omp_predetermined_sharing
>  #undef LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR
> --- gcc/cp/cp-objcp-common.c.jj 2016-10-07 21:36:47.000000000 +0200
> +++ gcc/cp/cp-objcp-common.c    2016-10-14 14:27:56.923070637 +0200
> @@ -23,6 +23,7 @@ along with GCC; see the file COPYING3.
>  #include "coretypes.h"
>  #include "cp-tree.h"
>  #include "cp-objcp-common.h"
> +#include "dwarf2.h"
>
>  /* Special routine to get the alias set for C++.  */
>
> @@ -130,45 +131,48 @@ cxx_types_compatible_p (tree x, tree y)
>    return same_type_ignoring_top_level_qualifiers_p (x, y);
>  }
>
> -/* Return true if DECL is explicit member function.  */
> -
> -bool
> -cp_function_decl_explicit_p (const_tree decl)
> +/* Return -1 if dwarf ATTR shouldn't be added for DECL, or the attribute
> +   value otherwise.  */
> +int
> +cp_decl_dwarf_attribute (const_tree decl, int attr)
>  {
> -  return (decl
> -         && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl))
> -         && DECL_NONCONVERTING_P (decl));
> -}
> +  if (decl == NULL_TREE)
> +    return -1;
>
> -/* Return true if DECL is deleted special member function.  */
> -
> -bool
> -cp_function_decl_deleted_p (const_tree decl)
> -{
> -  return (decl
> +  switch (attr)
> +    {
> +    case DW_AT_explicit:
> +      if (TREE_CODE (decl) == FUNCTION_DECL
>           && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl))
> -         && DECL_DELETED_FN (decl));
> -}
> -
> -/* Returns 0 if DECL is NOT a C++11 defaulted special member function,
> -   1 if it is explicitly defaulted within the class body, or 2 if it
> -   is explicitly defaulted outside the class body.  */
> +         && DECL_NONCONVERTING_P (decl))
> +       return 1;
> +      break;
>
> -int
> -cp_function_decl_defaulted (const_tree decl)
> -{
> -  if (decl
> -      && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl))
> -      && DECL_DEFAULTED_FN (decl))
> -    {
> -      if (DECL_DEFAULTED_IN_CLASS_P (decl))
> +    case DW_AT_deleted:
> +      if (TREE_CODE (decl) == FUNCTION_DECL
> +         && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl))
> +         && DECL_DELETED_FN (decl))
>         return 1;
> +      break;
> +
> +    case DW_AT_defaulted:
> +      if (TREE_CODE (decl) == FUNCTION_DECL
> +         && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl))
> +         && DECL_DEFAULTED_FN (decl))
> +       {
> +         if (DECL_DEFAULTED_IN_CLASS_P (decl))
> +           return DW_DEFAULTED_in_class;
> +
> +         if (DECL_DEFAULTED_OUTSIDE_CLASS_P (decl))
> +           return DW_DEFAULTED_out_of_class;
> +       }
> +      break;
>
> -      if (DECL_DEFAULTED_OUTSIDE_CLASS_P (decl))
> -       return 2;
> +    default:
> +      break;
>      }
>
> -  return 0;
> +  return -1;
>  }
>
>  /* Stubs to keep c-opts.c happy.  */
>
>         Jakub

Reply via email to