]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/symtab] Fix too many symbols in gdbpy_lookup_static_symbols
authorTom de Vries <tdevries@suse.de>
Wed, 6 Sep 2023 09:00:01 +0000 (11:00 +0200)
committerTom de Vries <tdevries@suse.de>
Wed, 6 Sep 2023 09:00:01 +0000 (11:00 +0200)
When running test-case gdb.python/py-symbol.exp with target board
cc-with-dwz-m, we run into:
...
(gdb) python print (len (gdb.lookup_static_symbols ('rr')))^M
4^M
(gdb) FAIL: gdb.python/py-symbol.exp: \
  print (len (gdb.lookup_static_symbols ('rr')))
...
while with target board unix we have instead:
...
(gdb) python print (len (gdb.lookup_static_symbols ('rr')))^M
2^M
(gdb) PASS: gdb.python/py-symbol.exp: \
  print (len (gdb.lookup_static_symbols ('rr')))
...

The problem is that the loop in gdbpy_lookup_static_symbols loops over compunits
representing both CUs and PUs:
...
    for (compunit_symtab *cust : objfile->compunits ())
...

When doing a lookup on a PU, the user link is followed until we end up at a CU,
and the lookup is done in that CU.

In other words, when doing a lookup in the loop for a PU we duplicate the
lookup for a CU that is already handled by the loop.

Fix this by skipping PUs in the loop in gdb.lookup_static_symbols.

Tested on x86_64-linux.

PR symtab/25261
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=25261

gdb/python/py-symbol.c

index ee863aa4df4e582c1e8e83ad8c155e1ec5540a42..43a20c7a366afd5a2cdc2b206aba01b6c4ce9e06 100644 (file)
@@ -602,9 +602,12 @@ gdbpy_lookup_static_symbols (PyObject *self, PyObject *args, PyObject *kw)
        {
          for (compunit_symtab *cust : objfile->compunits ())
            {
-             const struct blockvector *bv;
+             /* Skip included compunits to prevent including compunits from
+                being searched twice.  */
+             if (cust->user != nullptr)
+               continue;
 
-             bv = cust->blockvector ();
+             const struct blockvector *bv = cust->blockvector ();
              const struct block *block = bv->static_block ();
 
              if (block != nullptr)