[binutils-gdb] [gdb/symtab] Fix too many symbols in gdbpy_lookup_static_symbols

Tom de Vries vries@sourceware.org
Wed Sep 6 09:00:11 GMT 2023


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e061219f5d600af5b33418553f192e0cb9fc9ca9

commit e061219f5d600af5b33418553f192e0cb9fc9ca9
Author: Tom de Vries <tdevries@suse.de>
Date:   Wed Sep 6 11:00:01 2023 +0200

    [gdb/symtab] Fix too many symbols in gdbpy_lookup_static_symbols
    
    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

Diff:
---
 gdb/python/py-symbol.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/gdb/python/py-symbol.c b/gdb/python/py-symbol.c
index ee863aa4df4..43a20c7a366 100644
--- a/gdb/python/py-symbol.c
+++ b/gdb/python/py-symbol.c
@@ -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)


More information about the Gdb-cvs mailing list