[Patch AArch64] Warn on unpredictable stlxrb , stlxrh and stlxr cases.
authorRamana Radhakrishnan <ramana.radhakrishnan@arm.com>
Fri, 29 Jun 2018 12:06:05 +0000 (13:06 +0100)
committerRamana Radhakrishnan <ramana.radhakrishnan@arm.com>
Fri, 29 Jun 2018 12:06:05 +0000 (13:06 +0100)
A recent case in golang highlighted that gas wasn't warning on these
unpredictable cases in the architecture. Fixed thusly.

I need to audit gcc to make sure we have early clobbers on the
patterns but that's a separate patch.

Tested aarch64-none-elf and gas

Ok ?

Ramana

2018-06-29 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>

        * config/tc-aarch64.c (warn_unpredictable_ldst): Add
        unpredictable cases for ldxp, stlxrb, stlxrh, stlxr.  *
        testsuite/gas/aarch64/diagnostic.s: New tests.  *
        testsuite/gas/aarch64/diagnostic.l: Adjust.

gas/ChangeLog
gas/config/tc-aarch64.c
gas/testsuite/gas/aarch64/diagnostic.l
gas/testsuite/gas/aarch64/diagnostic.s

index 1ad8cc5c9c1eb3e6bccdae5ac6eabb2aa4cb00b8..e0cfe04e179383735fac5bf68a98dfde7360b4c2 100644 (file)
@@ -1,3 +1,10 @@
+2018-06-29  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
+
+       * config/tc-aarch64.c (warn_unpredictable_ldst): Add unpredictable
+        cases for ldxp, stlxrb, stlxrh, stlxr.
+        * testsuite/gas/aarch64/diagnostic.s: New tests.
+        * testsuite/gas/aarch64/diagnostic.l: Adjust.
+
 2018-06-29  Tamar Christina  <tamar.christina@arm.com>
 
        PR binutils/23192
index f8b21520186b0e466210ea53599f0ac90737873d..31985963e314cbe772afbd190d4b0ca6e9608466 100644 (file)
@@ -6705,6 +6705,22 @@ warn_unpredictable_ldst (aarch64_instruction *instr, char *str)
          && opnds[0].reg.regno == opnds[1].reg.regno)
            as_warn (_("unpredictable load of register pair -- `%s'"), str);
       break;
+
+    case ldstexcl:
+      /* It is unpredictable if the destination and status registers are the
+        same.  */
+      if ((aarch64_get_operand_class (opnds[0].type)
+          == AARCH64_OPND_CLASS_INT_REG)
+         && (aarch64_get_operand_class (opnds[1].type)
+             == AARCH64_OPND_CLASS_INT_REG)
+         && (opnds[0].reg.regno == opnds[1].reg.regno
+             || opnds[0].reg.regno == opnds[2].reg.regno))
+       as_warn (_("unpredictable: identical transfer and status registers"
+                  " --`%s'"),
+                str);
+
+      break;
+
     default:
       break;
     }
index 00bb512394b3c4570b21a358c23204b0e5c60bfb..6aae306a915d48ad8215d9abb00d7016132702f2 100644 (file)
 [^:]*:300: Warning: ignoring redefinition of register alias 'ip1'
 [^:]*:301: Warning: ignoring redefinition of register alias 'lr'
 [^:]*:302: Warning: ignoring redefinition of register alias 'fp'
+[^:]*:304: Warning: unpredictable: identical transfer and status registers --`stlxrb w26,w26,\[x0\]'
+[^:]*:305: Warning: unpredictable: identical transfer and status registers --`stlxrh w26,w26,\[x1\]'
+[^:]*:306: Warning: unpredictable: identical transfer and status registers --`stlxr w26,w26,\[x2\]'
+[^:]*:307: Warning: unpredictable: identical transfer and status registers --`stlxrb w26,w27,\[x26\]'
+[^:]*:308: Warning: unpredictable: identical transfer and status registers --`stlxrh w26,w27,\[x26\]'
+[^:]*:309: Warning: unpredictable: identical transfer and status registers --`stlxr w26,w27,\[x26\]'
+[^:]*:310: Warning: unpredictable: identical transfer and status registers --`stlxr w26,x27,\[x26\]'
+[^:]*:311: Warning: unpredictable: identical transfer and status registers --`stlxr w26,x26,\[x3\]'
+[^:]*:312: Warning: unpredictable: identical transfer and status registers --`ldxp x26,x26,\[x5\]'
+[^:]*:313: Warning: unpredictable: identical transfer and status registers --`ldxp x26,x1,\[x26\]'
index a62327dabb8abdbba2830dc3bc5d3e2cfc3acb41..c18c48e11694d96177bbe0b7690400fa580d3cf8 100644 (file)
        ip1     .req    x1
        lr      .req    x2
        fp      .req    x3
+
+       stlxrb  w26, w26, [x0]
+       stlxrh  w26, w26, [x1]
+       stlxr   w26, w26, [x2]
+       stlxrb  w26, w27, [x26]
+       stlxrh  w26, w27, [x26]
+       stlxr   w26, w27, [x26]
+       stlxr   w26, x27, [x26]
+       stlxr   w26, x26, [x3]
+       ldxp    x26, x26, [x5]
+       ldxp    x26, x1, [x26]