This is the mail archive of the
binutils-cvs@sourceware.org
mailing list for the binutils project.
[binutils-gdb] MIPS16/GAS: Improve non-constant operand error diagnostics
- From: Maciej W.Rozycki <macro at sourceware dot org>
- To: bfd-cvs at sourceware dot org
- Date: 15 May 2017 13:25:35 -0000
- Subject: [binutils-gdb] MIPS16/GAS: Improve non-constant operand error diagnostics
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=602b88e3ab372729b53d130068f069dd363032db
commit 602b88e3ab372729b53d130068f069dd363032db
Author: Maciej W. Rozycki <macro@imgtec.com>
Date: Mon May 15 13:19:20 2017 +0100
MIPS16/GAS: Improve non-constant operand error diagnostics
Improve operand error diagnostics for non-constant expressions used for
a 16-bit immediate, making the message more descriptive and indicating
the offending operand, e.g.:
foo.s:1: Error: invalid operands `lui $2,foo-bar'
will show as:
foo.s:1: Error: operand 2 must be constant `lui $2,foo-bar'
This case does not currently trigger however, for two reasons.
First, for regular MIPS and microMIPS assembly in the case of no match
caused by `match_int_operand' here, the function is always called again
from `mips_ip' via `match_insns', `match_insn' and then `match_operand'
for the same opcode table's entry with `lax_match' set to TRUE, in which
case the attempt to match succeeds and no error is issued.
Second, in the case of MIPS16 assembly no call to `match_int_operand' is
made at all for 16-bit immediates, because such immediates are currently
only matched with extensible instructions, and these are handled in
`match_mips16_insn' via `match_expression' directly rather than via
`match_operand'.
This will change for MIPS16 code with MIPS16e2 support introduced, where
non-extensible instructions accepting 16-bit immediates will be added,
so make the case work well right from the start.
gas/
* config/tc-mips.c (match_int_operand): Call
`match_not_constant' before returning failure for a non-constant
16-bit immediate conditionally allowed.
Diff:
---
gas/ChangeLog | 6 ++++++
gas/config/tc-mips.c | 5 ++++-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/gas/ChangeLog b/gas/ChangeLog
index afbb20e..0952daf 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,11 @@
2017-05-15 Maciej W. Rozycki <macro@imgtec.com>
+ * config/tc-mips.c (match_int_operand): Call
+ `match_not_constant' before returning failure for a non-constant
+ 16-bit immediate conditionally allowed.
+
+2017-05-15 Maciej W. Rozycki <macro@imgtec.com>
+
* config/tc-mips.c (match_const_int): Call `match_out_of_range'
rather than `match_not_constant' for unrelocated operands
retrieved as an `O_big' expression.
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index 9fde462..3dc6a53 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -5082,7 +5082,10 @@ match_int_operand (struct mips_arg_info *arg,
/* Accept non-constant operands if no later alternative matches,
leaving it for the caller to process. */
if (!arg->lax_match)
- return FALSE;
+ {
+ match_not_constant (arg);
+ return FALSE;
+ }
offset_reloc[0] = BFD_RELOC_LO16;
return TRUE;
}