From 8c072cb6a19abdc9d4b93c19a1d609fe1a486c32 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 1 Apr 2020 07:47:13 -0600 Subject: 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 * 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. --- gdb/ChangeLog | 8 ++++++++ gdb/psymtab.c | 59 +++++++++++++++++------------------------------------------ 2 files changed, 25 insertions(+), 42 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 116a9b3..7c1d84c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2020-04-01 Tom Tromey + + * 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 PR tui/25597: diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 56c1b68..d5e61f8 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -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 -psymtab_search_name (const char *name) -{ - switch (current_language->la_language) - { - case language_cplus: - { - if (strchr (name, '(')) - { - gdb::unique_xmalloc_ptr 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 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); } -- cgit v1.1