diff options
author | Sandra Loosemore <sandra@codesourcery.com> | 2020-05-26 23:23:03 -0700 |
---|---|---|
committer | Sandra Loosemore <sandra@codesourcery.com> | 2020-05-26 23:23:03 -0700 |
commit | 25e1eca8faf1c29d28e57b37d6b5e3810b7b870b (patch) | |
tree | 2b62c4691aa18c397bd6f9887bde1b23a231f729 /opcodes/nios2-dis.c | |
parent | dbac035ca042260654395b2f292f515c746b3016 (diff) | |
download | gdb-25e1eca8faf1c29d28e57b37d6b5e3810b7b870b.zip gdb-25e1eca8faf1c29d28e57b37d6b5e3810b7b870b.tar.gz gdb-25e1eca8faf1c29d28e57b37d6b5e3810b7b870b.tar.bz2 |
Fix extraction of signed constants in nios2 disassembler (again).
In commit 6031ac352c05c5c9f44e24fa1c5a8222a7a7d02d I added some casts
to explicitly do conversions from unsigned to signed as 32-bit
quantities to address some bugs with different sizes of long and
bfd_signed_vma. Those casts were removed in the rewrite of the
sign-extension logic in commit 1d61b032265e69317f42e8019e072506f11890c5,
reintroducing the same bugs. This patch restores the casts.
2020-05-26 Sandra Loosemore <sandra@codesourcery.com>
opcodes/
* nios2-dis.c (nios2_print_insn_arg): Add explicit casts to
extractions of signed fields.
Diffstat (limited to 'opcodes/nios2-dis.c')
-rw-r--r-- | opcodes/nios2-dis.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/opcodes/nios2-dis.c b/opcodes/nios2-dis.c index 0d6d619..e1eeacc 100644 --- a/opcodes/nios2-dis.c +++ b/opcodes/nios2-dis.c @@ -554,10 +554,12 @@ nios2_print_insn_arg (const char *argptr, switch (op->format) { case iw_i_type: - s = ((GET_IW_I_IMM16 (opcode) & 0xffff) ^ 0x8000) - 0x8000; + s = ((int32_t) ((GET_IW_I_IMM16 (opcode) & 0xffff) ^ 0x8000) + - 0x8000); break; case iw_F2I16_type: - s = ((GET_IW_F2I16_IMM16 (opcode) & 0xffff) ^ 0x8000) - 0x8000; + s = ((int32_t) ((GET_IW_F2I16_IMM16 (opcode) & 0xffff) ^ 0x8000) + - 0x8000); break; default: bad_opcode (op); @@ -570,10 +572,12 @@ nios2_print_insn_arg (const char *argptr, switch (op->format) { case iw_F2X4I12_type: - s = ((GET_IW_F2X4I12_IMM12 (opcode) & 0xfff) ^ 0x800) - 0x800; + s = ((int32_t) ((GET_IW_F2X4I12_IMM12 (opcode) & 0xfff) ^ 0x800) + - 0x800); break; case iw_F1X4I12_type: - s = ((GET_IW_F1X4I12_IMM12 (opcode) & 0xfff) ^ 0x800) - 0x800; + s = ((int32_t) ((GET_IW_F1X4I12_IMM12 (opcode) & 0xfff) ^ 0x800) + - 0x800); break; default: bad_opcode (op); @@ -673,10 +677,12 @@ nios2_print_insn_arg (const char *argptr, switch (op->format) { case iw_i_type: - o = ((GET_IW_I_IMM16 (opcode) & 0xffff) ^ 0x8000) - 0x8000; + o = ((int32_t) ((GET_IW_I_IMM16 (opcode) & 0xffff) ^ 0x8000) + - 0x8000); break; case iw_F2I16_type: - o = ((GET_IW_F2I16_IMM16 (opcode) & 0xffff) ^ 0x8000) - 0x8000; + o = ((int32_t) ((GET_IW_F2I16_IMM16 (opcode) & 0xffff) ^ 0x8000) + - 0x8000); break; default: bad_opcode (op); @@ -690,7 +696,9 @@ nios2_print_insn_arg (const char *argptr, switch (op->format) { case iw_I10_type: - o = (((GET_IW_I10_IMM10 (opcode) & 0x3ff) ^ 0x400) - 0x400) << 1; + o = (((int32_t) ((GET_IW_I10_IMM10 (opcode) & 0x3ff) ^ 0x400) + - 0x400) + << 1); break; default: bad_opcode (op); @@ -704,7 +712,9 @@ nios2_print_insn_arg (const char *argptr, switch (op->format) { case iw_T1I7_type: - o = (((GET_IW_T1I7_IMM7 (opcode) & 0x7f) ^ 0x40) - 0x40) << 1; + o = (((int32_t) ((GET_IW_T1I7_IMM7 (opcode) & 0x7f) ^ 0x40) + - 0x40) + << 1); break; default: bad_opcode (op); |