Re: [PATCH] gdb: search local symbols before global symbols in completion

Oleg Tolmatcev <[email protected]>
Newsgroups gmane.comp.gdb.patches
Message-ID <CACcXsZgLx0kcQvQbMX-xScwF-g-3r=bi8Pd=-ZAKn9fBwgVAQw@mail.gmail.com>
пн, 3 авг. 2026 г. в 13:03, Andrew Burgess <[email protected]>:
>
> Oleg Tolmatcev <[email protected]> writes:
>
> > When symbol completion is performed from a selected frame, search the
> > local blocks before scanning minimal symbols and global/static symbols.
> > This makes completion prefer names that are visible in the current
> > context, including local variables.
> > ---
> >  gdb/symtab.c | 72 ++++++++++++++++++++++++++--------------------------
>
> It feels like this really needs a test in the gdb.dap/ directory.
>
> Thanks,
> Andrew
>
>
> >  1 file changed, 36 insertions(+), 36 deletions(-)
> >
> > diff --git a/gdb/symtab.c b/gdb/symtab.c
> > index 5d5076f2e77..85665bebdf4 100644
> > --- a/gdb/symtab.c
> > +++ b/gdb/symtab.c
> > @@ -5931,6 +5931,42 @@ default_collect_symbol_completion_matches_break_on
> >
> >    lookup_name_info lookup_name (sym_text, name_match_type, true);
> >
> > +  /* Search upwards from currently selected frame (so that we can
> > +     complete on local vars).  Also catch fields of types defined in
> > +     this places which match our text string.  Only complete on types
> > +     visible from current context.  */
> > +
> > +  b = get_selected_block ();
> > +  surrounding_static_block = b == nullptr ? nullptr : b->static_block ();
> > +  surrounding_global_block = b == nullptr ? nullptr : b->global_block ();
> > +  if (surrounding_static_block != NULL)
> > +    while (b != surrounding_static_block)
> > +      {
> > +     QUIT;
> > +
> > +     for (struct symbol *sym : block_iterator_range (b))
> > +       {
> > +         if (code == TYPE_CODE_UNDEF)
> > +           {
> > +             completion_list_add_symbol (tracker, sym, lookup_name,
> > +                                         sym_text, word);
> > +             completion_list_add_fields (tracker, sym, lookup_name,
> > +                                         sym_text, word);
> > +           }
> > +         else if (sym->domain () == STRUCT_DOMAIN
> > +                  && sym->type ()->code () == code)
> > +           completion_list_add_symbol (tracker, sym, lookup_name,
> > +                                       sym_text, word);
> > +       }
> > +
> > +     /* Stop when we encounter an enclosing function.  Do not stop for
> > +        non-inlined functions - the locals of the enclosing function
> > +        are in scope for a nested function.  */
> > +     if (b->function () != NULL && b->inlined_p ())
> > +       break;
> > +     b = b->superblock ();
> > +      }
> > +
> >    /* At this point scan through the misc symbol vectors and add each
> >       symbol you find to the list.  Eventually we want to ignore
> >       anything that isn't a text symbol (everything else will be
> > @@ -5974,42 +6010,6 @@ default_collect_symbol_completion_matches_break_on
> >        SEARCH_ALL_DOMAINS);
> >      }
> >
> > -  /* Search upwards from currently selected frame (so that we can
> > -     complete on local vars).  Also catch fields of types defined in
> > -     this places which match our text string.  Only complete on types
> > -     visible from current context.  */
> > -
> > -  b = get_selected_block ();
> > -  surrounding_static_block = b == nullptr ? nullptr : b->static_block ();
> > -  surrounding_global_block = b == nullptr ? nullptr : b->global_block ();
> > -  if (surrounding_static_block != NULL)
> > -    while (b != surrounding_static_block)
> > -      {
> > -     QUIT;
> > -
> > -     for (struct symbol *sym : block_iterator_range (b))
> > -       {
> > -         if (code == TYPE_CODE_UNDEF)
> > -           {
> > -             completion_list_add_symbol (tracker, sym, lookup_name,
> > -                                         sym_text, word);
> > -             completion_list_add_fields (tracker, sym, lookup_name,
> > -                                         sym_text, word);
> > -           }
> > -         else if (sym->domain () == STRUCT_DOMAIN
> > -                  && sym->type ()->code () == code)
> > -           completion_list_add_symbol (tracker, sym, lookup_name,
> > -                                       sym_text, word);
> > -       }
> > -
> > -     /* Stop when we encounter an enclosing function.  Do not stop for
> > -        non-inlined functions - the locals of the enclosing function
> > -        are in scope for a nested function.  */
> > -     if (b->function () != NULL && b->inlined_p ())
> > -       break;
> > -     b = b->superblock ();
> > -      }
> > -
> >    /* Add fields from the file's types; symbols will be added below.  */
> >
> >    if (code == TYPE_CODE_UNDEF)
> > --
> > 2.55.0.windows.1
>

I tried 3 times, but every time my test causes regressions on ARM. I
don't know how to write a passing test.

Is a test really necessary for this trivial patch that only changes the
order of completion results?

Oleg
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.