[PATCH] [gdb/symtab] Handle PU in iterate_over_some_symtabs

Tom de Vries tdevries@suse.de
Thu Aug 31 09:53:12 GMT 2023


When running test-case gdb.base/setshow.exp with target board cc-with-dwz I
run into:
...
(gdb) info line 1^M
Line 1 of "setshow.c" is at address 0x400527 <main> but contains no code.^M
Line 1 of "setshow.c" is at address 0x400527 <main> but contains no code.^M
(gdb) FAIL: gdb.base/setshow.exp: test_setshow_annotate: annotation_level 1
...
while the expected output is:
...
Line 1 of "setshow.c" is at address 0x400527 <main> but contains no code.
��setshow.c:1:0:beg:0x400527
...

The second line of the expected output is missing due to the first line of the
expected output being repeated, so the problem is that the "Line 1" line is
printed twice.

This happens because the PU imported by the CU reuses the filetab of the CU,
and both the CU and PU are visited by iterate_over_some_symtabs.

Fix this by skipping PUs in iterate_over_some_symtabs.

Tested on x86_64-linux, target boards unix, cc-with-dwz and cc-with-dwz-m.

PR symtab/30797
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30797
---
 gdb/symtab.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/gdb/symtab.c b/gdb/symtab.c
index 0117a2a59d7..19d33020b87 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -565,6 +565,10 @@ iterate_over_some_symtabs (const char *name,
 
   for (cust = first; cust != NULL && cust != after_last; cust = cust->next)
     {
+      /* Skip included compunits.  */
+      if (cust->user != nullptr)
+	continue;
+
       for (symtab *s : cust->filetabs ())
 	{
 	  if (compare_filenames_for_search (s->filename, name))

base-commit: 959db212304e64751563bcaaacbdd28efd5016a7
-- 
2.35.3



More information about the Gdb-patches mailing list