diff options
author | Sandra Loosemore <sandra@codesourcery.com> | 2018-09-23 12:31:23 -0700 |
---|---|---|
committer | Sandra Loosemore <sandra@codesourcery.com> | 2018-09-23 12:31:23 -0700 |
commit | 6031ac352c05c5c9f44e24fa1c5a8222a7a7d02d (patch) | |
tree | 203b9098b35e55b7ec678328d4ea54a3e4a98beb /opcodes | |
parent | 65773341ee5ad9e2882fcb1aed7c3096e6b4f190 (diff) | |
download | gdb-6031ac352c05c5c9f44e24fa1c5a8222a7a7d02d.zip gdb-6031ac352c05c5c9f44e24fa1c5a8222a7a7d02d.tar.gz gdb-6031ac352c05c5c9f44e24fa1c5a8222a7a7d02d.tar.bz2 |
Fix incorrect extraction of signed constants in nios2 disassembler.
2018-09-23 Sandra Loosemore <sandra@codesourcery.com>
opcodes/
* nios2-dis.c (nios2_print_insn_arg): Make sure signed conversions
are used when extracting signed fields and converting them to
potentially 64-bit types.
Diffstat (limited to 'opcodes')
-rw-r--r-- | opcodes/ChangeLog | 6 | ||||
-rw-r--r-- | opcodes/nios2-dis.c | 28 |
2 files changed, 21 insertions, 13 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 9f32531..9b68285 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,9 @@ +2018-09-23 Sandra Loosemore <sandra@codesourcery.com> + + * nios2-dis.c (nios2_print_insn_arg): Make sure signed conversions + are used when extracting signed fields and converting them to + potentially 64-bit types. + 2018-09-21 Simon Marchi <simon.marchi@ericsson.com> * Makefile.am: Remove NO_WMISSING_FIELD_INITIALIZERS. diff --git a/opcodes/nios2-dis.c b/opcodes/nios2-dis.c index 257e5bb..51027b5 100644 --- a/opcodes/nios2-dis.c +++ b/opcodes/nios2-dis.c @@ -275,6 +275,8 @@ nios2_print_insn_arg (const char *argptr, const struct nios2_opcode *op) { unsigned long i = 0; + long s = 0; + bfd_signed_vma o = 0; struct nios2_reg *reg_base; switch (*argptr) @@ -552,15 +554,15 @@ nios2_print_insn_arg (const char *argptr, switch (op->format) { case iw_i_type: - i = (signed) (GET_IW_I_IMM16 (opcode) << 16) >> 16; + s = (int32_t) (GET_IW_I_IMM16 (opcode) << 16) >> 16; break; case iw_F2I16_type: - i = (signed) (GET_IW_F2I16_IMM16 (opcode) << 16) >> 16; + s = (int32_t) (GET_IW_F2I16_IMM16 (opcode) << 16) >> 16; break; default: bad_opcode (op); } - (*info->fprintf_func) (info->stream, "%ld", i); + (*info->fprintf_func) (info->stream, "%ld", s); break; case 'I': @@ -568,15 +570,15 @@ nios2_print_insn_arg (const char *argptr, switch (op->format) { case iw_F2X4I12_type: - i = (signed) (GET_IW_F2X4I12_IMM12 (opcode) << 20) >> 20; + s = (int32_t) (GET_IW_F2X4I12_IMM12 (opcode) << 20) >> 20; break; case iw_F1X4I12_type: - i = (signed) (GET_IW_F1X4I12_IMM12 (opcode) << 20) >> 20; + s = (int32_t) (GET_IW_F1X4I12_IMM12 (opcode) << 20) >> 20; break; default: bad_opcode (op); } - (*info->fprintf_func) (info->stream, "%ld", i); + (*info->fprintf_func) (info->stream, "%ld", s); break; case 'u': @@ -671,15 +673,15 @@ nios2_print_insn_arg (const char *argptr, switch (op->format) { case iw_i_type: - i = (signed) (GET_IW_I_IMM16 (opcode) << 16) >> 16; + o = (int32_t) (GET_IW_I_IMM16 (opcode) << 16) >> 16; break; case iw_F2I16_type: - i = (signed) (GET_IW_F2I16_IMM16 (opcode) << 16) >> 16; + o = (int32_t) (GET_IW_F2I16_IMM16 (opcode) << 16) >> 16; break; default: bad_opcode (op); } - address = address + 4 + i; + address = address + 4 + o; (*info->print_address_func) (address, info); break; @@ -688,12 +690,12 @@ nios2_print_insn_arg (const char *argptr, switch (op->format) { case iw_I10_type: - i = (signed) (GET_IW_I10_IMM10 (opcode) << 22) >> 21; + o = (int32_t) (GET_IW_I10_IMM10 (opcode) << 22) >> 21; break; default: bad_opcode (op); } - address = address + 2 + i; + address = address + 2 + o; (*info->print_address_func) (address, info); break; @@ -702,12 +704,12 @@ nios2_print_insn_arg (const char *argptr, switch (op->format) { case iw_T1I7_type: - i = (signed) (GET_IW_T1I7_IMM7 (opcode) << 25) >> 24; + o = (int32_t) (GET_IW_T1I7_IMM7 (opcode) << 25) >> 24; break; default: bad_opcode (op); } - address = address + 2 + i; + address = address + 2 + o; (*info->print_address_func) (address, info); break; |