From a69c4772a455c2a2a6ae47408f586e679df218cf Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Wed, 9 Oct 2013 14:06:00 +0000 Subject: [PATCH] * dwarf.c (add64): New function. (read_and_display_attr_value): Add CU offset in to the value displayed for a DW_AT_ref8 attribute. --- binutils/ChangeLog | 6 ++++++ binutils/dwarf.c | 36 +++++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index a6815f30766..2bebf999999 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,9 @@ +2013-10-09 Nick Clifton + + * 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 * arsup.c (ar_save): Respect the deterministic setting when diff --git a/binutils/dwarf.c b/binutils/dwarf.c index 283aceb4958..d5f7baf33a1 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) -- 2.30.2