[AArch64] Warn on load pair to same register
authorJiong Wang <jiong.wang@arm.com>
Wed, 19 Nov 2014 09:35:23 +0000 (09:35 +0000)
committerJiong Wang <jiong.wang@arm.com>
Wed, 19 Nov 2014 09:35:23 +0000 (09:35 +0000)
  2014-11-19  Ryan Mansfield  <rmansfield@qnx.com>

    * config/tc-aarch64.c (md_assemble): Call warn_unpredictable_ldst.
    (warn_unpredictable_ldst): New.

  2014-11-19  Ryan Mansfield <rmansfield@qnx.com>

    * gas/aarch64/diagnostic.s: Add new warnings test patterns.
    * gas/aarch64/diagnostic.l: Update expected diagnostic output.

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

index 943c239b21a8dd9588d0b2ea5ea8aea2af000a95..8341ee415a2cded01135f066c45457daad2772a1 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-19  Ryan Mansfield  <rmansfield@qnx.com>
+
+       * config/tc-aarch64.c (md_assemble): Call warn_unpredictable_ldst.
+       (warn_unpredictable_ldst): New.
+
 2014-11-18  Igor Zamyatin  <igor.zamyatin@intel.com>
 
        * config/tc-i386-intel.c (i386_operator): Remove last argument
index 8cecfd0646b4cd1b3551d029d171fd6da9e29868..41378f5deba9a7bc9aaa0fa653c0a76be1185fb0 100644 (file)
@@ -5490,6 +5490,40 @@ programmer_friendly_fixup (aarch64_instruction *instr)
   return TRUE;
 }
 
+/* Check for loads and stores that will cause unpredictable behavior */
+
+static void
+warn_unpredictable_ldst (aarch64_instruction *instr, char *str)
+{
+  aarch64_inst *base = &instr->base;
+  const aarch64_opcode *opcode = base->opcode;
+  const aarch64_opnd_info *opnds = base->operands;
+  switch (opcode->iclass)
+    {
+    case ldst_pos:
+    case ldst_imm9:
+    case ldst_unscaled:
+    case ldst_unpriv:
+      if (opnds[0].reg.regno == opnds[1].reg.regno
+         && opnds[1].addr.writeback)
+       as_warn (_("unpredictable register after writeback -- `%s'"), str);
+      break;
+    case ldstpair_off:
+    case ldstnapair_offs:
+    case ldstpair_indexed:
+      if ((opnds[0].reg.regno == opnds[2].reg.regno
+           || opnds[1].reg.regno == opnds[2].reg.regno)
+         && opnds[2].addr.writeback)
+           as_warn (_("unpredictable register after writeback -- `%s'"), str);
+      if ((opcode->opcode & (1 << 22))
+         && opnds[0].reg.regno == opnds[1].reg.regno)
+           as_warn (_("unpredictable load of register pair -- `%s'"), str);
+      break;
+    default:
+      break;
+    }
+}
+
 /* A wrapper function to interface with libopcodes on encoding and
    record the error message if there is any.
 
@@ -5622,6 +5656,8 @@ md_assemble (char *str)
              return;
            }
 
+         warn_unpredictable_ldst (&inst, str);
+
          if (inst.reloc.type == BFD_RELOC_UNUSED
              || !inst.reloc.need_libopcodes_p)
            output_inst (NULL);
index 40989b3d4363794bb0cd1de7b0035b287bfb72fb..51119a24f90a3c9bc843f087da114299e73c85aa 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-19  Ryan Mansfield  <rmansfield@qnx.com>
+
+       * gas/aarch64/diagnostic.s: Add new warnings test patterns.
+       * gas/aarch64/diagnostic.l: Update expected diagnostic output.
+
 2014-11-18  Igor Zamyatin  <igor.zamyatin@intel.com>
 
        * gas/i386/x86-64-mpx-branch-1.d: Don't use *_BND relocations.
index 322e3c0cfd22be4e84adbe2217fa73f8c7ede448..d5fdba8c17d313a667083580acfa08c5c66775ff 100644 (file)
 [^:]*:109: Error: operand 5 should be an integer register -- `sys #0,c0,c0,#0,kk'
 [^:]*:110: Error: unexpected comma before the omitted optional operand at operand 5 -- `sys #0,c0,c0,#0,'
 [^:]*:112: Error: selected processor does not support `casp w0,w1,w2,w3,\[x4\]'
+[^:]*:115: Warning: unpredictable load of register pair -- `ldp x0,x0,\[sp\]'
+[^:]*:116: Warning: unpredictable load of register pair -- `ldp d0,d0,\[sp\]'
+[^:]*:117: Warning: unpredictable load of register pair -- `ldp x0,x0,\[sp\],#16'
+[^:]*:118: Warning: unpredictable load of register pair -- `ldnp x0,x0,\[sp\]'
+[^:]*:121: Warning: unpredictable register after writeback -- `ldr x0,\[x0,#8\]!'
+[^:]*:122: Warning: unpredictable register after writeback -- `str x0,\[x0,#8\]!'
+[^:]*:123: Warning: unpredictable register after writeback -- `str x1,\[x1\],#8'
+[^:]*:124: Warning: unpredictable register after writeback -- `stp x0,x1,\[x0,#16\]!'
+[^:]*:125: Warning: unpredictable register after writeback -- `ldp x0,x1,\[x1\],#16'
index b82ac8b254d924d3e7b797946bfb110e11c29e3d..88001dae8315a0420d93a8d88f14dcf94421c8be 100644 (file)
        sys     #0, c0, c0, #0,
 
        casp w0,w1,w2,w3,[x4]
+
+       # test warning of unpredictable load pairs
+       ldp     x0, x0, [sp]
+       ldp     d0, d0, [sp]
+       ldp     x0, x0, [sp], #16
+       ldnp    x0, x0, [sp]
+
+       # test warning of unpredictable writeback
+       ldr     x0, [x0, #8]!
+       str     x0, [x0, #8]!
+       str     x1, [x1], #8
+       stp     x0, x1, [x0, #16]!
+       ldp     x0, x1, [x1], #16