]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
loongarch gas resolving constant expressions
authorAlan Modra <amodra@gmail.com>
Tue, 15 Apr 2025 21:42:46 +0000 (07:12 +0930)
committerAlan Modra <amodra@gmail.com>
Fri, 18 Apr 2025 09:06:39 +0000 (18:36 +0930)
The test added in commit 4fe96ddaf614 results in an asan complaint:
loongarch-parse.y:225:16: runtime error: left shift of negative value -1
To avoid the complaint, perform left shifts as unsigned (which gives
the same result on 2's complement machines).  Do the same for
addition, subtraction and multiplication.  Furthermore, warn on
divide/modulus by zero.

gas/config/loongarch-parse.y

index 97055fe42c3dd2961da130ef1c52017b703cfeca..b75040c14b15bd07649ed804a245a2ec8980fcb2 100644 (file)
@@ -207,29 +207,41 @@ emit_bin (int op)
       switch (op)
        {
        case '*':
-         opr1 = opr1 * opr2;
+         opr1 = (valueT) opr1 * (valueT) opr2;
          break;
        case '/':
-         opr1 = opr1 / opr2;
+         if (opr2 == 0)
+           {
+             as_warn (_("Divide by zero!"));
+             opr1 = 0;
+           }
+         else
+           opr1 = opr1 / opr2;
          break;
        case '%':
-         opr1 = opr1 % opr2;
+         if (opr2 == 0)
+           {
+             as_warn (_("Divide by zero!"));
+             opr1 = 0;
+           }
+         else
+           opr1 = opr1 % opr2;
          break;
        case '+':
-         opr1 = opr1 + opr2;
+         opr1 = (valueT) opr1 + (valueT) opr2;
          break;
        case '-':
-         opr1 = opr1 - opr2;
+         opr1 = (valueT) opr1 - (valueT) opr2;
          break;
        case LEFT_OP:
-         opr1 = opr1 << opr2;
+         opr1 = (valueT) opr1 << opr2;
          break;
        case RIGHT_OP:
          if (opr1 < 0)
-           as_warn(_("Right shift of negative numbers may be changed "
-                 "from arithmetic right shift to logical right shift!"));
-         /* Algorithm right shift.  */
-         opr1 = (offsetT)opr1 >> (offsetT)opr2;
+           as_warn (_("Right shift of negative numbers may be changed "
+                      "from arithmetic right shift to logical right shift!"));
+         /* Arithmetic right shift.  */
+         opr1 = opr1 >> opr2;
          break;
        case '<':
          opr1 = opr1 < opr2;