diff options
author | Maciej W. Rozycki <macro@imgtec.com> | 2017-05-15 13:17:18 +0100 |
---|---|---|
committer | Maciej W. Rozycki <macro@imgtec.com> | 2017-05-15 13:57:09 +0100 |
commit | c96425c560d640df9c416ff4e6a8c49c1f3b1119 (patch) | |
tree | 88912e125b86687f549c886d5042bf262463a635 /gas/config | |
parent | 1a7bf198b67c4b99e9adeaeba38c6874ec354c12 (diff) | |
download | gdb-c96425c560d640df9c416ff4e6a8c49c1f3b1119.zip gdb-c96425c560d640df9c416ff4e6a8c49c1f3b1119.tar.gz gdb-c96425c560d640df9c416ff4e6a8c49c1f3b1119.tar.bz2 |
MIPS/GAS: Improve bignum operand error diagnostics
Improve bignum operand error diagnostics for cases where a constant
would be accepted and report them as range errors, also indicating the
offending operand and instruction, e.g.:
$ cat bignum.s
addiu $2, 0x10000000000000000
break 0x10000000000000000
$ as -o bignum.o bignum.s
bignum.s:1: Error: bignum invalid
bignum.s:2: Error: operand 1 must be constant `break 0x10000000000000000'
$
now show as:
$ as -o bignum.o bignum.s
bignum.s:1: Error: operand 2 out of range `addiu $2,0x10000000000000000'
bignum.s:2: Error: operand 1 out of range `break 0x10000000000000000'
$
gas/
* 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.
(match_int_operand): Call `match_out_of_range' for relocatable
operands retrieved as an `O_big' expression.
(match_mips16_insn): Call `match_out_of_range' for relaxable
operands retrieved as an `O_big' expression.
* testsuite/gas/mips/addiu-error.d: New test.
* testsuite/gas/mips/mips16@addiu-error.d: New test.
* testsuite/gas/mips/micromips@addiu-error.d: New test.
* testsuite/gas/mips/break-error.d: New test.
* testsuite/gas/mips/lui-1.l: Adjust error message.
* testsuite/gas/mips/addiu-error.l: New stderr output.
* testsuite/gas/mips/mips16@addiu-error.l: New stderr output.
* testsuite/gas/mips/micromips@addiu-error.l: New stderr output.
* testsuite/gas/mips/break-error.l: New stderr output.
* testsuite/gas/mips/addiu-error.s: New test source.
* testsuite/gas/mips/break-error.s: New test source.
* testsuite/gas/mips/mips.exp: Run the new tests.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-mips.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index ac4fefd..9fde462 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -4856,7 +4856,10 @@ match_const_int (struct mips_arg_info *arg, offsetT *value) *value = ex.X_add_number; else { - match_not_constant (arg); + if (r[0] == BFD_RELOC_UNUSED && ex.X_op == O_big) + match_out_of_range (arg); + else + match_not_constant (arg); return FALSE; } return TRUE; @@ -5062,6 +5065,12 @@ match_int_operand (struct mips_arg_info *arg, if (!match_expression (arg, &offset_expr, offset_reloc)) return FALSE; + if (offset_expr.X_op == O_big) + { + match_out_of_range (arg); + return FALSE; + } + if (offset_reloc[0] != BFD_RELOC_UNUSED) /* Relocation operators were used. Accept the argument and leave the relocation value in offset_expr and offset_relocs @@ -8261,6 +8270,12 @@ match_mips16_insn (struct mips_cl_insn *insn, const struct mips_opcode *opcode, return FALSE; } + if (offset_expr.X_op == O_big) + { + match_out_of_range (&arg); + return FALSE; + } + relax_char = c; continue; } |