From 5fac3f02edacfca458f7eeaaaa33a87e26e0e332 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 18 Mar 2022 16:33:51 +1030 Subject: [PATCH] PR28977 tc-i386.c internal error in parse_register PR 28977 * config/tc-i386.c (parse_register): Handle X_op not O_register as for a non-reg_section symbol. Simplify array bounds check. --- gas/config/tc-i386.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 1cc14feeccf..8ef71b62e42 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -12952,17 +12952,18 @@ parse_register (char *reg_string, char **end_op) { const expressionS *e = symbol_get_value_expression (symbolP); - know (e->X_op == O_register); - know (e->X_add_number >= 0 - && (valueT) e->X_add_number < i386_regtab_size); - r = i386_regtab + e->X_add_number; - if (!check_register (r)) + if (e->X_op == O_register + && (valueT) e->X_add_number < i386_regtab_size) { - as_bad (_("register '%s%s' cannot be used here"), - register_prefix, r->reg_name); - r = &bad_reg; + r = i386_regtab + e->X_add_number; + if (!check_register (r)) + { + as_bad (_("register '%s%s' cannot be used here"), + register_prefix, r->reg_name); + r = &bad_reg; + } + *end_op = input_line_pointer; } - *end_op = input_line_pointer; } *input_line_pointer = c; input_line_pointer = save; -- 2.30.2