From f50592234cdef68ddc9b98b65a88a443e2c4523f Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sun, 5 Oct 2014 15:25:03 +0000 Subject: [PATCH] PR debug/63239 Add DWARF representation for C++11 deleted member function. include/ChangeLog * dwarf2.def (DW_AT_GNU_deleted): New attribute. gcc/ChangeLog * dwarf2out.c (gen_subprogram_die): When a member function is explicitly deleted then add a DW_AT_GNU_deleted attribute. * langhooks.h (struct lang_hooks_for_decls): Add function_decl_deleted_p langhook. * langhooks-def.h (LANG_HOOKS_FUNCTION_DECL_DELETED_P): Define. (LANG_HOOKS_DECLS): Add LANG_HOOKS_FUNCTION_DECL_DELETED_P. gcc/cp/ChangeLog * cp-objcp-common.h (LANG_HOOKS_FUNCTION_DECL_DELETED_P): Define. (cp_function_decl_deleted_p): New prototype. * cp-objcp-common.c (cp_function_deleted_p): New function. gcc/testsuite/ChangeLog * g++.dg/debug/dwarf2/deleted-member-function.C: New testcase. From-SVN: r215901 --- gcc/ChangeLog | 10 ++++++++++ gcc/cp/ChangeLog | 7 +++++++ gcc/cp/cp-objcp-common.c | 10 ++++++++++ gcc/cp/cp-objcp-common.h | 3 +++ gcc/dwarf2out.c | 6 ++++++ gcc/langhooks-def.h | 2 ++ gcc/langhooks.h | 3 +++ gcc/testsuite/ChangeLog | 5 +++++ .../debug/dwarf2/deleted-member-function.C | 17 +++++++++++++++++ include/ChangeLog | 5 +++++ include/dwarf2.def | 2 ++ 11 files changed, 70 insertions(+) create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/deleted-member-function.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3bf6de1581c..25f4495fb3d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2014-10-02 Mark Wielaard + + PR debug/63239 + * dwarf2out.c (gen_subprogram_die): When a member function is + explicitly deleted then add a DW_AT_GNU_deleted attribute. + * langhooks.h (struct lang_hooks_for_decls): Add + function_decl_deleted_p langhook. + * langhooks-def.h (LANG_HOOKS_FUNCTION_DECL_DELETED_P): Define. + (LANG_HOOKS_DECLS): Add LANG_HOOKS_FUNCTION_DECL_DELETED_P. + 2014-10-04 Jan Hubicka * ipa-polymorphic-call.c (walk_ssa_copies): Recognize diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c0b6fb5d1f9..5cb8203a636 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2014-10-02 Mark Wielaard + + PR debug/63239 + * cp-objcp-common.h (LANG_HOOKS_FUNCTION_DECL_DELETED_P): Define. + (cp_function_decl_deleted_p): New prototype. + * cp-objcp-common.c (cp_function_deleted_p): New function. + 2014-10-03 Marc Glisse PR c++/54427 diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c index 0c50f4085ab..0d144ef0ba7 100644 --- a/gcc/cp/cp-objcp-common.c +++ b/gcc/cp/cp-objcp-common.c @@ -168,6 +168,16 @@ cp_function_decl_explicit_p (tree decl) && DECL_NONCONVERTING_P (decl)); } +/* Return true if DECL is deleted special member function. */ + +bool +cp_function_decl_deleted_p (tree decl) +{ + return (decl + && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl)) + && DECL_DELETED_FN (decl)); +} + /* Stubs to keep c-opts.c happy. */ void push_file_scope (void) diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h index 246800eef90..c289774b0c6 100644 --- a/gcc/cp/cp-objcp-common.h +++ b/gcc/cp/cp-objcp-common.h @@ -27,6 +27,7 @@ extern tree objcp_tsubst_copy_and_build (tree, tree, tsubst_flags_t, tree, bool); extern bool cp_function_decl_explicit_p (tree decl); +extern bool cp_function_decl_deleted_p (tree decl); extern void cp_common_init_ts (void); /* Lang hooks that are shared between C++ and ObjC++ are defined here. Hooks @@ -131,6 +132,8 @@ extern void cp_common_init_ts (void); #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_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 a64038c41a3..59c05edd893 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -18306,6 +18306,12 @@ gen_subprogram_die (tree decl, dw_die_ref context_die) && (dwarf_version >= 3 || !dwarf_strict)) add_AT_flag (subr_die, DW_AT_explicit, 1); + /* If this is a C++11 deleted special function member then generate + a DW_AT_GNU_deleted attribute. */ + if (lang_hooks.decls.function_decl_deleted_p (decl) + && (! dwarf_strict)) + add_AT_flag (subr_die, DW_AT_GNU_deleted, 1); + /* The first time we see a member function, it is in the context of the class to which it belongs. We make sure of this by emitting the class first. The next time is the definition, which is diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h index e77d2d9100e..e5ae3e3d6e8 100644 --- a/gcc/langhooks-def.h +++ b/gcc/langhooks-def.h @@ -203,6 +203,7 @@ extern tree lhd_make_node (enum tree_code); #define LANG_HOOKS_PUSHDECL pushdecl #define LANG_HOOKS_GETDECLS getdecls #define LANG_HOOKS_FUNCTION_DECL_EXPLICIT_P hook_bool_tree_false +#define LANG_HOOKS_FUNCTION_DECL_DELETED_P hook_bool_tree_false #define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL lhd_warn_unused_global_decl #define LANG_HOOKS_WRITE_GLOBALS write_global_declarations #define LANG_HOOKS_DECL_OK_FOR_SIBCALL lhd_decl_ok_for_sibcall @@ -224,6 +225,7 @@ extern tree lhd_make_node (enum tree_code); LANG_HOOKS_PUSHDECL, \ LANG_HOOKS_GETDECLS, \ LANG_HOOKS_FUNCTION_DECL_EXPLICIT_P, \ + LANG_HOOKS_FUNCTION_DECL_DELETED_P, \ 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.h b/gcc/langhooks.h index 72fa85ec0bb..32e76f99e52 100644 --- a/gcc/langhooks.h +++ b/gcc/langhooks.h @@ -166,6 +166,9 @@ struct lang_hooks_for_decls /* Returns true if DECL is explicit member function. */ bool (*function_decl_explicit_p) (tree); + /* Returns true if DECL is C++11 deleted special member function. */ + bool (*function_decl_deleted_p) (tree); + /* Returns True if the parameter is a generic parameter decl of a generic type, e.g a template template parameter for the C++ FE. */ bool (*generic_generic_parameter_decl_p) (const_tree); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ce04eacf5c0..b3921d61f30 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-10-02 Mark Wielaard + + PR debug/63239 + * g++.dg/debug/dwarf2/deleted-member-function.C: New testcase. + 2014-10-04 Jan Hubicka * g++.dg/ipa/devirt-47.C: New testcase. diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/deleted-member-function.C b/gcc/testsuite/g++.dg/debug/dwarf2/deleted-member-function.C new file mode 100644 index 00000000000..4cc77e6b9a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/deleted-member-function.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-O -std=c++11 -g -dA" } +// { dg-final { scan-assembler-times "# DW_AT_GNU_deleted" 2 } } + +struct Foo +{ + Foo () {} + // Make non-copyable + Foo (const Foo&) = delete; + Foo & operator=(const Foo&) = delete; +}; + +void +bar () +{ + Foo foo; +} diff --git a/include/ChangeLog b/include/ChangeLog index e282aed0494..fd6274fde1c 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,8 @@ +2013-10-02 Mark Wielaard + + PR debug/63239 + * dwarf2.def (DW_AT_GNU_deleted): New attribute. + 2014-09-26 Max Ostapenko * libiberty.h (PEX_STDOUT_APPEND): New flag. diff --git a/include/dwarf2.def b/include/dwarf2.def index 71a37b30c9f..42a8d4bceeb 100644 --- a/include/dwarf2.def +++ b/include/dwarf2.def @@ -383,6 +383,8 @@ DW_AT (DW_AT_GNU_all_call_sites, 0x2117) DW_AT (DW_AT_GNU_all_source_call_sites, 0x2118) /* Section offset into .debug_macro section. */ DW_AT (DW_AT_GNU_macros, 0x2119) +/* Attribute for C++ deleted special member functions (= delete;). */ +DW_AT (DW_AT_GNU_deleted, 0x211a) /* Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFission. */ DW_AT (DW_AT_GNU_dwo_name, 0x2130) DW_AT (DW_AT_GNU_dwo_id, 0x2131) -- 2.30.2