From 657edeab3857130ddc005a88104711dd9e339ff0 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Tue, 12 Apr 2022 09:03:43 +0200 Subject: gas: further adjust file/line handling for .macro Commit 7992631e8c0b ("gas/Dwarf: improve debug info generation from .irp and alike blocks"), while dealing okay with actual assembly source files not using .file/.line and alike outside but not inside of .macro, has undue effects when the logical file/line pair was already overridden: Line numbers would continuously increment while processing the expanded macro, while the goal of the PR gas/16908 workaround is to keep the expansion associated with the line invoking the macro. However, as soon as enough state was overridden _inside_ the macro to cause as_where() to no longer fall back top as_where_physical(), honor this by resuming the bumping of the logical line number. Note that from_sb_is_expansion's initializer was 1 for an unknown reason. While renaming the variable and changing its type, also change the initializer to "expanding_none", which would have been "0" in the original code. Originally the initializer value itself wasn't ever used anyway (requiring sb_index != -1), as it necessarily had changed in input_scrub_include_sb() alongside setting sb_index to other than -1. Strictly speaking input_scrub_insert_line() perhaps shouldn't use expanding_none, yet none of the other enumerators fit there either. And then strictly speaking that function probably shouldn't exist in the first place. It's used only by tic54x. --- gas/input-scrub.c | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) (limited to 'gas/input-scrub.c') diff --git a/gas/input-scrub.c b/gas/input-scrub.c index a4d7f68..19f53e4 100644 --- a/gas/input-scrub.c +++ b/gas/input-scrub.c @@ -80,7 +80,7 @@ static size_t sb_index = -1; 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; @@ -117,7 +117,7 @@ struct input_save { 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. */ @@ -167,7 +167,7 @@ input_scrub_push (char *saved_position) 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 (); @@ -196,7 +196,7 @@ input_scrub_pop (struct input_save *saved) 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; @@ -252,6 +252,7 @@ char * 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); } @@ -259,7 +260,7 @@ input_scrub_include_file (const char *filename, char *position) 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; @@ -267,8 +268,10 @@ input_scrub_include_sb (sb *from, char *position, int is_expansion) 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 (); } @@ -279,7 +282,9 @@ input_scrub_include_sb (sb *from, char *position, int is_expansion) /* 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. */ @@ -317,7 +322,7 @@ input_scrub_next_buffer (char **bufp) 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 @@ -431,7 +436,10 @@ bump_line_counters (void) 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; } @@ -464,6 +472,10 @@ new_logical_line_flags (const char *fname, /* DON'T destroy it! We point to it! 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 @@ -482,6 +494,15 @@ new_logical_line_flags (const char *fname, /* DON'T destroy it! We point to it! 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))) -- cgit v1.1