diff options
Diffstat (limited to 'opcodes/avr-dis.c')
-rw-r--r-- | opcodes/avr-dis.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/opcodes/avr-dis.c b/opcodes/avr-dis.c index 748cb2d..e32c2b6 100644 --- a/opcodes/avr-dis.c +++ b/opcodes/avr-dis.c @@ -25,6 +25,7 @@ #include "dis-asm.h" #include "opintl.h" #include "libiberty.h" +#include "bfd_stdint.h" struct avr_opcodes_s { @@ -271,8 +272,11 @@ avr_operand (unsigned int insn, unsigned int insn2, unsigned int pc, int constra return ok; } -static unsigned short -avrdis_opcode (bfd_vma addr, disassemble_info *info) +/* Read the opcode from ADDR. Return 0 in success and save opcode + in *INSN, otherwise, return -1. */ + +static int +avrdis_opcode (bfd_vma addr, disassemble_info *info, uint16_t *insn) { bfd_byte buffer[2]; int status; @@ -280,7 +284,10 @@ avrdis_opcode (bfd_vma addr, disassemble_info *info) status = info->read_memory_func (addr, buffer, 2, info); if (status == 0) - return bfd_getl16 (buffer); + { + *insn = bfd_getl16 (buffer); + return 0; + } info->memory_error_func (status, addr, info); return -1; @@ -290,7 +297,7 @@ avrdis_opcode (bfd_vma addr, disassemble_info *info) int print_insn_avr (bfd_vma addr, disassemble_info *info) { - unsigned int insn, insn2; + uint16_t insn, insn2; const struct avr_opcodes_s *opcode; static unsigned int *maskptr; void *stream = info->stream; @@ -341,7 +348,8 @@ print_insn_avr (bfd_vma addr, disassemble_info *info) initialized = 1; } - insn = avrdis_opcode (addr, info); + if (avrdis_opcode (addr, info, &insn) != 0) + return -1; for (opcode = avr_opcodes, maskptr = avr_bin_masks; opcode->name; @@ -374,7 +382,8 @@ print_insn_avr (bfd_vma addr, disassemble_info *info) if (opcode->insn_size > 1) { - insn2 = avrdis_opcode (addr + 2, info); + if (avrdis_opcode (addr + 2, info, &insn2) != 0) + return -1; cmd_len = 4; } |