diff options
author | Nick Clifton <nickc@redhat.com> | 2013-10-09 14:06:00 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2013-10-09 14:06:00 +0000 |
commit | a69c4772a455c2a2a6ae47408f586e679df218cf (patch) | |
tree | e42179df38cd08366593fcb3b6086b840ead3368 /binutils | |
parent | 40135bb14bb9d40c0ae29cc17c8632b81ee145ed (diff) | |
download | gdb-a69c4772a455c2a2a6ae47408f586e679df218cf.zip gdb-a69c4772a455c2a2a6ae47408f586e679df218cf.tar.gz gdb-a69c4772a455c2a2a6ae47408f586e679df218cf.tar.bz2 |
* dwarf.c (add64): New function.
(read_and_display_attr_value): Add CU offset in to the value
displayed for a DW_AT_ref8 attribute.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 6 | ||||
-rw-r--r-- | binutils/dwarf.c | 36 |
2 files changed, 39 insertions, 3 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index a6815f3..2bebf99 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,9 @@ +2013-10-09 Nick Clifton <nickc@redhat.com> + + * dwarf.c (add64): New function. + (read_and_display_attr_value): Add CU offset in to the value + displayed for a DW_AT_ref8 attribute. + 2013-10-01 Cory Fields <cory@coryfields.com> * arsup.c (ar_save): Respect the deterministic setting when diff --git a/binutils/dwarf.c b/binutils/dwarf.c index 283aceb..d5f7baf 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -1425,6 +1425,34 @@ find_cu_tu_set_v2 (dwarf_vma cu_offset, int do_types) return NULL; } +/* Add INC to HIGH_BITS:LOW_BITS. */ +static void +add64 (dwarf_vma * high_bits, dwarf_vma * low_bits, dwarf_vma inc) +{ + dwarf_vma tmp = * low_bits; + + tmp += inc; + + /* FIXME: There is probably a better way of handling this: + + We need to cope with dwarf_vma being a 32-bit or 64-bit + type. Plus regardless of its size LOW_BITS is meant to + only hold 32-bits, so if there is overflow or wrap around + we must propagate into HIGH_BITS. */ + if (tmp < * low_bits) + { + ++ * high_bits; + } + else if (sizeof (tmp) > 8 + && (tmp >> 31) > 1) + { + ++ * high_bits; + tmp &= 0xFFFFFFFF; + } + + * low_bits = tmp; +} + static unsigned char * read_and_display_attr_value (unsigned long attribute, unsigned long form, @@ -1567,15 +1595,17 @@ read_and_display_attr_value (unsigned long attribute, case DW_FORM_ref8: case DW_FORM_data8: - if (!do_loc) { dwarf_vma high_bits; + dwarf_vma utmp; char buf[64]; SAFE_BYTE_GET64 (data, &high_bits, &uvalue, end); - + utmp = uvalue; + if (form == DW_FORM_ref8) + add64 (& high_bits, & utmp, cu_offset); printf (" 0x%s", - dwarf_vmatoa64 (high_bits, uvalue, buf, sizeof (buf))); + dwarf_vmatoa64 (high_bits, utmp, buf, sizeof (buf))); } if ((do_loc || do_debug_loc || do_debug_ranges) |