Mark Wielaard 3f5742
r12545 | sewardj | 2012-04-29 13:35:37 +0200 (Sun, 29 Apr 2012) | 3 lines
Mark Wielaard 3f5742
Mark Wielaard 3f5742
Correctly parse DW_FORM_ref_addr -- its format is different in Dwarf2
Mark Wielaard 3f5742
vs Dwarf3 and later.  Fixes #298864.  (Tom Tromey, tromey@redhat.com)
Mark Wielaard 3f5742
Mark Wielaard 3f5742
Index: coregrind/m_debuginfo/readdwarf3.c
Mark Wielaard 3f5742
===================================================================
Mark Wielaard 3f5742
--- valgrind-3.7.0/coregrind/m_debuginfo/readdwarf3.c	(revision 12544)
Mark Wielaard 3f5742
+++ valgrind-3.7.0/coregrind/m_debuginfo/readdwarf3.c	(revision 12545)
Mark Wielaard 3f5742
@@ -1152,9 +1152,17 @@
Mark Wielaard 3f5742
             So for the moment we merely range-check, to see that they
Mark Wielaard 3f5742
             actually do specify a plausible offset within this
Mark Wielaard 3f5742
             object's .debug_info, and return the value unchanged.
Mark Wielaard 3f5742
+
Mark Wielaard 3f5742
+            In DWARF 2, DW_FORM_ref_addr is address-sized, but in
Mark Wielaard 3f5742
+            DWARF 3 and later, it is offset-sized.
Mark Wielaard 3f5742
          */
Mark Wielaard 3f5742
-         *cts = (ULong)(UWord)get_UWord(c);
Mark Wielaard 3f5742
-         *ctsSzB = sizeof(UWord);
Mark Wielaard 3f5742
+         if (cc->version == 2) {
Mark Wielaard 3f5742
+            *cts = (ULong)(UWord)get_UWord(c);
Mark Wielaard 3f5742
+            *ctsSzB = sizeof(UWord);
Mark Wielaard 3f5742
+         } else {
Mark Wielaard 3f5742
+            *cts = get_Dwarfish_UWord(c, cc->is_dw64);
Mark Wielaard 3f5742
+            *ctsSzB = cc->is_dw64 ? sizeof(ULong) : sizeof(UInt);
Mark Wielaard 3f5742
+         }
Mark Wielaard 3f5742
          TRACE_D3("0x%lx", (UWord)*cts);
Mark Wielaard 3f5742
          if (0) VG_(printf)("DW_FORM_ref_addr 0x%lx\n", (UWord)*cts);
Mark Wielaard 3f5742
          if (/* the following 2 are surely impossible, but ... */