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 85024cd8bc
).
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.
This commit is contained in:
parent
ec8f768821
commit
65d1cff97c
|
@ -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>
|
2016-11-23 Jose E. Marchesi <jose.marchesi@oracle.com>
|
||||||
|
|
||||||
* testsuite/gas/sparc/sparc.exp (gas_64_check): Make sure the
|
* testsuite/gas/sparc/sparc.exp (gas_64_check): Make sure the
|
||||||
|
|
|
@ -2937,17 +2937,18 @@ sparc_ip (char *str, const struct sparc_opcode **pinsn)
|
||||||
handle the R_SPARC_5 immediate directly here so that
|
handle the R_SPARC_5 immediate directly here so that
|
||||||
we don't need to add support for multiple relocations
|
we don't need to add support for multiple relocations
|
||||||
in one instruction just yet. */
|
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;
|
valueT val = the_insn.exp.X_add_number;
|
||||||
|
|
||||||
|
the_insn.reloc = BFD_RELOC_NONE;
|
||||||
if (! in_bitfield_range (val, 0x1f))
|
if (! in_bitfield_range (val, 0x1f))
|
||||||
{
|
{
|
||||||
error_message = _(": Immediate value in cbcond is out of range.");
|
error_message = _(": Immediate value in cbcond is out of range.");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
opcode |= val & 0x1f;
|
opcode |= val & 0x1f;
|
||||||
the_insn.reloc = BFD_RELOC_NONE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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\.
|
|
@ -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
|
|
@ -53,6 +53,7 @@ if [istarget sparc*-*-*] {
|
||||||
run_dump_test "pause"
|
run_dump_test "pause"
|
||||||
run_dump_test "save-args"
|
run_dump_test "save-args"
|
||||||
run_dump_test "cbcond"
|
run_dump_test "cbcond"
|
||||||
|
run_list_test "cbcond-diag" "-64"
|
||||||
run_dump_test "cfr"
|
run_dump_test "cfr"
|
||||||
run_dump_test "crypto"
|
run_dump_test "crypto"
|
||||||
run_dump_test "edge"
|
run_dump_test "edge"
|
||||||
|
|
Loading…
Reference in New Issue