Avoid some copying in psymtab.c
I noticed that psymtab.c was always copying the search string in psymtab_search_name, even when it wasn't necessary. This patch removes this function in favor of using the make_ignore_params feature of lookup_name_info. Once I had done that, I noticed that lookup_partial_symbol was creating a lookup_name_info. However, this function called in loops, causing even more excess allocation. This patch further fixes this by hosting the creation of the lookup_name_info into the callers. gdb/ChangeLog 2020-04-01 Tom Tromey <tromey@adacore.com> * psymtab.c (psymtab_search_name): Remove function. (psym_lookup_symbol): Create search name and lookup name here. (lookup_partial_symbol): Remove "name" parameter; add lookup_name. (psym_expand_symtabs_for_function): Update.
This commit is contained in:
parent
81e3a1d00c
commit
8c072cb6a1
|
@ -1,3 +1,11 @@
|
|||
2020-04-01 Tom Tromey <tromey@adacore.com>
|
||||
|
||||
* psymtab.c (psymtab_search_name): Remove function.
|
||||
(psym_lookup_symbol): Create search name and lookup name here.
|
||||
(lookup_partial_symbol): Remove "name" parameter; add
|
||||
lookup_name.
|
||||
(psym_expand_symtabs_for_function): Update.
|
||||
|
||||
2020-03-31 Joel Jones <joelkevinjones@gmail.com>
|
||||
|
||||
PR tui/25597:
|
||||
|
|
|
@ -39,7 +39,8 @@
|
|||
|
||||
static struct partial_symbol *lookup_partial_symbol (struct objfile *,
|
||||
struct partial_symtab *,
|
||||
const char *, int,
|
||||
const lookup_name_info &,
|
||||
int,
|
||||
domain_enum);
|
||||
|
||||
static const char *psymtab_to_fullname (struct partial_symtab *ps);
|
||||
|
@ -482,9 +483,12 @@ psym_lookup_symbol (struct objfile *objfile,
|
|||
|
||||
lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
|
||||
|
||||
lookup_name_info psym_lookup_name = lookup_name.make_ignore_params ();
|
||||
|
||||
for (partial_symtab *ps : require_partial_symbols (objfile, true))
|
||||
{
|
||||
if (!ps->readin_p () && lookup_partial_symbol (objfile, ps, name,
|
||||
if (!ps->readin_p () && lookup_partial_symbol (objfile, ps,
|
||||
psym_lookup_name,
|
||||
psymtab_index, domain))
|
||||
{
|
||||
struct symbol *sym, *with_opaque = NULL;
|
||||
|
@ -612,42 +616,14 @@ match_partial_symbol (struct objfile *objfile,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* Returns the name used to search psymtabs. Unlike symtabs, psymtabs do
|
||||
not contain any method/function instance information (since this would
|
||||
force reading type information while reading psymtabs). Therefore,
|
||||
if NAME contains overload information, it must be stripped before searching
|
||||
psymtabs. */
|
||||
|
||||
static gdb::unique_xmalloc_ptr<char>
|
||||
psymtab_search_name (const char *name)
|
||||
{
|
||||
switch (current_language->la_language)
|
||||
{
|
||||
case language_cplus:
|
||||
{
|
||||
if (strchr (name, '('))
|
||||
{
|
||||
gdb::unique_xmalloc_ptr<char> ret = cp_remove_params (name);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return make_unique_xstrdup (name);
|
||||
}
|
||||
|
||||
/* Look, in partial_symtab PST, for symbol whose natural name is NAME.
|
||||
Check the global symbols if GLOBAL, the static symbols if not. */
|
||||
/* Look, in partial_symtab PST, for symbol whose natural name is
|
||||
LOOKUP_NAME. Check the global symbols if GLOBAL, the static
|
||||
symbols if not. */
|
||||
|
||||
static struct partial_symbol *
|
||||
lookup_partial_symbol (struct objfile *objfile,
|
||||
struct partial_symtab *pst, const char *name,
|
||||
struct partial_symtab *pst,
|
||||
const lookup_name_info &lookup_name,
|
||||
int global, domain_enum domain)
|
||||
{
|
||||
struct partial_symbol **start, **psym;
|
||||
|
@ -658,10 +634,6 @@ lookup_partial_symbol (struct objfile *objfile,
|
|||
if (length == 0)
|
||||
return NULL;
|
||||
|
||||
gdb::unique_xmalloc_ptr<char> search_name = psymtab_search_name (name);
|
||||
|
||||
lookup_name_info lookup_name (search_name.get (), symbol_name_match_type::FULL);
|
||||
|
||||
start = (global ?
|
||||
&objfile->partial_symtabs->global_psymbols[pst->globals_offset] :
|
||||
&objfile->partial_symtabs->static_psymbols[pst->statics_offset]);
|
||||
|
@ -686,7 +658,7 @@ lookup_partial_symbol (struct objfile *objfile,
|
|||
internal_error (__FILE__, __LINE__,
|
||||
_("failed internal consistency check"));
|
||||
if (strcmp_iw_ordered ((*center)->ginfo.search_name (),
|
||||
search_name.get ()) >= 0)
|
||||
lookup_name.name ().c_str ()) >= 0)
|
||||
{
|
||||
top = center;
|
||||
}
|
||||
|
@ -1044,14 +1016,17 @@ static void
|
|||
psym_expand_symtabs_for_function (struct objfile *objfile,
|
||||
const char *func_name)
|
||||
{
|
||||
lookup_name_info base_lookup (func_name, symbol_name_match_type::FULL);
|
||||
lookup_name_info lookup_name = base_lookup.make_ignore_params ();
|
||||
|
||||
for (partial_symtab *ps : require_partial_symbols (objfile, true))
|
||||
{
|
||||
if (ps->readin_p ())
|
||||
continue;
|
||||
|
||||
if ((lookup_partial_symbol (objfile, ps, func_name, 1, VAR_DOMAIN)
|
||||
if ((lookup_partial_symbol (objfile, ps, lookup_name, 1, VAR_DOMAIN)
|
||||
!= NULL)
|
||||
|| (lookup_partial_symbol (objfile, ps, func_name, 0, VAR_DOMAIN)
|
||||
|| (lookup_partial_symbol (objfile, ps, lookup_name, 0, VAR_DOMAIN)
|
||||
!= NULL))
|
||||
psymtab_to_symtab (objfile, ps);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue