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>
* 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);
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: