+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
+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
#include "coretypes.h"
#include "cp-tree.h"
#include "cp-objcp-common.h"
+#include "dwarf2.h"
/* Special routine to get the alias set for C++. */
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. */
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
#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
/* 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. */
/* 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. */
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)
#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
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, \
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
/* 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. */