resolve gas shift expressions with large exponents to zero

* expr.c (resolve_expression <O_left_shift, O_right_shift>): Resolve
	shifts exceeding bits in a valueT to zero.
This commit is contained in:
Alan Modra
2023-01-26 18:44:51 +10:30
parent c37de29815
commit 44a178cc69

View File

@@ -2320,8 +2320,18 @@ resolve_expression (expressionS *expressionP)
return 0;
left = (offsetT) left % (offsetT) right;
break;
case O_left_shift: left <<= right; break;
case O_right_shift: left >>= right; break;
case O_left_shift:
if (right >= sizeof (left) * CHAR_BIT)
left = 0;
else
left <<= right;
break;
case O_right_shift:
if (right >= sizeof (left) * CHAR_BIT)
left = 0;
else
left >>= right;
break;
case O_bit_inclusive_or: left |= right; break;
case O_bit_or_not: left |= ~right; break;
case O_bit_exclusive_or: left ^= right; break;