From 414ad644a86fab3e5c22f622c5f586ce7a8bcf03 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 29 Sep 2020 18:49:08 -0600 Subject: [PATCH] Use setter for attribute's unsigned value This adds form_is_unsigned and an unsigned setter method to struct attribute, and updates the remaining code. Now DW_UNSND is no longer used as an lvalue. gdb/ChangeLog 2020-09-29 Tom Tromey * dwarf2/read.c (read_attribute_value): Update. * dwarf2/attribute.h (struct attribute) : New methods. * dwarf2/attribute.c (attribute::form_is_unsigned): New method. --- gdb/ChangeLog | 7 ++++++ gdb/dwarf2/attribute.c | 23 +++++++++++++++++++ gdb/dwarf2/attribute.h | 10 ++++++++ gdb/dwarf2/read.c | 52 +++++++++++++++++++++--------------------- 4 files changed, 66 insertions(+), 26 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9aa1266053d..ea0a4ae29a6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2020-09-29 Tom Tromey + + * dwarf2/read.c (read_attribute_value): Update. + * dwarf2/attribute.h (struct attribute) : New methods. + * dwarf2/attribute.c (attribute::form_is_unsigned): New method. + 2020-09-29 Tom Tromey * dwarf2/read.c (get_alignment, read_array_order) diff --git a/gdb/dwarf2/attribute.c b/gdb/dwarf2/attribute.c index c8e556f0e41..69c59cc8bd8 100644 --- a/gdb/dwarf2/attribute.c +++ b/gdb/dwarf2/attribute.c @@ -159,3 +159,26 @@ attribute::constant_value (int default_value) const return default_value; } } + +/* See attribute.h. */ + +bool +attribute::form_is_unsigned () const +{ + return (form == DW_FORM_ref_addr + || form == DW_FORM_GNU_ref_alt + || form == DW_FORM_data2 + || form == DW_FORM_data4 + || form == DW_FORM_data8 + || form == DW_FORM_sec_offset + || form == DW_FORM_data1 + || form == DW_FORM_flag + || form == DW_FORM_flag_present + || form == DW_FORM_udata + || form == DW_FORM_rnglistx + || form == DW_FORM_ref1 + || form == DW_FORM_ref2 + || form == DW_FORM_ref4 + || form == DW_FORM_ref8 + || form == DW_FORM_ref_udata); +} diff --git a/gdb/dwarf2/attribute.h b/gdb/dwarf2/attribute.h index 91782769689..3067e2affa2 100644 --- a/gdb/dwarf2/attribute.h +++ b/gdb/dwarf2/attribute.h @@ -124,6 +124,9 @@ struct attribute /* Check if the attribute's form is a string form. */ bool form_is_string () const; + /* Check if the attribute's form is an unsigned integer form. */ + bool form_is_unsigned () const; + /* Return DIE offset of this attribute. Return 0 with complaint if the attribute is not of the required kind. */ @@ -190,6 +193,13 @@ struct attribute u.snd = snd; } + /* Set this attribute to an unsigned integer. */ + void set_unsigned (ULONGEST unsnd) + { + gdb_assert (form_is_unsigned ()); + u.unsnd = unsnd; + } + ENUM_BITFIELD(dwarf_attribute) name : 16; ENUM_BITFIELD(dwarf_form) form : 15; diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 190d38e4f99..c572ed43c0b 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -19692,15 +19692,16 @@ read_attribute_value (const struct die_reader_specs *reader, { case DW_FORM_ref_addr: if (cu->header.version == 2) - DW_UNSND (attr) = cu->header.read_address (abfd, info_ptr, - &bytes_read); + attr->set_unsigned (cu->header.read_address (abfd, info_ptr, + &bytes_read)); else - DW_UNSND (attr) = cu->header.read_offset (abfd, info_ptr, - &bytes_read); + attr->set_unsigned (cu->header.read_offset (abfd, info_ptr, + &bytes_read)); info_ptr += bytes_read; break; case DW_FORM_GNU_ref_alt: - DW_UNSND (attr) = cu->header.read_offset (abfd, info_ptr, &bytes_read); + attr->set_unsigned (cu->header.read_offset (abfd, info_ptr, + &bytes_read)); info_ptr += bytes_read; break; case DW_FORM_addr: @@ -19728,15 +19729,15 @@ read_attribute_value (const struct die_reader_specs *reader, attr->set_block (blk); break; case DW_FORM_data2: - DW_UNSND (attr) = read_2_bytes (abfd, info_ptr); + attr->set_unsigned (read_2_bytes (abfd, info_ptr)); info_ptr += 2; break; case DW_FORM_data4: - DW_UNSND (attr) = read_4_bytes (abfd, info_ptr); + attr->set_unsigned (read_4_bytes (abfd, info_ptr)); info_ptr += 4; break; case DW_FORM_data8: - DW_UNSND (attr) = read_8_bytes (abfd, info_ptr); + attr->set_unsigned (read_8_bytes (abfd, info_ptr)); info_ptr += 8; break; case DW_FORM_data16: @@ -19747,7 +19748,8 @@ read_attribute_value (const struct die_reader_specs *reader, attr->set_block (blk); break; case DW_FORM_sec_offset: - DW_UNSND (attr) = cu->header.read_offset (abfd, info_ptr, &bytes_read); + attr->set_unsigned (cu->header.read_offset (abfd, info_ptr, + &bytes_read)); info_ptr += bytes_read; break; case DW_FORM_loclistx: @@ -19812,15 +19814,12 @@ read_attribute_value (const struct die_reader_specs *reader, attr->set_block (blk); break; case DW_FORM_data1: - DW_UNSND (attr) = read_1_byte (abfd, info_ptr); - info_ptr += 1; - break; case DW_FORM_flag: - DW_UNSND (attr) = read_1_byte (abfd, info_ptr); + attr->set_unsigned (read_1_byte (abfd, info_ptr)); info_ptr += 1; break; case DW_FORM_flag_present: - DW_UNSND (attr) = 1; + attr->set_unsigned (1); break; case DW_FORM_sdata: attr->set_signed (read_signed_leb128 (abfd, info_ptr, &bytes_read)); @@ -19830,27 +19829,27 @@ read_attribute_value (const struct die_reader_specs *reader, *need_reprocess = true; /* FALLTHROUGH */ case DW_FORM_udata: - DW_UNSND (attr) = read_unsigned_leb128 (abfd, info_ptr, &bytes_read); + attr->set_unsigned (read_unsigned_leb128 (abfd, info_ptr, &bytes_read)); info_ptr += bytes_read; break; case DW_FORM_ref1: - DW_UNSND (attr) = (to_underlying (cu->header.sect_off) - + read_1_byte (abfd, info_ptr)); + attr->set_unsigned ((to_underlying (cu->header.sect_off) + + read_1_byte (abfd, info_ptr))); info_ptr += 1; break; case DW_FORM_ref2: - DW_UNSND (attr) = (to_underlying (cu->header.sect_off) - + read_2_bytes (abfd, info_ptr)); + attr->set_unsigned ((to_underlying (cu->header.sect_off) + + read_2_bytes (abfd, info_ptr))); info_ptr += 2; break; case DW_FORM_ref4: - DW_UNSND (attr) = (to_underlying (cu->header.sect_off) - + read_4_bytes (abfd, info_ptr)); + attr->set_unsigned ((to_underlying (cu->header.sect_off) + + read_4_bytes (abfd, info_ptr))); info_ptr += 4; break; case DW_FORM_ref8: - DW_UNSND (attr) = (to_underlying (cu->header.sect_off) - + read_8_bytes (abfd, info_ptr)); + attr->set_unsigned ((to_underlying (cu->header.sect_off) + + read_8_bytes (abfd, info_ptr))); info_ptr += 8; break; case DW_FORM_ref_sig8: @@ -19858,8 +19857,9 @@ read_attribute_value (const struct die_reader_specs *reader, info_ptr += 8; break; case DW_FORM_ref_udata: - DW_UNSND (attr) = (to_underlying (cu->header.sect_off) - + read_unsigned_leb128 (abfd, info_ptr, &bytes_read)); + attr->set_unsigned ((to_underlying (cu->header.sect_off) + + read_unsigned_leb128 (abfd, info_ptr, + &bytes_read))); info_ptr += bytes_read; break; case DW_FORM_indirect: @@ -19942,7 +19942,7 @@ read_attribute_value (const struct die_reader_specs *reader, complaint (_("Suspicious DW_AT_byte_size value treated as zero instead of %s"), hex_string (DW_UNSND (attr))); - DW_UNSND (attr) = 0; + attr->set_unsigned (0); } return info_ptr; -- 2.30.2