aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2020-04-01 07:47:13 -0600
committerTom Tromey <tromey@adacore.com>2020-04-01 07:47:13 -0600
commit8c072cb6a19abdc9d4b93c19a1d609fe1a486c32 (patch)
treec86d4d5e1100f0394e216a397bd125557c7e7c29
parent81e3a1d00cbe19c1a9b189601c269d1b5db02343 (diff)
downloadfsf-binutils-gdb-8c072cb6a19abdc9d4b93c19a1d609fe1a486c32.zip
fsf-binutils-gdb-8c072cb6a19abdc9d4b93c19a1d609fe1a486c32.tar.gz
fsf-binutils-gdb-8c072cb6a19abdc9d4b93c19a1d609fe1a486c32.tar.bz2
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.
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/psymtab.c59
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 <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:
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<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);
}