langhooks.h (struct lang_hooks_for_decls): Remove function_decl_explicit_p...
authorJakub Jelinek <jakub@redhat.com>
Mon, 17 Oct 2016 06:53:00 +0000 (08:53 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 17 Oct 2016 06:53:00 +0000 (08:53 +0200)
* 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
gcc/cp/ChangeLog
gcc/cp/cp-objcp-common.c
gcc/cp/cp-objcp-common.h
gcc/dwarf2out.c
gcc/langhooks-def.h
gcc/langhooks.c
gcc/langhooks.h

index 7874e063d2f6535674da46de7e4795e9694b4ee6..efc94a4d1f24c4d8d638a1e234b9bae29a2aa8a6 100644 (file)
@@ -1,3 +1,22 @@
+2016-10-17  Jakub Jelinek  <jakub@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_*.
+
 2016-10-16  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR ada/37139
index 54ffee800429e49735027ba3b57c7c9f150675cb..d2e6fa818ce6d20367b5f1e5dcc3b99563f4d983 100644 (file)
@@ -1,3 +1,16 @@
+2016-10-17  Jakub Jelinek  <jakub@redhat.com>
+
+       * 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  <jason@redhat.com>
 
        PR c++/77945
index ac1bb63f8174da837266ca1d3e735022331fe350..abcc1ca3d5dca396a793b873336d8ad2618dea85 100644 (file)
@@ -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.  */
index 3ad3eb64c0b4ff9b9893e21edb1d19c46a9c515c..9dd847e4220ff40835f19310913585dc2a7623b4 100644 (file)
@@ -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
index 541faf75f1f508a0a29e55607a069114bedd3ccc..ae4cad1d1632dd2c35ae05d21c567e094a67a70f 100644 (file)
@@ -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.  */
index 7395440986a486bfe18192f1ca57dec6578c6d3b..e49382bfb56b705c198fafba3e634c98f2be2d06 100644 (file)
@@ -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, \
index 792eb4828e8816091b4cd4069dc3cbe6e3fe0018..370990ef43b712136bc960a07ed6aed5421c0bd3 100644 (file)
@@ -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
index c89cd091d67e66648bdb16daf75add05410c8056..8116b170f7b116b625e905ce4a217ec6affbb2dd 100644 (file)
@@ -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.  */