PowerPC disassembly of odd sized sections
authorAlan Modra <amodra@gmail.com>
Thu, 19 Mar 2020 23:46:28 +0000 (10:16 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 20 Mar 2020 02:05:51 +0000 (12:35 +1030)
We shouldn't really decode a 2-byte left-over at the end of a section
as if the section contains two more bytes of zeros.  Not that it
matters very much, but this patch tidies the corner case.

* ppc-dis.c (print_insn_powerpc): Only clear needed bytes of
partially filled buffer.  Prevent lookup of 4-byte insns when
only VLE 2-byte insns are possible due to section size.  Print
".word" rather than ".long" for 2-byte leftovers.

opcodes/ChangeLog
opcodes/ppc-dis.c

index 3e947367e21247330693ce9cd986d1a4e9dd12a8..98f5d54bb3e055a728d8b16d4047918b49a000ae 100644 (file)
@@ -1,3 +1,10 @@
+2020-03-20  Alan Modra  <amodra@gmail.com>
+
+       * ppc-dis.c (print_insn_powerpc): Only clear needed bytes of
+       partially filled buffer.  Prevent lookup of 4-byte insns when
+       only VLE 2-byte insns are possible due to section size.  Print
+       ".word" rather than ".long" for 2-byte leftovers.
+
 2020-03-17  Sergey Belyashov  <sergey.belyashov@gmail.com>
 
        PR 25641
index a735fbb5a9a97dee368d1329a907eafffb00fdc2..b437fafa374899aa1f4b1c649856f7e08f652d87 100644 (file)
@@ -750,8 +750,9 @@ print_insn_powerpc (bfd_vma memaddr,
   if (status != 0 && (dialect & PPC_OPCODE_VLE) != 0)
     {
       /* Clear buffer so unused bytes will not have garbage in them.  */
-      buffer[0] = buffer[1] = buffer[2] = buffer[3] = 0;
+      buffer[2] = buffer[3] = 0;
       status = (*info->read_memory_func) (memaddr, buffer, 2, info);
+      insn_length = 2;
     }
 
   if (status != 0)
@@ -801,12 +802,15 @@ print_insn_powerpc (bfd_vma memaddr,
          insn_length = 2;
        }
     }
-  if (opcode == NULL && (dialect & PPC_OPCODE_SPE2) != 0)
-    opcode = lookup_spe2 (insn);
-  if (opcode == NULL)
-    opcode = lookup_powerpc (insn, dialect & ~PPC_OPCODE_ANY);
-  if (opcode == NULL && (dialect & PPC_OPCODE_ANY) != 0)
-    opcode = lookup_powerpc (insn, dialect);
+  if (opcode == NULL && insn_length == 4)
+    {
+      if ((dialect & PPC_OPCODE_SPE2) != 0)
+       opcode = lookup_spe2 (insn);
+      if (opcode == NULL)
+       opcode = lookup_powerpc (insn, dialect & ~PPC_OPCODE_ANY);
+      if (opcode == NULL && (dialect & PPC_OPCODE_ANY) != 0)
+       opcode = lookup_powerpc (insn, dialect);
+    }
 
   if (opcode != NULL)
     {
@@ -918,9 +922,13 @@ print_insn_powerpc (bfd_vma memaddr,
     }
 
   /* We could not find a match.  */
-  (*info->fprintf_func) (info->stream, ".long 0x%" PRIx64, insn);
-
-  return 4;
+  if (insn_length == 4)
+    (*info->fprintf_func) (info->stream, ".long 0x%x",
+                          (unsigned int) insn);
+  else
+    (*info->fprintf_func) (info->stream, ".word 0x%x",
+                          (unsigned int) insn >> 16);
+  return insn_length;
 }
 
 const disasm_options_and_args_t *