diff options
author | Jan Beulich <jbeulich@suse.com> | 2025-01-10 08:42:00 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2025-01-10 08:42:00 +0100 |
commit | 044dd6345f7b275db1ed3b2b9bea7a3e46b1ea09 (patch) | |
tree | ab37d865cf05ccf47e3c65708222f3fdd44438f3 /gas/expr.c | |
parent | 6f04937e1d7db190ca96ec08d8aeb25f0ec6e994 (diff) | |
download | binutils-044dd6345f7b275db1ed3b2b9bea7a3e46b1ea09.zip binutils-044dd6345f7b275db1ed3b2b9bea7a3e46b1ea09.tar.gz binutils-044dd6345f7b275db1ed3b2b9bea7a3e46b1ea09.tar.bz2 |
gas: make deferred expression evaluation generally latch dot
Deferring expression evaluation is often necessary. However, the value
current_location() records typically is intended to represent the
location at the point of use of the expression, with the exception being
.eqv (or its == equivalent). Change how expr_defer behaves in this
regard, and introduce a special mode just for pseudo_set() to use.
Introduce a predicate to cover both "deferred" modes, and use it
everywhere except in current_location(), where only the new mode wants
checking for.
Diffstat (limited to 'gas/expr.c')
-rw-r--r-- | gas/expr.c | 10 |
1 files changed, 5 insertions, 5 deletions
@@ -738,7 +738,7 @@ current_location (expressionS *expressionp, enum expr_mode mode) else { expressionp->X_op = O_symbol; - if (mode != expr_defer) + if (mode != expr_defer_incl_dot) { expressionp->X_add_symbol = symbol_temp_new_now (); #ifdef tc_new_dot_label @@ -1387,14 +1387,14 @@ operand (expressionS *expressionP, enum expr_mode mode) /* If we have an absolute symbol or a reg, then we know its value now. */ segment = S_GET_SEGMENT (symbolP); - if (mode != expr_defer + if (!expr_defer_p (mode) && segment == absolute_section && !S_FORCE_RELOC (symbolP, 0)) { expressionP->X_op = O_constant; expressionP->X_add_number = S_GET_VALUE (symbolP); } - else if (mode != expr_defer && segment == reg_section) + else if (!expr_defer_p (mode) && segment == reg_section) { expressionP->X_op = O_register; expressionP->X_add_number = S_GET_VALUE (symbolP); @@ -1438,7 +1438,7 @@ operand (expressionS *expressionP, enum expr_mode mode) if (expressionP->X_add_symbol) symbol_mark_used (expressionP->X_add_symbol); - if (mode != expr_defer) + if (!expr_defer_p (mode)) { expressionP->X_add_symbol = symbol_clone_if_forward_ref (expressionP->X_add_symbol); @@ -1933,7 +1933,7 @@ expr (int rankarg, /* Larger # is higher rank. */ is_unsigned = resultP->X_unsigned && right.X_unsigned; - if (mode == expr_defer + if (expr_defer_p (mode) && ((resultP->X_add_symbol != NULL && S_IS_FORWARD_REF (resultP->X_add_symbol)) || (right.X_add_symbol != NULL |