RISC-V: Don't segfault for two regs in auipc or lui.

gas/
	PR gas/23954
	* config/tc-riscv.c (my_getSmallExpression): Expand comment for
	register support.  Set expr_end if parse a register.
	(riscv_ip) <'u'>: Break if imm_expr is not a symbol or constant.
	* testsuite/gas/riscv/auipc-parsing.d: New.
	* testsuite/gas/riscv/auipc-parsing.l: New.
	* testsuite/gas/riscv/auipc-parsing.s: New.
This commit is contained in:
Jim Wilson
2018-12-10 16:40:46 -08:00
parent 5136770380
commit 8970c0224e
5 changed files with 27 additions and 1 deletions

View File

@ -1,3 +1,13 @@
2018-12-10 Jim Wilson <jimw@sifive.com>
PR gas/23954
* config/tc-riscv.c (my_getSmallExpression): Expand comment for
register support. Set expr_end if parse a register.
(riscv_ip) <'u'>: Break if imm_expr is not a symbol or constant.
* testsuite/gas/riscv/auipc-parsing.d: New.
* testsuite/gas/riscv/auipc-parsing.l: New.
* testsuite/gas/riscv/auipc-parsing.s: New.
2018-12-09 H.J. Lu <hongjiu.lu@intel.com> 2018-12-09 H.J. Lu <hongjiu.lu@intel.com>
PR gas/23968 PR gas/23968

View File

@ -1263,11 +1263,15 @@ my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
unsigned crux_depth, str_depth, regno; unsigned crux_depth, str_depth, regno;
char *crux; char *crux;
/* First, check for integer registers. */ /* First, check for integer registers. No callers can accept a reg, but
we need to avoid accidentally creating a useless undefined symbol below,
if this is an instruction pattern that can't match. A glibc build fails
if this is removed. */
if (reg_lookup (&str, RCLASS_GPR, &regno)) if (reg_lookup (&str, RCLASS_GPR, &regno))
{ {
ep->X_op = O_register; ep->X_op = O_register;
ep->X_add_number = regno; ep->X_add_number = regno;
expr_end = str;
return 0; return 0;
} }
@ -1940,6 +1944,9 @@ branch:
*imm_reloc = BFD_RELOC_RISCV_HI20; *imm_reloc = BFD_RELOC_RISCV_HI20;
imm_expr->X_add_number <<= RISCV_IMM_BITS; imm_expr->X_add_number <<= RISCV_IMM_BITS;
} }
/* The 'u' format specifier must be a symbol or a constant. */
if (imm_expr->X_op != O_symbol && imm_expr->X_op != O_constant)
break;
s = expr_end; s = expr_end;
continue; continue;

View File

@ -0,0 +1,3 @@
#as:
#source: auipc-parsing.s
#error_output: auipc-parsing.l

View File

@ -0,0 +1,3 @@
.*: Assembler messages:
.*: Error: illegal operands `auipc x8,x9'
.*: Error: illegal operands `lui x10,x11'

View File

@ -0,0 +1,3 @@
# Don't accept a register for 'u' operands.
auipc x8,x9
lui x10,x11