From: Tom Tromey <tromey@adacore.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tromey@adacore.com>
Subject: [PATCH 1/2] Avoid some copying in psymtab.c
Date: Fri, 20 Mar 2020 14:49:34 -0600 [thread overview]
Message-ID: <20200320204935.19509-2-tromey@adacore.com> (raw)
In-Reply-To: <20200320204935.19509-1-tromey@adacore.com>
I noticed that psymtab.c was always copying the search string in
psymtab_search_name, even when it wasn't necessary. This patch
replaces this function with a class which holds the allocated search
name, if necessary.
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-03-20 Tom Tromey <tromey@adacore.com>
* psymtab.c (class psymtab_search_name): New class.
(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 | 9 +++++
gdb/psymtab.c | 94 ++++++++++++++++++++++++++++-----------------------
2 files changed, 61 insertions(+), 42 deletions(-)
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index f77f6d5108f..34b9741e966 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);
@@ -469,6 +470,38 @@ find_pc_sect_psymbol (struct objfile *objfile,
return best;
}
+/* 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. */
+
+class psymtab_search_name
+{
+public:
+ explicit psymtab_search_name (const char *name)
+ : m_name (name)
+ {
+ if (current_language->la_language == language_cplus && strchr (name, '('))
+ m_search_name = cp_remove_params (name);
+ }
+
+ /* Return the search name. */
+ const char *get () const
+ {
+ if (m_search_name == nullptr)
+ return m_name;
+ return m_search_name.get ();
+ }
+
+private:
+
+ /* The original name. */
+ const char *m_name;
+ /* The search name, if one was needed. */
+ gdb::unique_xmalloc_ptr<char> m_search_name;
+};
+
/* Psymtab version of lookup_symbol. See its definition in
the definition of quick_symbol_functions in symfile.h. */
@@ -482,9 +515,14 @@ psym_lookup_symbol (struct objfile *objfile,
lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
+ psymtab_search_name search_name (name);
+ lookup_name_info psym_lookup_name (search_name.get (),
+ symbol_name_match_type::FULL);
+
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 +650,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 +668,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 +692,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 +1050,18 @@ static void
psym_expand_symtabs_for_function (struct objfile *objfile,
const char *func_name)
{
+ psymtab_search_name search_name (func_name);
+ lookup_name_info lookup_name (search_name.get (),
+ symbol_name_match_type::FULL);
+
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);
}
--
2.21.1
next prev parent reply other threads:[~2020-03-20 20:49 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-20 20:49 [PATCH 0/2] Avoid copying in name lookup Tom Tromey
2020-03-20 20:49 ` Tom Tromey [this message]
2020-03-31 17:46 ` [PATCH 1/2] Avoid some copying in psymtab.c Pedro Alves
2020-03-31 19:35 ` Tom Tromey
2020-03-20 20:49 ` [PATCH 2/2] Avoid copying in lookup_name_info Tom Tromey
2020-03-23 17:51 ` Christian Biesinger
2020-03-31 13:28 ` Tom Tromey
2020-03-31 18:18 ` Pedro Alves
2020-03-31 19:11 ` Tom Tromey
2020-03-31 19:15 ` Tom Tromey
2020-03-31 19:28 ` Pedro Alves
2020-03-31 19:35 ` Tom Tromey
2020-03-31 19:23 ` Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200320204935.19509-2-tromey@adacore.com \
--to=tromey@adacore.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox