static sb from_sb;
/* Should we do a conditional check on from_sb? */
-static int from_sb_is_expansion = 1;
+static enum expansion from_sb_expansion = expanding_none;
/* The number of nested sb structures we have included. */
int macro_nest;
unsigned int logical_input_line;
size_t sb_index;
sb from_sb;
- int from_sb_is_expansion; /* Should we do a conditional check? */
+ enum expansion from_sb_expansion; /* Should we do a conditional check? */
struct input_save * next_saved_file; /* Chain of input_saves. */
char * input_file_save; /* Saved state of input routines. */
char * saved_position; /* Caller's saved position in buf. */
saved->logical_input_line = logical_input_line;
saved->sb_index = sb_index;
saved->from_sb = from_sb;
- saved->from_sb_is_expansion = from_sb_is_expansion;
+ saved->from_sb_expansion = from_sb_expansion;
memcpy (saved->save_source, save_source, sizeof (save_source));
saved->next_saved_file = next_saved_file;
saved->input_file_save = input_file_push ();
logical_input_line = saved->logical_input_line;
sb_index = saved->sb_index;
from_sb = saved->from_sb;
- from_sb_is_expansion = saved->from_sb_is_expansion;
+ from_sb_expansion = saved->from_sb_expansion;
partial_where = saved->partial_where;
partial_size = saved->partial_size;
next_saved_file = saved->next_saved_file;
input_scrub_include_file (const char *filename, char *position)
{
next_saved_file = input_scrub_push (position);
+ from_sb_expansion = expanding_none;
return input_scrub_new_file (filename);
}
expanding a macro. */
void
-input_scrub_include_sb (sb *from, char *position, int is_expansion)
+input_scrub_include_sb (sb *from, char *position, enum expansion expansion)
{
int newline;
as_fatal (_("macros nested too deeply"));
++macro_nest;
+ gas_assert (expansion < expanding_nested);
+
#ifdef md_macro_start
- if (is_expansion)
+ if (expansion == expanding_macro)
{
md_macro_start ();
}
/* Allocate sufficient space: from->len + optional newline. */
newline = from->len >= 1 && from->ptr[0] != '\n';
sb_build (&from_sb, from->len + newline);
- from_sb_is_expansion = is_expansion;
+ if (expansion == expanding_repeat && from_sb_expansion >= expanding_macro)
+ expansion = expanding_nested;
+ from_sb_expansion = expansion;
if (newline)
{
/* Add the sentinel required by read.c. */
if (sb_index >= from_sb.len)
{
sb_kill (&from_sb);
- if (from_sb_is_expansion)
+ if (from_sb_expansion == expanding_macro)
{
cond_finish_check (macro_nest);
#ifdef md_macro_end
if (sb_index == (size_t) -1)
++physical_input_line;
- if (logical_input_line != -1u)
+ /* PR gas/16908 workaround: Don't bump logical line numbers while
+ expanding macros, unless file (and maybe line; see as_where()) are
+ used inside the macro. */
+ if (logical_input_line != -1u && from_sb_expansion < expanding_macro)
++logical_input_line;
}
\f
case 1 << 3:
if (line_number < 0 || fname != NULL || next_saved_file == NULL)
abort ();
+ /* PR gas/16908 workaround: Ignore updates when nested inside a macro
+ expansion. */
+ if (from_sb_expansion == expanding_nested)
+ return 0;
if (next_saved_file->logical_input_file)
fname = next_saved_file->logical_input_file;
else
fname = NULL;
}
+ /* When encountering file or line changes inside a macro, arrange for
+ bump_line_counters() to henceforth increment the logical line number
+ again, just like it does when expanding repeats. See as_where() for
+ why changing file or line alone doesn't alter expansion mode. */
+ if (from_sb_expansion == expanding_macro
+ && (logical_input_file != NULL || fname != NULL)
+ && logical_input_line != -1u)
+ from_sb_expansion = expanding_repeat;
+
if (fname
&& (logical_input_file == NULL
|| filename_cmp (logical_input_file, fname)))
as_bad ("%s", err);
*input_line_pointer++ = term;
input_scrub_include_sb (&out,
- input_line_pointer, 1);
+ input_line_pointer, expanding_macro);
sb_kill (&out);
buffer_limit =
input_scrub_next_buffer (&input_line_pointer);
numbers and possibly file names will be incorrect. */
sb_build (&sbuf, new_length);
sb_add_buffer (&sbuf, new_buf, new_length);
- input_scrub_include_sb (&sbuf, input_line_pointer, 0);
+ input_scrub_include_sb (&sbuf, input_line_pointer, expanding_none);
sb_kill (&sbuf);
buffer_limit = input_scrub_next_buffer (&input_line_pointer);
free (new_buf);
sb_kill (&s);
- input_scrub_include_sb (&out, input_line_pointer, 1);
+ input_scrub_include_sb (&out, input_line_pointer, expanding_repeat);
sb_kill (&out);
buffer_limit = input_scrub_next_buffer (&input_line_pointer);
}
sb_kill (&one);
- input_scrub_include_sb (&many, input_line_pointer, 1);
+ input_scrub_include_sb (&many, input_line_pointer, expanding_repeat);
sb_kill (&many);
buffer_limit = input_scrub_next_buffer (&input_line_pointer);
}
sb_kill (&one);
- input_scrub_include_sb (&many, input_line_pointer, 1);
+ input_scrub_include_sb (&many, input_line_pointer, expanding_repeat);
sb_kill (&many);
buffer_limit = input_scrub_next_buffer (&input_line_pointer);
}
size_t len = strlen (line);
sb_build (&newline, len);
sb_add_buffer (&newline, line, len);
- input_scrub_include_sb (&newline, input_line_pointer, 0);
+ input_scrub_include_sb (&newline, input_line_pointer, expanding_none);
sb_kill (&newline);
buffer_limit = input_scrub_next_buffer (&input_line_pointer);
}
.*: Assembler messages:
line\.s:[0-9]*18: Warning: \.warning .*
-line\.s:[0-9]*: Warning: m1/1: 123
-line\.s:[0-9]*: Warning: m1/2: 123
-line\.s:[0-9]*: Warning: m1/1: abc
-line\.s:[0-9]*: Warning: m1/2: abc
-line\.s:[0-9]*: Warning: m1/1: XYZ
-line\.s:[0-9]*: Warning: m1/2: XYZ
+line\.s:[0-9]*21: Warning: m1/1: 123
+line\.s:[0-9]*21: Warning: m1/2: 123
+line\.s:[0-9]*22: Warning: m1/1: abc
+line\.s:[0-9]*22: Warning: m1/2: abc
+line\.s:[0-9]*23: Warning: m1/1: XYZ
+line\.s:[0-9]*23: Warning: m1/2: XYZ
line\.s:[0-9]*24: Warning: \.warning .*
Line\.s:10: Warning: m2/1: 987
Line\.s:12: Warning: m2/2: 987