From 67295b68372f0dd13d44556e2f48a370c5d75119 Mon Sep 17 00:00:00 2001 From: Omar Sandoval Date: Thu, 13 Sep 2018 10:27:12 +0000 Subject: [PATCH] [debug] DWARF: add DW_AT_count to zero-length arrays 2018-09-13 Omar Sandoval Tom de Vries 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 From-SVN: r264267 --- gcc/ChangeLog | 7 +++++ gcc/dwarf2out.c | 26 +++++++++++++++++-- gcc/testsuite/ChangeLog | 6 +++++ .../gcc.dg/guality/zero-length-array.c | 21 +++++++++++++++ 4 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/guality/zero-length-array.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 99b894bb367..e62f461df84 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-09-13 Omar Sandoval + Tom de Vries + + 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 PR target/85628 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 9e9da30a1fa..48c50378622 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 08915bbd5a3..be1e8b559ff 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-09-13 Omar Sandoval + Tom de Vries + + PR debug/86985 + * gcc.dg/guality/zero-length-array.c: New test. + 2018-09-13 Sam Tebbs PR target/85628 diff --git a/gcc/testsuite/gcc.dg/guality/zero-length-array.c b/gcc/testsuite/gcc.dg/guality/zero-length-array.c new file mode 100644 index 00000000000..33f34d98ac2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/guality/zero-length-array.c @@ -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; +} -- 2.30.2