aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2022-12-16 09:01:14 +0100
committerJan Beulich <jbeulich@suse.com>2022-12-16 09:01:14 +0100
commit22a8433e00fd33efcb1fa4961eb826cd97f2cd8b (patch)
tree0ccd9c48c3a0b29a69264f07303924fae4500c03
parent689933867ad45487751a6bb411e69cd91ef24990 (diff)
downloadbinutils-22a8433e00fd33efcb1fa4961eb826cd97f2cd8b.zip
binutils-22a8433e00fd33efcb1fa4961eb826cd97f2cd8b.tar.gz
binutils-22a8433e00fd33efcb1fa4961eb826cd97f2cd8b.tar.bz2
gas: restore Dwarf info generation after macro diagnostic adjustments
While 6fdb723799e2 ("gas: re-work line number tracking for macros and their expansions") was meant to leave generated Dwarf as is, it really didn't (and the testcase intended to catch that wasn't covering the case which broke). Its adjustment to buffer_and_nest() didn't go far enough, leading to the "linefile" directive inserted at the top to also be processed later in the PRĀ gas/16908 workaround (which clearly isn't intended - it's being put there for processing during macro expansion only). That unnoticed flaw in turn led me to work around it by a (suspicious to me already at the time) conditional in as_where().
-rw-r--r--gas/input-scrub.c3
-rw-r--r--gas/macro.c5
-rw-r--r--gas/testsuite/gas/elf/dwarf-5-macro-include.d17
-rw-r--r--gas/testsuite/gas/elf/dwarf-5-macro-include.inc3
-rw-r--r--gas/testsuite/gas/elf/dwarf-5-macro-include.s5
-rw-r--r--gas/testsuite/gas/elf/elf.exp1
6 files changed, 29 insertions, 5 deletions
diff --git a/gas/input-scrub.c b/gas/input-scrub.c
index 6791ef2..c967fad 100644
--- a/gas/input-scrub.c
+++ b/gas/input-scrub.c
@@ -564,9 +564,6 @@ as_where (unsigned int *linep)
do
{
- if (!saved->is_linefile)
- break;
-
if (expansion != expanding_macro)
/* Nothing. */;
else if (saved->logical_input_file != NULL
diff --git a/gas/macro.c b/gas/macro.c
index c41b9c0..714fca5 100644
--- a/gas/macro.c
+++ b/gas/macro.c
@@ -120,8 +120,7 @@ buffer_and_nest (const char *from, const char *to, sb *ptr,
size_t from_len;
size_t to_len = strlen (to);
int depth = 1;
- size_t line_start = ptr->len;
- size_t more = get_line (ptr);
+ size_t line_start, more;
if (to_len == 4 && strcasecmp (to, "ENDR") == 0)
{
@@ -147,6 +146,8 @@ buffer_and_nest (const char *from, const char *to, sb *ptr,
xfree (linefile);
}
+ line_start = ptr->len;
+ more = get_line (ptr);
while (more)
{
/* Try to find the first pseudo op on the line. */
diff --git a/gas/testsuite/gas/elf/dwarf-5-macro-include.d b/gas/testsuite/gas/elf/dwarf-5-macro-include.d
new file mode 100644
index 0000000..32ea638
--- /dev/null
+++ b/gas/testsuite/gas/elf/dwarf-5-macro-include.d
@@ -0,0 +1,17 @@
+#as: --gdwarf-5 -I${srcdir}/$subdir
+#name: line number entries for expansions of .macro coming from .include
+#readelf: -W -wl
+# The am33 cr16 crx ft32 mn10* msp430 nds32* and rl78 targets do not evaluate the subtraction of symbols at assembly time.
+# The d30v target emits sufficiently different debug info, apparently also covering padding it inserts.
+# The riscv targets do not support the subtraction of symbols.
+#xfail: am33*-* cr16-* crx-* d30v-* ft32-* mn10*-* msp430-* nds32*-* riscv*-* rl78-*
+
+Raw dump of debug contents .*
+#...
+ Line Number Statements:
+.*Extended opcode 2: .*
+.*Special opcode .* advance Address by 0 .* and Line by 2 to 3
+.*Special opcode .* and Line by 1 to 4
+.*Special opcode .* and Line by 1 to 5
+.*Advance PC by .*
+.*Extended opcode 1: End of Sequence
diff --git a/gas/testsuite/gas/elf/dwarf-5-macro-include.inc b/gas/testsuite/gas/elf/dwarf-5-macro-include.inc
new file mode 100644
index 0000000..7322377
--- /dev/null
+++ b/gas/testsuite/gas/elf/dwarf-5-macro-include.inc
@@ -0,0 +1,3 @@
+ .macro m1 args:vararg
+ .nop
+ .endm
diff --git a/gas/testsuite/gas/elf/dwarf-5-macro-include.s b/gas/testsuite/gas/elf/dwarf-5-macro-include.s
new file mode 100644
index 0000000..6b6832a
--- /dev/null
+++ b/gas/testsuite/gas/elf/dwarf-5-macro-include.s
@@ -0,0 +1,5 @@
+ .include "dwarf-5-macro-include.inc"
+
+ m1 1
+ m1 2
+ m1 3
diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp
index 145814b..105708d 100644
--- a/gas/testsuite/gas/elf/elf.exp
+++ b/gas/testsuite/gas/elf/elf.exp
@@ -309,6 +309,7 @@ if { [is_elf_format] } then {
run_dump_test "dwarf-5-nop-for-line-table" $dump_opts
run_dump_test "dwarf-5-irp" $dump_opts
run_dump_test "dwarf-5-macro" $dump_opts
+ run_dump_test "dwarf-5-macro-include" $dump_opts
run_dump_test "dwarf-3-func" $dump_opts
run_dump_test "dwarf-5-func" $dump_opts
run_dump_test "dwarf-5-func-global" $dump_opts