IBM zSystems: Fix left-shifting negative PCRel32 values (PR gas/29152)

s390_insert_operand ()'s val, min and max are encoded PCRel32 values
and need to be left-shifted by 1 before being shown to the user.
Left-shifting negative values is undefined behavior in C, but the
current code does not try to prevent it, causing UBSan to complain.

Fix by casting the values to their unsigned equivalents before
shifting.
This commit is contained in:
Ilya Leoshkevich
2022-05-16 21:58:55 +02:00
committed by Andreas Krebbel
parent 187075ebbc
commit 973773de93

View File

@ -622,9 +622,9 @@ s390_insert_operand (unsigned char *insn,
if (operand->flags & S390_OPERAND_PCREL)
{
val <<= 1;
min <<= 1;
max <<= 1;
val = (offsetT) ((addressT) val << 1);
min = (offsetT) ((addressT) min << 1);
max = (offsetT) ((addressT) max << 1);
}
if (file == (char *) NULL)
as_bad (err, (int64_t) val, (int64_t) min, (int64_t) max);