diff options
author | Tom Tromey <tom@tromey.com> | 2020-09-29 18:49:08 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2020-09-29 20:29:06 -0600 |
commit | 414ad644a86fab3e5c22f622c5f586ce7a8bcf03 (patch) | |
tree | 8100a3e2831f5b382d1e173178d5802bca2f5bfc /gdb/dwarf2 | |
parent | 1bc397c561f55c1cf67a5e02f5c9305a54155a2e (diff) | |
download | gdb-414ad644a86fab3e5c22f622c5f586ce7a8bcf03.zip gdb-414ad644a86fab3e5c22f622c5f586ce7a8bcf03.tar.gz gdb-414ad644a86fab3e5c22f622c5f586ce7a8bcf03.tar.bz2 |
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 <tom@tromey.com>
* dwarf2/read.c (read_attribute_value): Update.
* dwarf2/attribute.h (struct attribute) <form_is_unsigned,
set_unsigned>: New methods.
* dwarf2/attribute.c (attribute::form_is_unsigned): New method.
Diffstat (limited to 'gdb/dwarf2')
-rw-r--r-- | gdb/dwarf2/attribute.c | 23 | ||||
-rw-r--r-- | gdb/dwarf2/attribute.h | 10 | ||||
-rw-r--r-- | gdb/dwarf2/read.c | 52 |
3 files changed, 59 insertions, 26 deletions
diff --git a/gdb/dwarf2/attribute.c b/gdb/dwarf2/attribute.c index c8e556f..69c59cc 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 9178276..3067e2a 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 190d38e..c572ed4 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; |