* dwarf.c (add64): New function.
authorNick Clifton <nickc@redhat.com>
Wed, 9 Oct 2013 14:06:00 +0000 (14:06 +0000)
committerNick Clifton <nickc@redhat.com>
Wed, 9 Oct 2013 14:06:00 +0000 (14:06 +0000)
(read_and_display_attr_value): Add CU offset in to the value
displayed for a DW_AT_ref8 attribute.

binutils/ChangeLog
binutils/dwarf.c

index a6815f3..2bebf99 100644 (file)
@@ -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
index 283aceb..d5f7baf 100644 (file)
@@ -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)