#endif
/* A C expression for the integer offset value of an argument (N_PSYM)
- having address X (an RTX). The nominal offset is OFFSET. */
+ having address X (an RTX). The nominal offset is OFFSET.
+ Note that we use OFFSET + 0 here to avoid the self-assign warning
+ when the macro is called in a context like
+ number = DEBUGGER_ARG_OFFSET(number, X) */
#ifndef DEBUGGER_ARG_OFFSET
-#define DEBUGGER_ARG_OFFSET(OFFSET, X) (OFFSET)
+#define DEBUGGER_ARG_OFFSET(OFFSET, X) (OFFSET + 0)
#endif
/* This obstack holds the stab string currently being constructed. We
static void
dbxout_typedefs (tree syms)
{
- for (; syms != NULL_TREE; syms = TREE_CHAIN (syms))
+ for (; syms != NULL_TREE; syms = DECL_CHAIN (syms))
{
if (TREE_CODE (syms) == TYPE_DECL)
{
/* Output the name, type, position (in bits), size (in bits) of each
field that we can support. */
- for (tem = TYPE_FIELDS (type); tem; tem = TREE_CHAIN (tem))
+ for (tem = TYPE_FIELDS (type); tem; tem = DECL_CHAIN (tem))
{
/* If one of the nodes is an error_mark or its type is then
return early. */
These differ in the types of the arguments. */
for (last = NULL_TREE;
fndecl && (last == NULL_TREE || DECL_NAME (fndecl) == DECL_NAME (last));
- fndecl = TREE_CHAIN (fndecl))
+ fndecl = DECL_CHAIN (fndecl))
/* Output the name of the field (after overloading), as
well as the name of the field before overloading, along
with its parameter list */
dbxout_type (tree type, int full)
{
static int anonymous_type_number = 0;
- bool vector_type = false;
tree tem, main_variant, low, high;
- if (TREE_CODE (type) == VECTOR_TYPE)
- {
- /* The frontend feeds us a representation for the vector as a struct
- containing an array. Pull out the array type. */
- type = TREE_TYPE (TYPE_FIELDS (TYPE_DEBUG_REPRESENTATION_TYPE (type)));
- vector_type = true;
- }
-
if (TREE_CODE (type) == INTEGER_TYPE)
{
if (TREE_TYPE (type) == 0)
switch (TREE_CODE (type))
{
case VOID_TYPE:
+ case NULLPTR_TYPE:
case LANG_TYPE:
/* For a void type, just define it as itself; i.e., "5=5".
This makes us consider it defined
break;
}
- if (use_gnu_debug_info_extensions && vector_type)
- stabstr_S ("@V;");
-
/* Output "a" followed by a range type definition
for the index type of the array
followed by a reference to the target-type.
dbxout_type (TREE_TYPE (type), 0);
break;
+ case VECTOR_TYPE:
+ /* Make vectors look like an array. */
+ if (use_gnu_debug_info_extensions)
+ stabstr_S ("@V;");
+
+ /* Output "a" followed by a range type definition
+ for the index type of the array
+ followed by a reference to the target-type.
+ ar1;0;N;M for a C array of type M and size N+1. */
+ stabstr_C ('a');
+ dbxout_range_type (integer_type_node, size_zero_node,
+ size_int (TYPE_VECTOR_SUBPARTS (type) - 1));
+
+ dbxout_type (TREE_TYPE (type), 0);
+ break;
+
case RECORD_TYPE:
case UNION_TYPE:
case QUAL_UNION_TYPE:
htab_traverse (cfun->used_types_hash, output_used_types_helper, &types);
/* Sort by UID to prevent dependence on hash table ordering. */
- qsort (VEC_address (tree, types), VEC_length (tree, types),
- sizeof (tree), output_types_sort);
+ VEC_qsort (tree, types, output_types_sort);
- for (i = 0; VEC_iterate (tree, types, i, type); i++)
+ FOR_EACH_VEC_ELT (tree, types, i, type)
debug_queue_symbol (type);
VEC_free (tree, heap, types);
&& DECL_INITIAL (decl) != 0
&& host_integerp (DECL_INITIAL (decl), 0)
&& ! TREE_ASM_WRITTEN (decl)
- && (DECL_CONTEXT (decl) == NULL_TREE
+ && (DECL_FILE_SCOPE_P (decl)
|| TREE_CODE (DECL_CONTEXT (decl)) == BLOCK
|| TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL)
&& TREE_PUBLIC (decl) == 0)
|| (REG_P (XEXP (home, 0))
&& REGNO (XEXP (home, 0)) != HARD_FRAME_POINTER_REGNUM
&& REGNO (XEXP (home, 0)) != STACK_POINTER_REGNUM
-#if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
+#if !HARD_FRAME_POINTER_IS_ARG_POINTER
&& REGNO (XEXP (home, 0)) != ARG_POINTER_REGNUM
#endif
)))
comm_prev = comm_new;
result += dbxout_symbol (syms, 1);
- syms = TREE_CHAIN (syms);
+ syms = DECL_CHAIN (syms);
}
if (comm_prev != NULL)
++debug_nesting;
emit_pending_bincls_if_required ();
- for (; parms; parms = TREE_CHAIN (parms))
+ for (; parms; parms = DECL_CHAIN (parms))
if (DECL_NAME (parms)
&& TREE_TYPE (parms) != error_mark_node
&& DECL_RTL_SET_P (parms)
&& REG_P (XEXP (DECL_RTL (parms), 0))
&& REGNO (XEXP (DECL_RTL (parms), 0)) != HARD_FRAME_POINTER_REGNUM
&& REGNO (XEXP (DECL_RTL (parms), 0)) != STACK_POINTER_REGNUM
-#if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
+#if !HARD_FRAME_POINTER_IS_ARG_POINTER
&& REGNO (XEXP (DECL_RTL (parms), 0)) != ARG_POINTER_REGNUM
#endif
)
{
++debug_nesting;
- for (; parms; parms = TREE_CHAIN (parms))
+ for (; parms; parms = DECL_CHAIN (parms))
if (DECL_NAME (parms) && PARM_PASSED_IN_MEMORY (parms))
{
/* Report parms that live in registers during the function