PowerPC disassembly of odd sized sections
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.
This commit is contained in:
parent
a859124df2
commit
833d919c93
@ -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>
|
2020-03-17 Sergey Belyashov <sergey.belyashov@gmail.com>
|
||||||
|
|
||||||
PR 25641
|
PR 25641
|
||||||
|
@ -750,8 +750,9 @@ print_insn_powerpc (bfd_vma memaddr,
|
|||||||
if (status != 0 && (dialect & PPC_OPCODE_VLE) != 0)
|
if (status != 0 && (dialect & PPC_OPCODE_VLE) != 0)
|
||||||
{
|
{
|
||||||
/* Clear buffer so unused bytes will not have garbage in them. */
|
/* 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);
|
status = (*info->read_memory_func) (memaddr, buffer, 2, info);
|
||||||
|
insn_length = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status != 0)
|
if (status != 0)
|
||||||
@ -801,12 +802,15 @@ print_insn_powerpc (bfd_vma memaddr,
|
|||||||
insn_length = 2;
|
insn_length = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (opcode == NULL && (dialect & PPC_OPCODE_SPE2) != 0)
|
if (opcode == NULL && insn_length == 4)
|
||||||
opcode = lookup_spe2 (insn);
|
{
|
||||||
if (opcode == NULL)
|
if ((dialect & PPC_OPCODE_SPE2) != 0)
|
||||||
opcode = lookup_powerpc (insn, dialect & ~PPC_OPCODE_ANY);
|
opcode = lookup_spe2 (insn);
|
||||||
if (opcode == NULL && (dialect & PPC_OPCODE_ANY) != 0)
|
if (opcode == NULL)
|
||||||
opcode = lookup_powerpc (insn, dialect);
|
opcode = lookup_powerpc (insn, dialect & ~PPC_OPCODE_ANY);
|
||||||
|
if (opcode == NULL && (dialect & PPC_OPCODE_ANY) != 0)
|
||||||
|
opcode = lookup_powerpc (insn, dialect);
|
||||||
|
}
|
||||||
|
|
||||||
if (opcode != NULL)
|
if (opcode != NULL)
|
||||||
{
|
{
|
||||||
@ -918,9 +922,13 @@ print_insn_powerpc (bfd_vma memaddr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* We could not find a match. */
|
/* We could not find a match. */
|
||||||
(*info->fprintf_func) (info->stream, ".long 0x%" PRIx64, insn);
|
if (insn_length == 4)
|
||||||
|
(*info->fprintf_func) (info->stream, ".long 0x%x",
|
||||||
return 4;
|
(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 *
|
const disasm_options_and_args_t *
|
||||||
|
Loading…
Reference in New Issue
Block a user