diff options
author | Jan Beulich <jbeulich@suse.com> | 2023-05-12 08:55:48 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2023-05-12 08:55:48 +0200 |
commit | d50c498a1ba7249ccf1d429ce39ab247219c7205 (patch) | |
tree | ba7648399a27de94117a511fe5fc8a82ece36e3f /gas/expr.h | |
parent | 8cea5fda33becb158c51a532e9281a7b17158459 (diff) | |
download | binutils-d50c498a1ba7249ccf1d429ce39ab247219c7205.zip binutils-d50c498a1ba7249ccf1d429ce39ab247219c7205.tar.gz binutils-d50c498a1ba7249ccf1d429ce39ab247219c7205.tar.bz2 |
gas: equates of registers
There are two problems: symbol_equated_p() doesn't recognize equates of
registers, and S_CAN_BE_REDEFINED() goes by section rather than by
expression type. Both together undermine .eqv and .equiv clearly meaning
to guard the involved symbols against re-definition (both ways).
To compensate pseudo_set() now using O_symbol and S_CAN_BE_REDEFINED()
now checking for O_register,
- for targets creating register symbols through symbol_{new,create}() ->
symbol_init() -> S_SET_VALUE() (alpha, arc, dlx, ia64, m68k, mips,
mmix, tic4x, tic54x, plus anything using cgen or itbl-ops), have
symbol_init() set their expressions to O_register,
- x86'es parse_register() also can't go by section anymore when
trying to "look through" equates; probably symbol_equated_p() should
have been used there from the beginning, if only that had worked for
equates of registers,
- various targets need to "look through" equates when parsing insn
operands (which also helps transitive forward equates); perhaps even
more ought to, but many don't look to consider the possibility of
register equates in the first place.
This was uncovered by code reported in PR gas/30274 (duplicating
PR gas/30272), except that there .eqv was used when really .equ was
meant. Therefore that bug report is addressed here only in so far as
gas wouldn't crash anymore; the code there still won't assemble
successfully, just that now the issues there are properly diagnosed.
Diffstat (limited to 'gas/expr.h')
-rw-r--r-- | gas/expr.h | 1 |
1 files changed, 1 insertions, 0 deletions
@@ -190,5 +190,6 @@ extern symbolS *expr_build_dot (void); extern uint32_t generic_bignum_to_int32 (void); extern uint64_t generic_bignum_to_int64 (void); extern int resolve_expression (expressionS *); +extern void resolve_register (expressionS *); extern bool literal_prefix_dollar_hex; |