From: Tom Tromey Date: Wed, 30 Sep 2020 00:49:08 +0000 (-0600) Subject: Change die_info methods to check the attribute's form X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=52c14d112840423f0515f7334063f532ec3950b1;p=binutils-gdb.git Change die_info methods to check the attribute's form This changes two die_info methods to check the form of the attribute before using it. gdb/ChangeLog 2020-09-29 Tom Tromey * dwarf2/die.h (struct die_info) : Check the attribute's form. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dbbd0caa146..02f686ea43e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-09-29 Tom Tromey + + * dwarf2/die.h (struct die_info) : Check + the attribute's form. + 2020-09-29 Tom Tromey * dwarf2/read.c (is_valid_DW_AT_defaulted): Move to attribute.c. diff --git a/gdb/dwarf2/die.h b/gdb/dwarf2/die.h index 5522ebdf311..4bc15d631e3 100644 --- a/gdb/dwarf2/die.h +++ b/gdb/dwarf2/die.h @@ -20,6 +20,8 @@ #ifndef GDB_DWARF2_DIE_H #define GDB_DWARF2_DIE_H +#include "complaints.h" + /* This data structure holds a complete die structure. */ struct die_info { @@ -40,10 +42,15 @@ struct die_info { for (unsigned i = 0; i < num_attrs; ++i) if (attrs[i].name == DW_AT_addr_base - || attrs[i].name == DW_AT_GNU_addr_base) + || attrs[i].name == DW_AT_GNU_addr_base) { - /* If both exist, just use the first one. */ - return DW_UNSND (&attrs[i]); + if (attrs[i].form_is_unsigned ()) + { + /* If both exist, just use the first one. */ + return attrs[i].as_unsigned (); + } + complaint (_("address base attribute (offset %s) as wrong form"), + sect_offset_str (sect_off)); } return gdb::optional (); } @@ -57,8 +64,13 @@ struct die_info if (attrs[i].name == DW_AT_rnglists_base || attrs[i].name == DW_AT_GNU_ranges_base) { - /* If both exist, just use the first one. */ - return DW_UNSND (&attrs[i]); + if (attrs[i].form_is_unsigned ()) + { + /* If both exist, just use the first one. */ + return attrs[i].as_unsigned (); + } + complaint (_("ranges base attribute (offset %s) as wrong form"), + sect_offset_str (sect_off)); } return 0; }