diff options
Diffstat (limited to 'binutils/dwarf.c')
-rw-r--r-- | binutils/dwarf.c | 36 |
1 files changed, 33 insertions, 3 deletions
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) |