aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSandra Loosemore <sandra@codesourcery.com>2020-05-26 23:23:03 -0700
committerSandra Loosemore <sandra@codesourcery.com>2020-05-26 23:23:03 -0700
commit25e1eca8faf1c29d28e57b37d6b5e3810b7b870b (patch)
tree2b62c4691aa18c397bd6f9887bde1b23a231f729
parentdbac035ca042260654395b2f292f515c746b3016 (diff)
downloadgdb-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.
-rw-r--r--opcodes/ChangeLog7
-rw-r--r--opcodes/nios2-dis.c26
2 files changed, 25 insertions, 8 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 83d8815..52cbe8e 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,10 @@
+2020-05-26 Sandra Loosemore <sandra@codesourcery.com>
+
+ Fix extraction of signed constants in nios2 disassembler (again).
+
+ * nios2-dis.c (nios2_print_insn_arg): Add explicit casts to
+ extractions of signed fields.
+
2020-05-26 Stefan Schulze Frielinghaus <stefansf@linux.ibm.com>
* s390-opc.txt: Relocate vector load/store instructions with
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);