aboutsummaryrefslogtreecommitdiff
path: root/gas/config
diff options
context:
space:
mode:
authorJim Wilson <jimw@sifive.com>2018-03-16 10:03:57 -0700
committerJim Wilson <jimw@sifive.com>2018-03-16 10:03:57 -0700
commitca2fd32c5508ff1b68781ba5b82e6cdbf9ca100a (patch)
tree09035890c27d97b43afa9a826ec608ac7d8ed30e /gas/config
parent03afa6ef8ac9e5acfa68b1005aec6756eaa1d093 (diff)
downloadgdb-ca2fd32c5508ff1b68781ba5b82e6cdbf9ca100a.zip
gdb-ca2fd32c5508ff1b68781ba5b82e6cdbf9ca100a.tar.gz
gdb-ca2fd32c5508ff1b68781ba5b82e6cdbf9ca100a.tar.bz2
RISC-V: Emit better warning for unknown CSR.
gas/ * config/tc-riscv.c (check_absolute_expr): Expand comment. New parameter maybe_csr. If maybe_csr and O_symbol, print CSR name. (riscv_ip): Add new argument to check_absolute_expr calls. * testsuite/gas/riscv/bad-csr.d: New. * testsuite/gas/riscv/bad-csr.l: New. * testsuite/gas/riscv/bad-csr.s: New.
Diffstat (limited to 'gas/config')
-rw-r--r--gas/config/tc-riscv.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
index 454f283..f657023 100644
--- a/gas/config/tc-riscv.c
+++ b/gas/config/tc-riscv.c
@@ -993,13 +993,18 @@ normalize_constant_expr (expressionS *ex)
- 0x80000000);
}
-/* Fail if an expression is not a constant. */
+/* Fail if an expression EX is not a constant. IP is the instruction using EX.
+ MAYBE_CSR is true if the symbol may be an unrecognized CSR name. */
static void
-check_absolute_expr (struct riscv_cl_insn *ip, expressionS *ex)
+check_absolute_expr (struct riscv_cl_insn *ip, expressionS *ex,
+ bfd_boolean maybe_csr)
{
if (ex->X_op == O_big)
as_bad (_("unsupported large constant"));
+ else if (maybe_csr && ex->X_op == O_symbol)
+ as_bad (_("unknown CSR `%s'"),
+ S_GET_NAME (ex->X_add_symbol));
else if (ex->X_op != O_constant)
as_bad (_("Instruction %s requires absolute expression"),
ip->insn_mo->name);
@@ -1744,7 +1749,7 @@ rvc_lui:
case '<': /* Shift amount, 0 - 31. */
my_getExpression (imm_expr, s);
- check_absolute_expr (ip, imm_expr);
+ check_absolute_expr (ip, imm_expr, FALSE);
if ((unsigned long) imm_expr->X_add_number > 31)
as_bad (_("Improper shift amount (%lu)"),
(unsigned long) imm_expr->X_add_number);
@@ -1755,7 +1760,7 @@ rvc_lui:
case '>': /* Shift amount, 0 - (XLEN-1). */
my_getExpression (imm_expr, s);
- check_absolute_expr (ip, imm_expr);
+ check_absolute_expr (ip, imm_expr, FALSE);
if ((unsigned long) imm_expr->X_add_number >= xlen)
as_bad (_("Improper shift amount (%lu)"),
(unsigned long) imm_expr->X_add_number);
@@ -1766,7 +1771,7 @@ rvc_lui:
case 'Z': /* CSRRxI immediate. */
my_getExpression (imm_expr, s);
- check_absolute_expr (ip, imm_expr);
+ check_absolute_expr (ip, imm_expr, FALSE);
if ((unsigned long) imm_expr->X_add_number > 31)
as_bad (_("Improper CSRxI immediate (%lu)"),
(unsigned long) imm_expr->X_add_number);
@@ -1781,7 +1786,7 @@ rvc_lui:
else
{
my_getExpression (imm_expr, s);
- check_absolute_expr (ip, imm_expr);
+ check_absolute_expr (ip, imm_expr, TRUE);
if ((unsigned long) imm_expr->X_add_number > 0xfff)
as_bad (_("Improper CSR address (%lu)"),
(unsigned long) imm_expr->X_add_number);