[PATCH] IBM zSystems: Fix left-shifting negative PCRel32 values (PR gas/29152)
Ilya Leoshkevich
iii@linux.ibm.com
Mon May 16 18:35:23 GMT 2022
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.
---
gas/config/tc-s390.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/gas/config/tc-s390.c b/gas/config/tc-s390.c
index fb452f8a986..04a3c059c91 100644
--- a/gas/config/tc-s390.c
+++ b/gas/config/tc-s390.c
@@ -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);
--
2.35.1
More information about the Binutils
mailing list