Fix the assembler's new .nop directive so that the input line pointer is preserved.
authorNick Clifton <nickc@redhat.com>
Tue, 15 Sep 2020 09:53:46 +0000 (10:53 +0100)
committerNick Clifton <nickc@redhat.com>
Tue, 15 Sep 2020 09:53:46 +0000 (10:53 +0100)
* read.c (s_nop): Preserve the input_line_pointer around the call
to md_assemble.
* config/tc-s12z.c (md_assemble): Revert previous delta.

gas/ChangeLog
gas/config/tc-s12z.c
gas/read.c

index 633967d3068e4529d137e239b1e56088c783ad9d..add14d8274947a8f86b87914b8d4b95b98de3ff6 100644 (file)
@@ -1,3 +1,9 @@
+2020-09-15  Nick Clifton  <nickc@redhat.com>
+
+       * read.c (s_nop): Preserve the input_line_pointer around the call
+       to md_assemble.
+       * config/tc-s12z.c (md_assemble): Revert previous delta.
+
 2020-09-15  David Faust  <david.faust@oracle.com>
 
        * config/tc-bpf.h (md_single_noop_insn): Use 'ja 0' for no-op.
index c79d2f43f16478fd78c412af418d004463668e48..d89fb0c21ff3cd88a3bef527c012490eb2f6191a 100644 (file)
@@ -3807,7 +3807,6 @@ md_assemble (char *str)
       return;
     }
 
-  char * saved_ilp = input_line_pointer;
   input_line_pointer = skip_whites (op_end);
 
   size_t i;
@@ -3817,17 +3816,15 @@ md_assemble (char *str)
       if (0 == strcmp (name, opc->name))
        {
          if (opc->parse_operands (opc))
-           {
-             input_line_pointer = saved_ilp;
-             return;
-           }
+           return;
          continue;
        }
     }
 
   as_bad (_("Invalid instruction: \"%s\""), str);
   as_bad (_("First invalid token: \"%s\""), fail_line_pointer);
-  input_line_pointer = saved_ilp;
+  while (*input_line_pointer++)
+    ;
 }
 
 \f
index 97a9e66e6f45b82c68a44cd6176d8db3f5f91503..ff4737ef2cb6f049dd2fd41394b19b139f0a13d1 100644 (file)
@@ -3530,7 +3530,12 @@ s_nop (int ignore ATTRIBUTE_UNUSED)
   if (asprintf (&nop, "%s", md_single_noop_insn) < 0)
     as_fatal ("%s", xstrerror (errno));
 
+  /* Some targets assume that they can update input_line_pointer inside
+     md_assemble, and, worse, that they can leave it assigned to the string
+     pointer that was provided as an argument.  So preserve ilp here.  */
+  char * saved_ilp = input_line_pointer;
   md_assemble (nop);
+  input_line_pointer = saved_ilp;
   free (nop);
 #endif
 }