gas: make fix_new_exp()'s "exp" parameter const

This really should be only an input; in particular it looks bogus that
O_add expressions are even altered. That altering and the recursion are
even pointless: Once expanding what the inner call would do (with
O_symbol) it becomes clear that this is no different than the default
case. Simplify the code accordingly, retaining the comment.
This commit is contained in:
Jan Beulich 2024-10-29 08:08:29 +01:00
parent 641cf0e2c0
commit c1a4b47e2a
2 changed files with 4 additions and 16 deletions

View File

@ -238,7 +238,7 @@ fixS *
fix_new_exp (fragS *frag, /* Which frag? */
unsigned long where, /* Where in that frag? */
unsigned long size, /* 1, 2, or 4 usually. */
expressionS *exp, /* Expression. */
const expressionS *exp, /* Expression. */
int pcrel, /* TRUE if PC-relative relocation. */
RELOC_ENUM r_type /* Relocation type. */)
{
@ -255,20 +255,6 @@ fix_new_exp (fragS *frag, /* Which frag? */
as_bad (_("register value used as expression"));
break;
case O_add:
/* This comes up when _GLOBAL_OFFSET_TABLE_+(.-L0) is read, if
the difference expression cannot immediately be reduced. */
{
symbolS *stmp = make_expr_symbol (exp);
exp->X_op = O_symbol;
exp->X_op_symbol = 0;
exp->X_add_symbol = stmp;
exp->X_add_number = 0;
return fix_new_exp (frag, where, size, exp, pcrel, r_type);
}
case O_symbol_rva:
add = exp->X_add_symbol;
off = exp->X_add_number;
@ -290,6 +276,8 @@ fix_new_exp (fragS *frag, /* Which frag? */
off = exp->X_add_number;
break;
case O_add: /* This comes up when _GLOBAL_OFFSET_TABLE_+(.-L0) is read, if
the difference expression cannot immediately be reduced. */
default:
add = make_expr_symbol (exp);
break;

View File

@ -187,7 +187,7 @@ extern fixS *fix_new (fragS *, unsigned long, unsigned long, symbolS *,
extern fixS *fix_at_start (fragS *, unsigned long, symbolS *,
offsetT, int, bfd_reloc_code_real_type);
extern fixS *fix_new_exp (fragS *, unsigned long, unsigned long,
expressionS *, int, bfd_reloc_code_real_type);
const expressionS *, int, bfd_reloc_code_real_type);
extern void write_print_statistics (FILE *);
extern void as_bad_subtract (fixS *);