diff options
author | Yao Qi <yao.qi@linaro.org> | 2016-12-29 15:47:40 +0000 |
---|---|---|
committer | Yao Qi <yao.qi@linaro.org> | 2016-12-29 15:47:40 +0000 |
commit | 0a7e10188e3c08403fb00b728644d7a95092c732 (patch) | |
tree | f812ae364685b510ad42f5bfbbd6720cf083537f | |
parent | e81830c5c61a8665c098189d069cc68b0df113d3 (diff) | |
download | gdb-0a7e10188e3c08403fb00b728644d7a95092c732.zip gdb-0a7e10188e3c08403fb00b728644d7a95092c732.tar.gz gdb-0a7e10188e3c08403fb00b728644d7a95092c732.tar.bz2 |
Return 'int' rather than 'unsigned short' in avrdis_opcode
avrdis_opcode return type is unsigned short, but -1 at the end of
this function is returned. Additionally, print_insn_avr doesn't
handle when -1 (in case of memory error) is returned from
avrdis_opcode.
This patch changes avrdis_opcode returning int indicating the error,
and adds a new argument for instruction we got on success. The
opcode is 16-bit, so I change local variables type to uint16_t,
and include "bfd_stdint.h" as a result. On memory error,
print_insn_avr returns -1, which is a common convention among most
of print_insn_$ARCH functions.
opcodes:
2016-12-29 Yao Qi <yao.qi@linaro.org>
* avr-dis.c: Include "bfd_stdint.h"
(avrdis_opcode): Change return type to int, add argument
insn. Set *INSN on success.
(print_insn_avr): Check return value of avrdis_opcode, and
return -1 on error.
-rw-r--r-- | opcodes/ChangeLog | 8 | ||||
-rw-r--r-- | opcodes/avr-dis.c | 21 |
2 files changed, 23 insertions, 6 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 3169dc0..f004163 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,11 @@ +2016-12-29 Yao Qi <yao.qi@linaro.org> + + * avr-dis.c: Include "bfd_stdint.h" + (avrdis_opcode): Change return type to int, add argument + insn. Set *INSN on success. + (print_insn_avr): Check return value of avrdis_opcode, and + return -1 on error. + 2016-12-28 Alan Modra <amodra@gmail.com> * configure.ac: Revert 2016-12-23. 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; } |