aboutsummaryrefslogtreecommitdiff
path: root/gas/expr.c
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2025-01-10 08:42:00 +0100
committerJan Beulich <jbeulich@suse.com>2025-01-10 08:42:00 +0100
commit044dd6345f7b275db1ed3b2b9bea7a3e46b1ea09 (patch)
treeab37d865cf05ccf47e3c65708222f3fdd44438f3 /gas/expr.c
parent6f04937e1d7db190ca96ec08d8aeb25f0ec6e994 (diff)
downloadbinutils-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.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/gas/expr.c b/gas/expr.c
index 5e59b7c..ccd8925 100644
--- a/gas/expr.c
+++ b/gas/expr.c
@@ -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