From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1386) id D9F893858413; Fri, 28 Apr 2023 06:20:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D9F893858413 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Jan Beulich To: bfd-cvs@sourceware.org Subject: [binutils-gdb] gas: move shift count check X-Act-Checkin: binutils-gdb X-Git-Author: Jan Beulich X-Git-Refname: refs/heads/master X-Git-Oldrev: 1f506c06effab6606e9ca801aa8f9217e9794c35 X-Git-Newrev: 2b6132c33c27ea193288507e71d66498614af4f6 Message-Id: <20230428062034.D9F893858413@sourceware.org> Date: Fri, 28 Apr 2023 06:20:34 +0000 (GMT) X-BeenThere: binutils-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 28 Apr 2023 06:20:35 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D2b6132c33c27= ea193288507e71d66498614af4f6 commit 2b6132c33c27ea193288507e71d66498614af4f6 Author: Jan Beulich Date: Fri Apr 28 08:19:53 2023 +0200 gas: move shift count check =20 ... out of mainline code, grouping together the two case labels. This then also make more obvious that the comment there applies to both forms of shifts. Diff: --- gas/expr.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/gas/expr.c b/gas/expr.c index 680ec13b192..05b210ba98b 100644 --- a/gas/expr.c +++ b/gas/expr.c @@ -1954,14 +1954,6 @@ expr (int rankarg, /* Larger # is higher rank. */ as_warn (_("division by zero")); v =3D 1; } - if ((valueT) v >=3D sizeof(valueT) * CHAR_BIT - && (op_left =3D=3D O_left_shift || op_left =3D=3D O_right_shift)) - { - as_warn_value_out_of_range (_("shift count"), v, 0, - sizeof(valueT) * CHAR_BIT - 1, - NULL, 0); - resultP->X_add_number =3D v =3D 0; - } switch (op_left) { default: goto general; @@ -1974,6 +1966,7 @@ expr (int rankarg, /* Larger # is higher rank. */ case O_divide: resultP->X_add_number /=3D v; break; case O_modulus: resultP->X_add_number %=3D v; break; case O_left_shift: + case O_right_shift: /* We always use unsigned shifts. According to the ISO C standard, left shift of a signed type having a negative value is undefined behaviour, and right @@ -1982,12 +1975,19 @@ expr (int rankarg, /* Larger # is higher rank. */ when the result overflows is also undefined behaviour. So don't trigger ubsan warnings or rely on characteristics of the compiler. */ - resultP->X_add_number - =3D (valueT) resultP->X_add_number << (valueT) v; - break; - case O_right_shift: - resultP->X_add_number - =3D (valueT) resultP->X_add_number >> (valueT) v; + if ((valueT) v >=3D sizeof (valueT) * CHAR_BIT) + { + as_warn_value_out_of_range (_("shift count"), v, 0, + sizeof (valueT) * CHAR_BIT - 1, + NULL, 0); + resultP->X_add_number =3D 0; + } + else if (op_left =3D=3D O_left_shift) + resultP->X_add_number + =3D (valueT) resultP->X_add_number << (valueT) v; + else + resultP->X_add_number + =3D (valueT) resultP->X_add_number >> (valueT) v; break; case O_bit_inclusive_or: resultP->X_add_number |=3D v; break; case O_bit_or_not: resultP->X_add_number |=3D ~v; break;