gas: fix CBCOND diagnostics for invalid immediate operands.
authorJose E. Marchesi <jose.marchesi@oracle.com>
Fri, 25 Nov 2016 11:40:15 +0000 (03:40 -0800)
committerJose E. Marchesi <jose.marchesi@oracle.com>
Fri, 25 Nov 2016 11:40:15 +0000 (03:40 -0800)
This patch fixes two problems in the SPARC assembler:

- The diagnostic message

  Error: Illegal operands: Immediate value in cbcond is out of range.

  is incorrectly issued for non-CBCOND instructions that feature a
  simm5 immediate field, such as MPMUL, MONTMUL, etc.

- When an invalid immediate operand is used in a CBCOND
  instruction, two redundant error messages are issued to the
  user, the second due to a stale fixup (this happens since
  commit 85024cd8bcb93f4112470ecdbd6c10fc2aea724f).

Some diagnostic tests for the CBCOND instructions are also
included in the patch.

Tested in both sparc64-linux-gnu and sparcv9-linux-gnu targets.

gas/ChangeLog:

2016-11-25  Jose E. Marchesi  <jose.marchesi@oracle.com>

* config/tc-sparc.c (sparc_ip): Avoid emitting a cbcond error
messages for non-cbcond instructions.
* testsuite/gas/sparc/cbcond-diag.s: New file.
* testsuite/gas/sparc/cbcond-diag.l: Likewise.
* testsuite/gas/sparc/sparc.exp (gas_64_check): Run cbcond-diag tests.

gas/ChangeLog
gas/config/tc-sparc.c
gas/testsuite/gas/sparc/cbcond-diag.l [new file with mode: 0644]
gas/testsuite/gas/sparc/cbcond-diag.s [new file with mode: 0644]
gas/testsuite/gas/sparc/sparc.exp

index 2715fcb31200e36f53c3eef8b0338e05e4e3a57a..20301d099f69204249aee7ee4387714d1ac676f0 100644 (file)
@@ -1,3 +1,11 @@
+2016-11-25  Jose E. Marchesi  <jose.marchesi@oracle.com>
+
+       * config/tc-sparc.c (sparc_ip): Avoid emitting a cbcond error
+       messages for non-cbcond instructions.
+       * testsuite/gas/sparc/cbcond-diag.s: New file.
+       * testsuite/gas/sparc/cbcond-diag.l: Likewise.
+       * testsuite/gas/sparc/sparc.exp (gas_64_check): Run cbcond-diag tests.
+
 2016-11-23  Jose E. Marchesi  <jose.marchesi@oracle.com>
 
        * testsuite/gas/sparc/sparc.exp (gas_64_check): Make sure the
index edece05fe3ca3417a38ad8a2dee9fe4b067d6b60..52c1b24d6c4ec5ff482c2c0730fa80b38b7ccdaf 100644 (file)
@@ -2937,17 +2937,18 @@ sparc_ip (char *str, const struct sparc_opcode **pinsn)
                     handle the R_SPARC_5 immediate directly here so that
                     we don't need to add support for multiple relocations
                     in one instruction just yet.  */
-                 if (the_insn.reloc == BFD_RELOC_SPARC_5)
+                 if (the_insn.reloc == BFD_RELOC_SPARC_5
+                      && ((insn->match & OP(0x3)) == 0))
                    {
                      valueT val = the_insn.exp.X_add_number;
 
+                     the_insn.reloc = BFD_RELOC_NONE;
                      if (! in_bitfield_range (val, 0x1f))
                        {
                          error_message = _(": Immediate value in cbcond is out of range.");
                          goto error;
                        }
                      opcode |= val & 0x1f;
-                     the_insn.reloc = BFD_RELOC_NONE;
                    }
                }
 
diff --git a/gas/testsuite/gas/sparc/cbcond-diag.l b/gas/testsuite/gas/sparc/cbcond-diag.l
new file mode 100644 (file)
index 0000000..070c849
--- /dev/null
@@ -0,0 +1,3 @@
+.*cbcond-diag.s: Assembler messages:
+.*cbcond-diag.s:3: Error: .*Immediate value in cbcond is out of range\.
+.*cbcond-diag.s:4: Error: .*Immediate value in cbcond is out of range\.
diff --git a/gas/testsuite/gas/sparc/cbcond-diag.s b/gas/testsuite/gas/sparc/cbcond-diag.s
new file mode 100644 (file)
index 0000000..c963afb
--- /dev/null
@@ -0,0 +1,5 @@
+# Test error conditions in CBCOND instructions
+        .text
+        cwbe   %o1, +32,1f ! Overflow in the simm5 field.
+        cwbe   %o1, -17,1f ! Likewise.
+1:      nop
index 8311b7c1191de29d8476f752b71ef134c4815fbf..2b8e565a3efc113acc7938bb4b2a8e3999688b49 100644 (file)
@@ -53,6 +53,7 @@ if [istarget sparc*-*-*] {
         run_dump_test "pause"
         run_dump_test "save-args"
         run_dump_test "cbcond"
+        run_list_test "cbcond-diag" "-64"
         run_dump_test "cfr"
         run_dump_test "crypto"
         run_dump_test "edge"