From e061219f5d600af5b33418553f192e0cb9fc9ca9 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Wed, 6 Sep 2023 11:00:01 +0200 Subject: [PATCH] [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 --- 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) -- 2.30.2