From 81b42cc69beca2d92cf2675b8b3c1c714f8f74fd Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 17 Oct 2016 08:53:00 +0200 Subject: [PATCH] langhooks.h (struct lang_hooks_for_decls): Remove function_decl_explicit_p... * 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. From-SVN: r241227 --- gcc/ChangeLog | 19 ++++++++++++ gcc/cp/ChangeLog | 13 ++++++++ gcc/cp/cp-objcp-common.c | 64 ++++++++++++++++++++------------------- gcc/cp/cp-objcp-common.h | 12 ++------ gcc/dwarf2out.c | 65 ++++++++++++++++------------------------ gcc/langhooks-def.h | 9 ++---- gcc/langhooks.c | 9 ++++++ gcc/langhooks.h | 13 ++------ 8 files changed, 110 insertions(+), 94 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7874e063d2f..efc94a4d1f2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,22 @@ +2016-10-17 Jakub Jelinek + + * 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_*. + 2016-10-16 Eric Botcazou PR ada/37139 diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 54ffee80042..d2e6fa818ce 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,16 @@ +2016-10-17 Jakub Jelinek + + * 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. + 2016-10-15 Jason Merrill PR c++/77945 diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c index ac1bb63f817..abcc1ca3d5d 100644 --- a/gcc/cp/cp-objcp-common.c +++ b/gcc/cp/cp-objcp-common.c @@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see #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. */ + switch (attr) + { + case DW_AT_explicit: + if (TREE_CODE (decl) == FUNCTION_DECL + && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl)) + && DECL_NONCONVERTING_P (decl)) + return 1; + break; -bool -cp_function_decl_deleted_p (const_tree decl) -{ - return (decl + case DW_AT_deleted: + if (TREE_CODE (decl) == FUNCTION_DECL && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl)) - && DECL_DELETED_FN (decl)); -} + && DECL_DELETED_FN (decl)) + return 1; + break; -/* 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. */ + 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; -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)) - return 1; + 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. */ diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h index 3ad3eb64c0b..9dd847e4220 100644 --- a/gcc/cp/cp-objcp-common.h +++ b/gcc/cp/cp-objcp-common.h @@ -26,9 +26,7 @@ along with GCC; see the file COPYING3. If not see 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 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 541faf75f1f..ae4cad1d163 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -20625,20 +20625,19 @@ gen_subprogram_die (tree decl, dw_die_ref context_die) /* 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_ref context_die) /* 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. */ diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h index 7395440986a..e49382bfb56 100644 --- a/gcc/langhooks-def.h +++ b/gcc/langhooks-def.h @@ -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) @@ -214,9 +215,7 @@ extern tree lhd_make_node (enum tree_code); #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 @@ -237,9 +236,7 @@ extern tree lhd_make_node (enum tree_code); 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, \ diff --git a/gcc/langhooks.c b/gcc/langhooks.c index 792eb4828e8..370990ef43b 100644 --- a/gcc/langhooks.c +++ b/gcc/langhooks.c @@ -693,6 +693,15 @@ lhd_get_substring_location (const substring_loc &, location_t *) 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 diff --git a/gcc/langhooks.h b/gcc/langhooks.h index c89cd091d67..8116b170f7b 100644 --- a/gcc/langhooks.h +++ b/gcc/langhooks.h @@ -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. */ -- 2.30.2