Fix stack offset in Mach-O output for -P compact_unwind.
authorTristan Gingold <tristan.gingold@adacore.com>
Fri, 21 Mar 2014 08:25:05 +0000 (09:25 +0100)
committerTristan Gingold <tristan.gingold@adacore.com>
Mon, 24 Mar 2014 09:18:52 +0000 (10:18 +0100)
Minor fix in compact unwind output: to be more readable, the stack offset
for indirect compact unwind entries are mutiplied by its factor (4 or 8).

binutils/
* od-macho.c (dump_unwind_encoding_x86): Set the factor.
(dump_exe_compact_unwind): Change the condition.  Improve
indentation.

binutils/ChangeLog
binutils/od-macho.c

index 0f2707b..98ecae0 100644 (file)
@@ -1,3 +1,9 @@
+2014-03-24  Tristan Gingold  <gingold@adacore.com>
+
+       * od-macho.c (dump_unwind_encoding_x86): Set the factor.
+       (dump_exe_compact_unwind): Change the condition.  Improve
+       indentation.
+
 2014-03-20  Nick Clifton  <nickc@redhat.com>
 
        * readelf.c (process_version_sections): Fix off-by-one error in
index 7754f36..3cd2cf0 100644 (file)
@@ -1157,7 +1157,7 @@ dump_unwind_encoding_x86 (unsigned int encoding, unsigned int sz,
 
            stack_adj =
              (encoding & MACH_O_UNWIND_X86_64_FRAMELESS_STACK_ADJUST) >> 13;
-           printf (" size at 0x%03x + 0x%02x", stack_size, stack_adj);
+           printf (" size at 0x%03x + 0x%02x", stack_size, stack_adj * sz);
          }
        /* Registers are coded using arithmetic compression: the register
           is indexed in range 0-6, the second in range 0-5, the third in
@@ -1359,12 +1359,13 @@ dump_exe_compact_unwind (bfd *abfd,
       const unsigned char *level2;
       unsigned int kind;
 
-      if (i == index_count - 1)
-       break;
-
       func_offset = bfd_get_32 (abfd, index_entry->function_offset);
       level2_offset = bfd_get_32 (abfd, index_entry->second_level_offset);
 
+      /* No level-2 for this index (should be the last index).  */
+      if (level2_offset == 0)
+       continue;
+
       level2 = content + level2_offset;
       kind = bfd_get_32 (abfd, level2);
       switch (kind)
@@ -1477,7 +1478,7 @@ dump_exe_compact_unwind (bfd *abfd,
        nbr_lsda = (next_lsda_offset - lsda_offset) / sizeof (*lsda);
        for (j = 0; j < nbr_lsda; j++)
          {
-           printf ("   lsda %-3u: function 0x%08x lsda 0x%08x\n",
+           printf ("   lsda %3u: function 0x%08x lsda 0x%08x\n",
                    j, (unsigned int) bfd_get_32 (abfd, lsda->function_offset),
                    (unsigned int) bfd_get_32 (abfd, lsda->lsda_offset));
            lsda++;