ubsan: d30v: left shift cannot be represented in type 'int'

* d30v-dis.c (print_insn): Avoid signed overflow in left shift.
This commit is contained in:
Alan Modra 2020-01-01 18:46:43 +10:30
parent 991fb595e3
commit 2e98c6c5c5
2 changed files with 10 additions and 12 deletions

View File

@ -1,3 +1,7 @@
2020-01-04 Alan Modra <amodra@gmail.com>
* d30v-dis.c (print_insn): Avoid signed overflow in left shift.
2020-01-03 Jan Beulich <jbeulich@suse.com>
* aarch64-tbl.h (aarch64_opcode_table): Use

View File

@ -271,14 +271,10 @@ print_insn (struct disassemble_info *info,
/* IMM6S3 is unsigned. */
if (oper->flags & OPERAND_SIGNED || bits == 32)
{
long max;
max = (1 << (bits - 1));
if (val & max)
unsigned int sign = 1u << (bits - 1);
if (val & sign)
{
if (bits == 32)
val = -val;
else
val = -val & ((1 << bits) - 1);
val = -val & (sign + sign - 1);
neg = 1;
}
}
@ -303,13 +299,11 @@ print_insn (struct disassemble_info *info,
{
if (oper->flags & OPERAND_SIGNED)
{
int max = (1 << (bits - 1));
unsigned int sign = 1u << (bits - 1);
if (val & max)
if (val & sign)
{
val = -val;
if (bits < 32)
val &= ((1 << bits) - 1);
val = -val & (sign + sign - 1);
(*info->fprintf_func) (info->stream, "-");
}
}