]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gas: make deferred expression evaluation generally latch dot
authorJan Beulich <jbeulich@suse.com>
Fri, 10 Jan 2025 07:42:00 +0000 (08:42 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 10 Jan 2025 07:42:00 +0000 (08:42 +0100)
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.

gas/config/tc-m32r.c
gas/config/tc-metag.c
gas/config/tc-mn10300.c
gas/config/tc-ppc.c
gas/config/tc-sh.c
gas/expr.c
gas/expr.h
gas/read.c

index aa0acea77431b73e36ae8ade124d72faf2217ae3..3505b3a13f7aecfbe45f22296fc5cb9bad354ae2 100644 (file)
@@ -2333,13 +2333,13 @@ m32r_parse_name (char const *name,
       /* If we have an absolute symbol or a
         reg, then we know its value now.  */
       segment = S_GET_SEGMENT (exprP->X_add_symbol);
-      if (mode != expr_defer && segment == absolute_section)
+      if (!expr_defer_p (mode) && segment == absolute_section)
        {
          exprP->X_op = O_constant;
          exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
          exprP->X_add_symbol = NULL;
        }
-      else if (mode != expr_defer && segment == reg_section)
+      else if (!expr_defer_p (mode) && segment == reg_section)
        {
          exprP->X_op = O_register;
          exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
index bf084f7df1374f6b6dafe30b272d8946b87c4521..f4364356d8f5e18ca03c5ba2c8cfb3f76ab0a852 100644 (file)
@@ -6908,13 +6908,13 @@ metag_parse_name (char const * name, expressionS * exprP, enum expr_mode mode,
       /* If we have an absolute symbol or a
         reg, then we know its value now.  */
       segment = S_GET_SEGMENT (exprP->X_add_symbol);
-      if (mode != expr_defer && segment == absolute_section)
+      if (!expr_defer_p (mode) && segment == absolute_section)
        {
          exprP->X_op = O_constant;
          exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
          exprP->X_add_symbol = NULL;
        }
-      else if (mode != expr_defer && segment == reg_section)
+      else if (!expr_defer_p (mode) && segment == reg_section)
        {
          exprP->X_op = O_register;
          exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
index 08f6a1c6aefdaf93fc03757c2d00eca4b74d6920..3fc7cac823a5aee3a3ea405b27ec690025a98e73 100644 (file)
@@ -2475,13 +2475,13 @@ mn10300_parse_name (char const *name,
       /* If we have an absolute symbol or a reg,
         then we know its value now.  */
       segment = S_GET_SEGMENT (exprP->X_add_symbol);
-      if (mode != expr_defer && segment == absolute_section)
+      if (!expr_defer_p (mode) && segment == absolute_section)
        {
          exprP->X_op = O_constant;
          exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
          exprP->X_add_symbol = NULL;
        }
-      else if (mode != expr_defer && segment == reg_section)
+      else if (!expr_defer_p (mode) && segment == reg_section)
        {
          exprP->X_op = O_register;
          exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
index 1ff1175d02a6321b93b167f95a429bec5b3520d0..d1de57e882c25e57e39d5ae5b7211c1445a5311e 100644 (file)
@@ -902,7 +902,7 @@ ppc_parse_name (const char *name, expressionS *exp, enum expr_mode mode)
   /* If we have an absolute symbol or a reg, then we know its value
      now.  Copy the symbol value expression to propagate X_md.  */
   bool done = false;
-  if (mode != expr_defer
+  if (!expr_defer_p (mode)
       && !S_FORCE_RELOC (sym, 0))
     {
       segT segment = S_GET_SEGMENT (sym);
index fe720e7eae9631a53a18736cdfd15d0e3320174f..d1a7c2516ec658b367c6248ebd3e3c559df39896 100644 (file)
@@ -3933,13 +3933,13 @@ sh_parse_name (char const *name,
       /* If we have an absolute symbol or a reg, then we know its
         value now.  */
       segment = S_GET_SEGMENT (exprP->X_add_symbol);
-      if (mode != expr_defer && segment == absolute_section)
+      if (!expr_defer_p (mode) && segment == absolute_section)
        {
          exprP->X_op = O_constant;
          exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
          exprP->X_add_symbol = NULL;
        }
-      else if (mode != expr_defer && segment == reg_section)
+      else if (!expr_defer_p (mode) && segment == reg_section)
        {
          exprP->X_op = O_register;
          exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
index 5e59b7c5fa16b0cd54815136c06687dbaf1d8011..ccd89253ac1cb05fe811965c9751f13f495de40e 100644 (file)
@@ -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
index 351e6306740a33ec9b75c4450753894156f9cd0a..14787c413430fa03f71b6580fdfe0067c61de20f 100644 (file)
@@ -153,9 +153,12 @@ enum expr_mode
 {
   expr_evaluate,
   expr_normal,
-  expr_defer
+  expr_defer,
+  expr_defer_incl_dot,
 };
 
+#define expr_defer_p(m) ((m) >= expr_defer)
+
 /* "result" should be type (expressionS *).  */
 #define expression(result) expr (0, result, expr_normal)
 #define expression_and_evaluate(result) expr (0, result, expr_evaluate)
index 5df1f3da5885a8d89c7502612bded33f4265175b..c51536f44f91e4ce26e7ebe5c8b9f628e2971e4b 100644 (file)
@@ -4069,7 +4069,7 @@ pseudo_set (symbolS *symbolP)
   if (!S_IS_FORWARD_REF (symbolP))
     (void) expression (&exp);
   else
-    (void) deferred_expression (&exp);
+    (void) expr (0, &exp, expr_defer_incl_dot);
 
   if (exp.X_op == O_illegal)
     as_bad (_("illegal expression"));