ubsan errors when 32-bit bfd

A shift count exceeding the size of the value is undefined behaviour,
and so is negating a signed LONG_MIN.

	* config/tc-z80.c (signed_overflow, unsigned_overflow): Avoid UB.
This commit is contained in:
Alan Modra 2021-06-18 22:27:01 +09:30
parent 43f71bc5df
commit 03e689aaac
2 changed files with 7 additions and 3 deletions

View File

@ -1,3 +1,7 @@
2021-06-19 Alan Modra <amodra@gmail.com>
* config/tc-z80.c (signed_overflow, unsigned_overflow): Avoid UB.
2021-06-19 Alan Modra <amodra@gmail.com>
* testsuite/gas/ppc/raw.s: Use 0 as pli constant.

View File

@ -3703,14 +3703,14 @@ md_assemble (char *str)
static int
signed_overflow (signed long value, unsigned bitsize)
{
signed long max = (signed long)(1UL << (bitsize-1));
return value < -max || value >= max;
signed long max = (signed long) ((1UL << (bitsize - 1)) - 1);
return value < -max - 1 || value > max;
}
static int
unsigned_overflow (unsigned long value, unsigned bitsize)
{
return (value >> bitsize) != 0;
return value >> (bitsize - 1) >> 1 != 0;
}
static int