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.
This commit is contained in:
Alan Modra
2020-09-02 10:42:53 +09:30
parent ae3e98b418
commit 3c5097eae4
2 changed files with 80 additions and 74 deletions

View File

@@ -1,3 +1,9 @@
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> 2020-09-02 Alan Modra <amodra@gmail.com>
* cgen-ibld.in (insert_normal, extract_normal): Use 1UL in left shift. * cgen-ibld.in (insert_normal, extract_normal): Use 1UL in left shift.

View File

@@ -387,7 +387,7 @@ make_argument (argument * a, int start_bits)
inst_bit_size - start_bits); inst_bit_size - start_bits);
if ((p.nbits == 4) && cst4flag) if ((p.nbits == 4) && cst4flag)
{ {
if (IS_INSN_TYPE (CMPBR_INS) && (p.val == ESCAPE_16_BIT)) if (IS_INSN_TYPE (CMPBR_INS) && (p.val == ESCAPE_16_BIT))
{ {
/* A special case, where the value is actually stored /* A special case, where the value is actually stored
@@ -397,19 +397,19 @@ make_argument (argument * a, int start_bits)
size_changed = 1; size_changed = 1;
} }
if (p.val == 6) if (p.val == 6)
p.val = -1; p.val = -1;
else if (p.val == 13) else if (p.val == 13)
p.val = 48; p.val = 48;
else if (p.val == 5) else if (p.val == 5)
p.val = -4; p.val = -4;
else if (p.val == 10) else if (p.val == 10)
p.val = 32; p.val = 32;
else if (p.val == 11) else if (p.val == 11)
p.val = 20; p.val = 20;
else if (p.val == 9) else if (p.val == 9)
p.val = 16; p.val = 16;
} }
a->constant = p.val; a->constant = p.val;
break; break;
@@ -439,30 +439,30 @@ make_argument (argument * a, int start_bits)
case arg_cr: case arg_cr:
if (a->size <= 8) 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); inst_bit_size - start_bits);
a->r = p.val; a->r = p.val;
/* Case for opc4 r dispu rbase. */ /* Case for opc4 r dispu rbase. */
p = makelongparameter (allWords, inst_bit_size - (start_bits + 8), p = makelongparameter (allWords, inst_bit_size - (start_bits + 8),
inst_bit_size - (start_bits + 4)); inst_bit_size - (start_bits + 4));
} }
else else
{ {
/* The 'rbase' start_bits is always relative to a 32-bit data type. */ /* 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); 32 - start_bits);
a->r = p.val; a->r = p.val;
p = makelongparameter (allWords, 32 - start_bits, p = makelongparameter (allWords, 32 - start_bits,
inst_bit_size); inst_bit_size);
} }
if ((p.nbits == 4) && cst4flag) if ((p.nbits == 4) && cst4flag)
{ {
if (instruction->flags & DISPUW4) if (instruction->flags & DISPUW4)
p.val *= 2; p.val *= 2;
else if (instruction->flags & DISPUD4) else if (instruction->flags & DISPUD4)
p.val *= 4; p.val *= 4;
} }
a->constant = p.val; a->constant = p.val;
break; break;
@@ -481,7 +481,7 @@ make_argument (argument * a, int start_bits)
static void static void
print_arg (argument *a, bfd_vma memaddr, struct disassemble_info *info) print_arg (argument *a, bfd_vma memaddr, struct disassemble_info *info)
{ {
LONGLONG longdisp, mask; ULONGLONG longdisp, mask;
int sign_flag = 0; int sign_flag = 0;
int relative = 0; int relative = 0;
bfd_vma number; bfd_vma number;
@@ -515,29 +515,29 @@ print_arg (argument *a, bfd_vma memaddr, struct disassemble_info *info)
func (stream, "%s", getcinvstring (a->constant)); func (stream, "%s", getcinvstring (a->constant));
else if (INST_HAS_REG_LIST) else if (INST_HAS_REG_LIST)
{ {
REG_ARG_TYPE reg_arg_type = IS_INSN_TYPE (COP_REG_INS) ? REG_ARG_TYPE reg_arg_type = IS_INSN_TYPE (COP_REG_INS) ?
COP_ARG : IS_INSN_TYPE (COPS_REG_INS) ? COP_ARG : IS_INSN_TYPE (COPS_REG_INS) ?
COPS_ARG : (instruction->flags & USER_REG) ? COPS_ARG : (instruction->flags & USER_REG) ?
USER_REG_ARG : REG_ARG; 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. */ /* Check for proper argument number. */
if (processing_argument_number == 2) if (processing_argument_number == 2)
{ {
getregliststring (a->constant, string, reg_arg_type); getregliststring (a->constant, string, reg_arg_type);
func (stream, "%s", string); func (stream, "%s", string);
} }
else else
func (stream, "$0x%lx", a->constant & 0xffffffff); func (stream, "$0x%lx", a->constant & 0xffffffff);
} }
else else
{ {
getregliststring (a->constant, string, reg_arg_type); getregliststring (a->constant, string, reg_arg_type);
func (stream, "%s", string); func (stream, "%s", string);
} }
} }
else else
func (stream, "$0x%lx", a->constant & 0xffffffff); func (stream, "$0x%lx", a->constant & 0xffffffff);
break; 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") if (IS_INSN_TYPE (BRANCH_INS) || IS_INSN_MNEMONIC ("bal")
|| IS_INSN_TYPE (CMPBR_INS) || IS_INSN_TYPE (DCR_BRANCH_INS) || IS_INSN_TYPE (CMPBR_INS) || IS_INSN_TYPE (DCR_BRANCH_INS)
|| IS_INSN_TYPE (COP_BRANCH_INS)) || IS_INSN_TYPE (COP_BRANCH_INS))
{ {
relative = 1; relative = 1;
longdisp = a->constant; longdisp = a->constant;
longdisp <<= 1; longdisp <<= 1;
switch (a->size) switch (a->size)
{ {
case 8: case 8:
case 16: case 16:
case 24: case 24:
case 32: case 32:
mask = ((LONGLONG)1 << a->size) - 1; mask = ((LONGLONG) 1 << a->size) - 1;
if (longdisp & ((LONGLONG)1 << a->size)) if (longdisp & ((ULONGLONG) 1 << a->size))
{ {
sign_flag = 1; sign_flag = 1;
longdisp = ~(longdisp) + 1; longdisp = ~(longdisp) + 1;
} }
a->constant = (unsigned long int) (longdisp & mask); a->constant = (unsigned long int) (longdisp & mask);
break; break;
default: default:
func (stream, func (stream,
"Wrong offset used in branch/bal instruction"); "Wrong offset used in branch/bal instruction");
break; break;
} }
} }
/* For branch Neq instruction it is 2*offset + 2. */ /* For branch Neq instruction it is 2*offset + 2. */
else if (IS_INSN_TYPE (BRANCH_NEQ_INS)) else if (IS_INSN_TYPE (BRANCH_NEQ_INS))
a->constant = 2 * a->constant + 2; a->constant = 2 * a->constant + 2;
else if (IS_INSN_TYPE (LD_STOR_INS_INC) else if (IS_INSN_TYPE (LD_STOR_INS_INC)
|| IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (LD_STOR_INS)
|| IS_INSN_TYPE (STOR_IMM_INS) || IS_INSN_TYPE (STOR_IMM_INS)
|| IS_INSN_TYPE (CSTBIT_INS)) || IS_INSN_TYPE (CSTBIT_INS))
{ {
op_index = instruction->flags & REVERSE_MATCH ? 0 : 1; op_index = instruction->flags & REVERSE_MATCH ? 0 : 1;
if (instruction->operands[op_index].op_type == abs16) if (instruction->operands[op_index].op_type == abs16)
a->constant |= 0xFFFF0000; a->constant |= 0xFFFF0000;
} }
func (stream, "%s", "0x"); func (stream, "%s", "0x");
number = (relative ? memaddr : 0) number = (relative ? memaddr : 0)
+ (sign_flag ? -a->constant : a->constant); + (sign_flag ? -a->constant : a->constant);
(*info->print_address_func) (number, info); (*info->print_address_func) (number, info);
break; break;
default: default: