This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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;
 	}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]