121 lines
3.5 KiB
Diff
121 lines
3.5 KiB
Diff
From 6031ac352c05c5c9f44e24fa1c5a8222a7a7d02d Mon Sep 17 00:00:00 2001
|
|
From: Sandra Loosemore <sandra@codesourcery.com>
|
|
Date: Sun, 23 Sep 2018 12:31:23 -0700
|
|
Subject: [PATCH] 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.
|
|
---
|
|
opcodes/ChangeLog | 6 ++++++
|
|
opcodes/nios2-dis.c | 28 +++++++++++++++-------------
|
|
2 files changed, 21 insertions(+), 13 deletions(-)
|
|
|
|
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;
|
|
|
|
--
|
|
2.9.3
|
|
|