From 65d1cff97c066e4399a175ef7294a5343c0b94d1 Mon Sep 17 00:00:00 2001 From: "Jose E. Marchesi" Date: Fri, 25 Nov 2016 03:40:15 -0800 Subject: [PATCH] gas: fix CBCOND diagnostics for invalid immediate operands. 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 * 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 | 8 ++++++++ gas/config/tc-sparc.c | 5 +++-- gas/testsuite/gas/sparc/cbcond-diag.l | 3 +++ gas/testsuite/gas/sparc/cbcond-diag.s | 5 +++++ gas/testsuite/gas/sparc/sparc.exp | 1 + 5 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 gas/testsuite/gas/sparc/cbcond-diag.l create mode 100644 gas/testsuite/gas/sparc/cbcond-diag.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 2715fcb312..20301d099f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2016-11-25 Jose E. Marchesi + + * 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 * testsuite/gas/sparc/sparc.exp (gas_64_check): Make sure the diff --git a/gas/config/tc-sparc.c b/gas/config/tc-sparc.c index edece05fe3..52c1b24d6c 100644 --- a/gas/config/tc-sparc.c +++ b/gas/config/tc-sparc.c @@ -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 index 0000000000..070c849735 --- /dev/null +++ b/gas/testsuite/gas/sparc/cbcond-diag.l @@ -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 index 0000000000..c963afb3e3 --- /dev/null +++ b/gas/testsuite/gas/sparc/cbcond-diag.s @@ -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 diff --git a/gas/testsuite/gas/sparc/sparc.exp b/gas/testsuite/gas/sparc/sparc.exp index 8311b7c119..2b8e565a3e 100644 --- a/gas/testsuite/gas/sparc/sparc.exp +++ b/gas/testsuite/gas/sparc/sparc.exp @@ -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"