[debug] DWARF: add DW_AT_count to zero-length arrays

2018-09-13  Omar Sandoval  <osandov@osandov.com>
	    Tom de Vries  <tdevries@suse.de>

	PR debug/86985
	* dwarf2out.c (is_c): New function.
	(add_subscript_info): Add DW_AT_count of 0 for C zero-length arrays.

	* gcc.dg/guality/zero-length-array.c: New test.

Co-Authored-By: Tom de Vries <tdevries@suse.de>

From-SVN: r264267
This commit is contained in:
Omar Sandoval 2018-09-13 10:27:12 +00:00 committed by Tom de Vries
parent 231c52ae41
commit 67295b6837
4 changed files with 58 additions and 2 deletions

View file

@ -1,3 +1,10 @@
2018-09-13 Omar Sandoval <osandov@osandov.com>
Tom de Vries <tdevries@suse.de>
PR debug/86985
* dwarf2out.c (is_c): New function.
(add_subscript_info): Add DW_AT_count of 0 for C zero-length arrays.
2018-09-13 Sam Tebbs <sam.tebbs@arm.com>
PR target/85628

View file

@ -3679,6 +3679,7 @@ static const char *get_AT_string (dw_die_ref, enum dwarf_attribute);
static int get_AT_flag (dw_die_ref, enum dwarf_attribute);
static unsigned get_AT_unsigned (dw_die_ref, enum dwarf_attribute);
static inline dw_die_ref get_AT_ref (dw_die_ref, enum dwarf_attribute);
static bool is_c (void);
static bool is_cxx (void);
static bool is_cxx (const_tree);
static bool is_fortran (void);
@ -5443,6 +5444,19 @@ get_AT_file (dw_die_ref die, enum dwarf_attribute attr_kind)
return a ? AT_file (a) : NULL;
}
/* Return TRUE if the language is C. */
static inline bool
is_c (void)
{
unsigned int lang = get_AT_unsigned (comp_unit_die (), DW_AT_language);
return (lang == DW_LANG_C || lang == DW_LANG_C89 || lang == DW_LANG_C99
|| lang == DW_LANG_C11 || lang == DW_LANG_ObjC);
}
/* Return TRUE if the language is C++. */
static inline bool
@ -21000,8 +21014,16 @@ add_subscript_info (dw_die_ref type_die, tree type, bool collapse_p)
if (!get_AT (subrange_die, DW_AT_lower_bound))
add_bound_info (subrange_die, DW_AT_lower_bound, lower, NULL);
if (upper && !get_AT (subrange_die, DW_AT_upper_bound))
add_bound_info (subrange_die, DW_AT_upper_bound, upper, NULL);
if (!get_AT (subrange_die, DW_AT_upper_bound)
&& !get_AT (subrange_die, DW_AT_count))
{
if (upper)
add_bound_info (subrange_die, DW_AT_upper_bound, upper, NULL);
else if ((is_c () || is_cxx ()) && COMPLETE_TYPE_P (type))
/* Zero-length array. */
add_bound_info (subrange_die, DW_AT_count,
build_int_cst (TREE_TYPE (lower), 0), NULL);
}
}
/* Otherwise we have an array type with an unspecified length. The

View file

@ -1,3 +1,9 @@
2018-09-13 Omar Sandoval <osandov@osandov.com>
Tom de Vries <tdevries@suse.de>
PR debug/86985
* gcc.dg/guality/zero-length-array.c: New test.
2018-09-13 Sam Tebbs <sam.tebbs@arm.com>
PR target/85628

View file

@ -0,0 +1,21 @@
/* PR debug/86985 */
/* { dg-do run } */
/* { dg-options "-g" } */
struct {
int foo;
int bar[0];
} zla; /* Zero length array. */
struct {
int foo;
int bar[];
} fam; /* Flexible array member. */
int
main ()
{
/* { dg-final { gdb-test . "type:zla" "struct { int foo; int bar[0]; }" } } */
/* { dg-final { gdb-test . "type:fam" "struct { int foo; int bar[]; }" } } */
return 0;
}