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:
parent
65773341ee
commit
6031ac352c
@ -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.
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user