Fix typo in previous delta.
[binutils-gdb.git] / binutils / dwarf.c
index 283aceb4958417970fa985b818552b654b867800..ae50a65fbdf026d764d7ca350a74faddeb4dd633 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,
@@ -1570,12 +1598,15 @@ read_and_display_attr_value (unsigned long attribute,
       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)