From 973773de93a1af858e391ab413c47323b0869012 Mon Sep 17 00:00:00 2001 From: Ilya Leoshkevich Date: Mon, 16 May 2022 21:58:55 +0200 Subject: [PATCH] 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. --- 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.30.2