mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-25 04:49:54 +08:00
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:
@ -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
|
||||||
|
@ -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, ®no))
|
if (reg_lookup (&str, RCLASS_GPR, ®no))
|
||||||
{
|
{
|
||||||
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;
|
||||||
|
|
||||||
|
3
gas/testsuite/gas/riscv/auipc-parsing.d
Normal file
3
gas/testsuite/gas/riscv/auipc-parsing.d
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#as:
|
||||||
|
#source: auipc-parsing.s
|
||||||
|
#error_output: auipc-parsing.l
|
3
gas/testsuite/gas/riscv/auipc-parsing.l
Normal file
3
gas/testsuite/gas/riscv/auipc-parsing.l
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
.*: Assembler messages:
|
||||||
|
.*: Error: illegal operands `auipc x8,x9'
|
||||||
|
.*: Error: illegal operands `lui x10,x11'
|
3
gas/testsuite/gas/riscv/auipc-parsing.s
Normal file
3
gas/testsuite/gas/riscv/auipc-parsing.s
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Don't accept a register for 'u' operands.
|
||||||
|
auipc x8,x9
|
||||||
|
lui x10,x11
|
Reference in New Issue
Block a user