aboutsummaryrefslogtreecommitdiff
path: root/opcodes
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2020-09-02 10:42:53 +0930
committerAlan Modra <amodra@gmail.com>2020-09-02 16:30:44 +0930
commit3c5097eae4a9a7e09b67bb3e1713c16ccef5faeb (patch)
treec13a14ec23e2feba5af1cc0117beda3319f53fcc /opcodes
parentae3e98b418c6f31cc1999d67fc2422429d88de6f (diff)
downloadgdb-3c5097eae4a9a7e09b67bb3e1713c16ccef5faeb.zip
gdb-3c5097eae4a9a7e09b67bb3e1713c16ccef5faeb.tar.gz
gdb-3c5097eae4a9a7e09b67bb3e1713c16ccef5faeb.tar.bz2
ubsan: crx-dis.c:571 left shift of negative value
* crx-dis.c: Whitespace. (print_arg): Use unsigned type for longdisp and mask variables, and for left shift constant.
Diffstat (limited to 'opcodes')
-rw-r--r--opcodes/ChangeLog6
-rw-r--r--opcodes/crx-dis.c148
2 files changed, 80 insertions, 74 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 0cb0491..d89ad9d 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,5 +1,11 @@
2020-09-02 Alan Modra <amodra@gmail.com>
+ * crx-dis.c: Whitespace.
+ (print_arg): Use unsigned type for longdisp and mask variables,
+ and for left shift constant.
+
+2020-09-02 Alan Modra <amodra@gmail.com>
+
* cgen-ibld.in (insert_normal, extract_normal): Use 1UL in left shift.
* bpf-ibld.c: Regenerate.
* epiphany-ibld.c: Regenerate.
diff --git a/opcodes/crx-dis.c b/opcodes/crx-dis.c
index 011cd68..1ffecac 100644
--- a/opcodes/crx-dis.c
+++ b/opcodes/crx-dis.c
@@ -387,7 +387,7 @@ make_argument (argument * a, int start_bits)
inst_bit_size - start_bits);
if ((p.nbits == 4) && cst4flag)
- {
+ {
if (IS_INSN_TYPE (CMPBR_INS) && (p.val == ESCAPE_16_BIT))
{
/* A special case, where the value is actually stored
@@ -397,19 +397,19 @@ make_argument (argument * a, int start_bits)
size_changed = 1;
}
- if (p.val == 6)
- p.val = -1;
- else if (p.val == 13)
- p.val = 48;
- else if (p.val == 5)
- p.val = -4;
- else if (p.val == 10)
- p.val = 32;
- else if (p.val == 11)
- p.val = 20;
- else if (p.val == 9)
- p.val = 16;
- }
+ if (p.val == 6)
+ p.val = -1;
+ else if (p.val == 13)
+ p.val = 48;
+ else if (p.val == 5)
+ p.val = -4;
+ else if (p.val == 10)
+ p.val = 32;
+ else if (p.val == 11)
+ p.val = 20;
+ else if (p.val == 9)
+ p.val = 16;
+ }
a->constant = p.val;
break;
@@ -439,30 +439,30 @@ make_argument (argument * a, int start_bits)
case arg_cr:
if (a->size <= 8)
- {
- p = makelongparameter (allWords, inst_bit_size - (start_bits + 4),
+ {
+ p = makelongparameter (allWords, inst_bit_size - (start_bits + 4),
inst_bit_size - start_bits);
- a->r = p.val;
- /* Case for opc4 r dispu rbase. */
- p = makelongparameter (allWords, inst_bit_size - (start_bits + 8),
+ a->r = p.val;
+ /* Case for opc4 r dispu rbase. */
+ p = makelongparameter (allWords, inst_bit_size - (start_bits + 8),
inst_bit_size - (start_bits + 4));
- }
+ }
else
- {
+ {
/* The 'rbase' start_bits is always relative to a 32-bit data type. */
- p = makelongparameter (allWords, 32 - (start_bits + 4),
+ p = makelongparameter (allWords, 32 - (start_bits + 4),
32 - start_bits);
- a->r = p.val;
- p = makelongparameter (allWords, 32 - start_bits,
+ a->r = p.val;
+ p = makelongparameter (allWords, 32 - start_bits,
inst_bit_size);
- }
+ }
if ((p.nbits == 4) && cst4flag)
- {
- if (instruction->flags & DISPUW4)
+ {
+ if (instruction->flags & DISPUW4)
p.val *= 2;
- else if (instruction->flags & DISPUD4)
+ else if (instruction->flags & DISPUD4)
p.val *= 4;
- }
+ }
a->constant = p.val;
break;
@@ -481,7 +481,7 @@ make_argument (argument * a, int start_bits)
static void
print_arg (argument *a, bfd_vma memaddr, struct disassemble_info *info)
{
- LONGLONG longdisp, mask;
+ ULONGLONG longdisp, mask;
int sign_flag = 0;
int relative = 0;
bfd_vma number;
@@ -515,29 +515,29 @@ print_arg (argument *a, bfd_vma memaddr, struct disassemble_info *info)
func (stream, "%s", getcinvstring (a->constant));
else if (INST_HAS_REG_LIST)
- {
+ {
REG_ARG_TYPE reg_arg_type = IS_INSN_TYPE (COP_REG_INS) ?
- COP_ARG : IS_INSN_TYPE (COPS_REG_INS) ?
- COPS_ARG : (instruction->flags & USER_REG) ?
- USER_REG_ARG : REG_ARG;
+ COP_ARG : IS_INSN_TYPE (COPS_REG_INS) ?
+ COPS_ARG : (instruction->flags & USER_REG) ?
+ USER_REG_ARG : REG_ARG;
- if ((reg_arg_type == COP_ARG) || (reg_arg_type == COPS_ARG))
+ if ((reg_arg_type == COP_ARG) || (reg_arg_type == COPS_ARG))
{
- /* Check for proper argument number. */
- if (processing_argument_number == 2)
- {
- getregliststring (a->constant, string, reg_arg_type);
- func (stream, "%s", string);
- }
- else
- func (stream, "$0x%lx", a->constant & 0xffffffff);
+ /* Check for proper argument number. */
+ if (processing_argument_number == 2)
+ {
+ getregliststring (a->constant, string, reg_arg_type);
+ func (stream, "%s", string);
+ }
+ else
+ func (stream, "$0x%lx", a->constant & 0xffffffff);
}
else
- {
- getregliststring (a->constant, string, reg_arg_type);
- func (stream, "%s", string);
- }
- }
+ {
+ getregliststring (a->constant, string, reg_arg_type);
+ func (stream, "%s", string);
+ }
+ }
else
func (stream, "$0x%lx", a->constant & 0xffffffff);
break;
@@ -565,47 +565,47 @@ print_arg (argument *a, bfd_vma memaddr, struct disassemble_info *info)
if (IS_INSN_TYPE (BRANCH_INS) || IS_INSN_MNEMONIC ("bal")
|| IS_INSN_TYPE (CMPBR_INS) || IS_INSN_TYPE (DCR_BRANCH_INS)
|| IS_INSN_TYPE (COP_BRANCH_INS))
- {
+ {
relative = 1;
- longdisp = a->constant;
- longdisp <<= 1;
+ longdisp = a->constant;
+ longdisp <<= 1;
- switch (a->size)
- {
- case 8:
+ switch (a->size)
+ {
+ case 8:
case 16:
case 24:
case 32:
- mask = ((LONGLONG)1 << a->size) - 1;
- if (longdisp & ((LONGLONG)1 << a->size))
- {
- sign_flag = 1;
- longdisp = ~(longdisp) + 1;
- }
- a->constant = (unsigned long int) (longdisp & mask);
- break;
- default:
+ mask = ((LONGLONG) 1 << a->size) - 1;
+ if (longdisp & ((ULONGLONG) 1 << a->size))
+ {
+ sign_flag = 1;
+ longdisp = ~(longdisp) + 1;
+ }
+ a->constant = (unsigned long int) (longdisp & mask);
+ break;
+ default:
func (stream,
"Wrong offset used in branch/bal instruction");
- break;
- }
+ break;
+ }
- }
+ }
/* For branch Neq instruction it is 2*offset + 2. */
else if (IS_INSN_TYPE (BRANCH_NEQ_INS))
a->constant = 2 * a->constant + 2;
else if (IS_INSN_TYPE (LD_STOR_INS_INC)
- || IS_INSN_TYPE (LD_STOR_INS)
- || IS_INSN_TYPE (STOR_IMM_INS)
- || IS_INSN_TYPE (CSTBIT_INS))
- {
- op_index = instruction->flags & REVERSE_MATCH ? 0 : 1;
- if (instruction->operands[op_index].op_type == abs16)
+ || IS_INSN_TYPE (LD_STOR_INS)
+ || IS_INSN_TYPE (STOR_IMM_INS)
+ || IS_INSN_TYPE (CSTBIT_INS))
+ {
+ op_index = instruction->flags & REVERSE_MATCH ? 0 : 1;
+ if (instruction->operands[op_index].op_type == abs16)
a->constant |= 0xFFFF0000;
- }
+ }
func (stream, "%s", "0x");
number = (relative ? memaddr : 0)
- + (sign_flag ? -a->constant : a->constant);
+ + (sign_flag ? -a->constant : a->constant);
(*info->print_address_func) (number, info);
break;
default: