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.
This commit is contained in:
Sandra Loosemore 2018-09-23 12:31:23 -07:00
parent 65773341ee
commit 6031ac352c
2 changed files with 21 additions and 13 deletions

View File

@ -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> 2018-09-21 Simon Marchi <simon.marchi@ericsson.com>
* Makefile.am: Remove NO_WMISSING_FIELD_INITIALIZERS. * Makefile.am: Remove NO_WMISSING_FIELD_INITIALIZERS.

View File

@ -275,6 +275,8 @@ nios2_print_insn_arg (const char *argptr,
const struct nios2_opcode *op) const struct nios2_opcode *op)
{ {
unsigned long i = 0; unsigned long i = 0;
long s = 0;
bfd_signed_vma o = 0;
struct nios2_reg *reg_base; struct nios2_reg *reg_base;
switch (*argptr) switch (*argptr)
@ -552,15 +554,15 @@ nios2_print_insn_arg (const char *argptr,
switch (op->format) switch (op->format)
{ {
case iw_i_type: case iw_i_type:
i = (signed) (GET_IW_I_IMM16 (opcode) << 16) >> 16; s = (int32_t) (GET_IW_I_IMM16 (opcode) << 16) >> 16;
break; break;
case iw_F2I16_type: case iw_F2I16_type:
i = (signed) (GET_IW_F2I16_IMM16 (opcode) << 16) >> 16; s = (int32_t) (GET_IW_F2I16_IMM16 (opcode) << 16) >> 16;
break; break;
default: default:
bad_opcode (op); bad_opcode (op);
} }
(*info->fprintf_func) (info->stream, "%ld", i); (*info->fprintf_func) (info->stream, "%ld", s);
break; break;
case 'I': case 'I':
@ -568,15 +570,15 @@ nios2_print_insn_arg (const char *argptr,
switch (op->format) switch (op->format)
{ {
case iw_F2X4I12_type: case iw_F2X4I12_type:
i = (signed) (GET_IW_F2X4I12_IMM12 (opcode) << 20) >> 20; s = (int32_t) (GET_IW_F2X4I12_IMM12 (opcode) << 20) >> 20;
break; break;
case iw_F1X4I12_type: case iw_F1X4I12_type:
i = (signed) (GET_IW_F1X4I12_IMM12 (opcode) << 20) >> 20; s = (int32_t) (GET_IW_F1X4I12_IMM12 (opcode) << 20) >> 20;
break; break;
default: default:
bad_opcode (op); bad_opcode (op);
} }
(*info->fprintf_func) (info->stream, "%ld", i); (*info->fprintf_func) (info->stream, "%ld", s);
break; break;
case 'u': case 'u':
@ -671,15 +673,15 @@ nios2_print_insn_arg (const char *argptr,
switch (op->format) switch (op->format)
{ {
case iw_i_type: case iw_i_type:
i = (signed) (GET_IW_I_IMM16 (opcode) << 16) >> 16; o = (int32_t) (GET_IW_I_IMM16 (opcode) << 16) >> 16;
break; break;
case iw_F2I16_type: case iw_F2I16_type:
i = (signed) (GET_IW_F2I16_IMM16 (opcode) << 16) >> 16; o = (int32_t) (GET_IW_F2I16_IMM16 (opcode) << 16) >> 16;
break; break;
default: default:
bad_opcode (op); bad_opcode (op);
} }
address = address + 4 + i; address = address + 4 + o;
(*info->print_address_func) (address, info); (*info->print_address_func) (address, info);
break; break;
@ -688,12 +690,12 @@ nios2_print_insn_arg (const char *argptr,
switch (op->format) switch (op->format)
{ {
case iw_I10_type: case iw_I10_type:
i = (signed) (GET_IW_I10_IMM10 (opcode) << 22) >> 21; o = (int32_t) (GET_IW_I10_IMM10 (opcode) << 22) >> 21;
break; break;
default: default:
bad_opcode (op); bad_opcode (op);
} }
address = address + 2 + i; address = address + 2 + o;
(*info->print_address_func) (address, info); (*info->print_address_func) (address, info);
break; break;
@ -702,12 +704,12 @@ nios2_print_insn_arg (const char *argptr,
switch (op->format) switch (op->format)
{ {
case iw_T1I7_type: case iw_T1I7_type:
i = (signed) (GET_IW_T1I7_IMM7 (opcode) << 25) >> 24; o = (int32_t) (GET_IW_T1I7_IMM7 (opcode) << 25) >> 24;
break; break;
default: default:
bad_opcode (op); bad_opcode (op);
} }
address = address + 2 + i; address = address + 2 + o;
(*info->print_address_func) (address, info); (*info->print_address_func) (address, info);
break; break;