diff options
author | Alan Modra <amodra@gmail.com> | 2020-03-20 10:16:28 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2020-03-20 12:35:51 +1030 |
commit | 833d919c93d52644173d587a6fc8e4dd36edc49e (patch) | |
tree | 84c6ed121c7730946bb995184cc572f44628de33 /opcodes | |
parent | a859124df20f6544dbef96084e4e024bccebd853 (diff) | |
download | fsf-binutils-gdb-833d919c93d52644173d587a6fc8e4dd36edc49e.zip fsf-binutils-gdb-833d919c93d52644173d587a6fc8e4dd36edc49e.tar.gz fsf-binutils-gdb-833d919c93d52644173d587a6fc8e4dd36edc49e.tar.bz2 |
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.
Diffstat (limited to 'opcodes')
-rw-r--r-- | opcodes/ChangeLog | 7 | ||||
-rw-r--r-- | opcodes/ppc-dis.c | 28 |
2 files changed, 25 insertions, 10 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 3e94736..98f5d54 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -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 diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c index a735fbb..b437faf 100644 --- a/opcodes/ppc-dis.c +++ b/opcodes/ppc-dis.c @@ -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 * |