diff options
author | Omar Sandoval <osandov@osandov.com> | 2018-09-13 10:27:12 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2018-09-13 10:27:12 +0000 |
commit | 67295b68372f0dd13d44556e2f48a370c5d75119 (patch) | |
tree | e3c1d2f4989f85b7e96c34cf47cd13023c9f6fa6 /gcc/dwarf2out.c | |
parent | 231c52ae41a335649013f9fbfabca337d1ea98fa (diff) | |
download | gcc-67295b68372f0dd13d44556e2f48a370c5d75119.zip gcc-67295b68372f0dd13d44556e2f48a370c5d75119.tar.gz gcc-67295b68372f0dd13d44556e2f48a370c5d75119.tar.bz2 |
[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
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r-- | gcc/dwarf2out.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 9e9da30..48c5037 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 |