]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gas: partly restore how current_location() had worked
authorJan Beulich <jbeulich@suse.com>
Tue, 3 Dec 2024 09:48:16 +0000 (10:48 +0100)
committerJan Beulich <jbeulich@suse.com>
Tue, 3 Dec 2024 09:48:16 +0000 (10:48 +0100)
Commit 4a826962e760 changed its behavior without saying why, and without
putting in place any testcase demonstrating the required behavior.
Firmly latch the current position unless deferred-evaluation mode is in
effect.

gas/config/tc-i386-intel.c
gas/config/tc-i386.c
gas/config/tc-i386.h
gas/config/tc-mmix.h
gas/expr.c
gas/expr.h

index d6c8eaa39d9bf4f65dfac1fb324ab713ea190050..94e3aaffdf4484e2557dab33020d5bcc44931a67 100644 (file)
@@ -236,13 +236,15 @@ operatorT i386_operator (const char *name, unsigned int operands, char *pc)
   return O_absent;
 }
 
-static int i386_intel_parse_name (const char *name, expressionS *e)
+static int i386_intel_parse_name (const char *name,
+                                 expressionS *e,
+                                 enum expr_mode mode)
 {
   unsigned int j;
 
   if (! strcmp (name, "$"))
     {
-      current_location (e);
+      current_location (e, mode);
       return 1;
     }
 
index 922c9588fd0f57ee2237c8a258325a3f47fd7686..aeb9b97445102b4f3a89a7124c3ba6d2a15462a9 100644 (file)
@@ -168,7 +168,7 @@ static int i386_finalize_displacement (segT, expressionS *, i386_operand_type,
 static int i386_att_operand (char *);
 static int i386_intel_operand (char *, int);
 static int i386_intel_simplify (expressionS *);
-static int i386_intel_parse_name (const char *, expressionS *);
+static int i386_intel_parse_name (const char *, expressionS *, enum expr_mode);
 static const reg_entry *parse_register (const char *, char **);
 static const char *parse_insn (const char *, char *, enum parse_mode);
 static char *parse_operands (char *, const char *);
@@ -16649,7 +16649,10 @@ parse_register (const char *reg_string, char **end_op)
 }
 
 int
-i386_parse_name (char *name, expressionS *e, char *nextcharP)
+i386_parse_name (char *name,
+                expressionS *e,
+                enum expr_mode mode,
+                char *nextcharP)
 {
   const reg_entry *r = NULL;
   char *end = input_line_pointer;
@@ -16674,7 +16677,7 @@ i386_parse_name (char *name, expressionS *e, char *nextcharP)
     }
   input_line_pointer = end;
   *end = 0;
-  return intel_syntax ? i386_intel_parse_name (name, e) : 0;
+  return intel_syntax ? i386_intel_parse_name (name, e, mode) : 0;
 }
 
 void
index 5ee6694e8846686069a6f15af2b0ffdde79d7382..b2dd8b9d02d3c8dfefac9e26aab0069c94599c97 100644 (file)
@@ -191,8 +191,8 @@ extern bool i386_check_label (void);
 extern int i386_unrecognized_line (int);
 #define tc_unrecognized_line i386_unrecognized_line
 
-extern int i386_parse_name (char *, expressionS *, char *);
-#define md_parse_name(s, e, m, c) i386_parse_name (s, e, c)
+extern int i386_parse_name (char *, expressionS *, enum expr_mode, char *);
+#define md_parse_name(s, e, m, c) i386_parse_name (s, e, m, c)
 
 extern operatorT i386_operator (const char *name, unsigned int operands, char *);
 #define md_operator i386_operator
index 5e70617497ab8f16801948d0bab94b66e7859ba4..970c9ef4b7131f66b6064439aeddfe8a3fc6f1af 100644 (file)
@@ -62,7 +62,7 @@ extern int mmix_gnu_syntax;
  (! mmix_gnu_syntax                                            \
   && (name[0] == '@'                                           \
       ? (! is_part_of_name (name[1])                           \
-        && (current_location (exp), 1))                        \
+        && (current_location (exp, mode), 1))                  \
       : ((name[0] == ':' || ISUPPER (name[0]))                 \
         && mmix_parse_predefined_name (name, exp))))
 
index 056870bbb237260cc04367c89126713530c97f12..eaeaa6c7f463bc750832f7e70ac10a444db5a843 100644 (file)
@@ -728,7 +728,7 @@ mri_char_constant (expressionS *expressionP)
    handles the magic symbol `.'.  */
 
 void
-current_location (expressionS *expressionp)
+current_location (expressionS *expressionp, enum expr_mode mode)
 {
   if (now_seg == absolute_section)
     {
@@ -738,7 +738,15 @@ current_location (expressionS *expressionp)
   else
     {
       expressionp->X_op = O_symbol;
-      expressionp->X_add_symbol = &dot_symbol;
+      if (mode != expr_defer)
+       {
+         expressionp->X_add_symbol = symbol_temp_new_now ();
+#ifdef tc_new_dot_label
+         tc_new_dot_label (expressionp->X_add_symbol);
+#endif
+       }
+      else
+         expressionp->X_add_symbol = &dot_symbol;
       expressionp->X_add_number = 0;
     }
 }
@@ -1215,14 +1223,14 @@ operand (expressionS *expressionP, enum expr_mode mode)
       if (is_part_of_name (*input_line_pointer))
        goto isname;
 
-      current_location (expressionP);
+      current_location (expressionP, mode);
       break;
 #endif
 
     case '.':
       if (!is_part_of_name (*input_line_pointer))
        {
-         current_location (expressionP);
+         current_location (expressionP, mode);
          break;
        }
       else if ((strncasecmp (input_line_pointer, "startof.", 8) == 0
@@ -1309,7 +1317,7 @@ operand (expressionS *expressionP, enum expr_mode mode)
       if (! flag_m68k_mri || is_part_of_name (*input_line_pointer))
        goto de_fault;
 
-      current_location (expressionP);
+      current_location (expressionP, mode);
       break;
 #endif
 
index 2ed68233337075c1e9919ed285d09bb758df3bad..7298b68578326f038525409118f94d19e4aa42b1 100644 (file)
@@ -184,7 +184,7 @@ extern segT expr (int, expressionS *, enum expr_mode);
 extern unsigned int get_single_number (void);
 extern symbolS *make_expr_symbol (const expressionS * expressionP);
 extern int expr_symbol_where (symbolS *, const char **, unsigned int *);
-extern void current_location (expressionS *);
+extern void current_location (expressionS *, enum expr_mode);
 extern symbolS *expr_build_uconstant (offsetT);
 extern symbolS *expr_build_dot (void);
 extern uint32_t generic_bignum_to_int32 (void);