summaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2020-09-15 10:53:46 +0100
committerNick Clifton <nickc@redhat.com>2020-09-15 10:53:46 +0100
commitf36eda1fe30d394274a5f0becdff45bbd81fd6a8 (patch)
treea5c649c542367a4ea45a376a801cdbdbea0a962f /gas
parent6db9990640cdf7bc0880149f2707904506518fb8 (diff)
downloadbinutils-gdb-f36eda1fe30d394274a5f0becdff45bbd81fd6a8.tar.gz
Fix the assembler's new .nop directive so that the input line pointer is preserved.
* read.c (s_nop): Preserve the input_line_pointer around the call to md_assemble. * config/tc-s12z.c (md_assemble): Revert previous delta.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog6
-rw-r--r--gas/config/tc-s12z.c9
-rw-r--r--gas/read.c5
3 files changed, 14 insertions, 6 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 633967d3068..add14d82749 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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.
diff --git a/gas/config/tc-s12z.c b/gas/config/tc-s12z.c
index c79d2f43f16..d89fb0c21ff 100644
--- a/gas/config/tc-s12z.c
+++ b/gas/config/tc-s12z.c
@@ -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++)
+ ;
}
diff --git a/gas/read.c b/gas/read.c
index 97a9e66e6f4..ff4737ef2cb 100644
--- a/gas/read.c
+++ b/gas/read.c
@@ -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
}