diff options
author | Tom Tromey <tom@tromey.com> | 2020-05-08 14:14:05 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2020-05-08 14:14:06 -0600 |
commit | 596dc4adfff347b4d8dc1f7e4eb57b8f2f342281 (patch) | |
tree | 612ad84effaac4a52857ea209f8297f0a1859340 /gdb/cp-support.c | |
parent | bf4cb9bee210298c813f87aae005432d2e934449 (diff) | |
download | gdb-596dc4adfff347b4d8dc1f7e4eb57b8f2f342281.zip gdb-596dc4adfff347b4d8dc1f7e4eb57b8f2f342281.tar.gz gdb-596dc4adfff347b4d8dc1f7e4eb57b8f2f342281.tar.bz2 |
Speed up psymbol reading by removing a copy
I noticed that cp_canonicalize_string and friends copy a
unique_xmalloc_ptr to a std::string. However, this copy isn't
genuinely needed anywhere, and it serves to slow down DWARF psymbol
reading.
This patch removes the copy and updates the callers to adapt.
This speeds up the reader from 1.906 seconds (mean of 10 runs, of gdb
on a copy of itself) to 1.888 seconds (mean of 10 runs, on the same
copy as the first trial).
gdb/ChangeLog
2020-05-08 Tom Tromey <tom@tromey.com>
* symtab.h (class demangle_result_storage) <set_malloc_ptr>: New
overload.
<swap_string, m_string>: Remove.
* symtab.c (demangle_for_lookup, completion_list_add_symbol):
Update.
* stabsread.c (define_symbol, read_type): Update.
* linespec.c (find_linespec_symbols): Update.
* gnu-v3-abi.c (gnuv3_get_typeid): Update.
* dwarf2/read.c (dwarf2_canonicalize_name): Update.
* dbxread.c (read_dbx_symtab): Update.
* cp-support.h (cp_canonicalize_string_full)
(cp_canonicalize_string, cp_canonicalize_string_no_typedefs):
Return unique_xmalloc_ptr.
* cp-support.c (inspect_type): Update.
(cp_canonicalize_string_full): Return unique_xmalloc_ptr.
(cp_canonicalize_string_no_typedefs, cp_canonicalize_string):
Likewise.
* c-typeprint.c (print_name_maybe_canonical): Update.
* break-catch-throw.c (check_status_exception_catchpoint):
Update.
Diffstat (limited to 'gdb/cp-support.c')
-rw-r--r-- | gdb/cp-support.c | 41 |
1 files changed, 20 insertions, 21 deletions
diff --git a/gdb/cp-support.c b/gdb/cp-support.c index 6601272..92a2e3b 100644 --- a/gdb/cp-support.c +++ b/gdb/cp-support.c @@ -274,12 +274,13 @@ inspect_type (struct demangle_parse_info *info, Canonicalize the name again, and store it in the current node (RET_COMP). */ - std::string canon = cp_canonicalize_string_no_typedefs (name); + gdb::unique_xmalloc_ptr<char> canon + = cp_canonicalize_string_no_typedefs (name); - if (!canon.empty ()) + if (canon != nullptr) { /* Copy the canonicalization into the obstack. */ - name = copy_string_to_obstack (&info->obstack, canon.c_str (), &len); + name = copy_string_to_obstack (&info->obstack, canon.get (), &len); } ret_comp->u.s_name.s = name; @@ -506,16 +507,15 @@ replace_typedefs (struct demangle_parse_info *info, /* Parse STRING and convert it to canonical form, resolving any typedefs. If parsing fails, or if STRING is already canonical, - return the empty string. Otherwise return the canonical form. If + return nullptr. Otherwise return the canonical form. If FINDER is not NULL, then type components are passed to FINDER to be looked up. DATA is passed verbatim to FINDER. */ -std::string +gdb::unique_xmalloc_ptr<char> cp_canonicalize_string_full (const char *string, canonicalization_ftype *finder, void *data) { - std::string ret; unsigned int estimated_len; std::unique_ptr<demangle_parse_info> info; @@ -531,41 +531,42 @@ cp_canonicalize_string_full (const char *string, estimated_len); gdb_assert (us); - ret = us.get (); /* Finally, compare the original string with the computed name, returning NULL if they are the same. */ - if (ret == string) - return std::string (); + if (strcmp (us.get (), string) == 0) + return nullptr; + + return us; } - return ret; + return nullptr; } /* Like cp_canonicalize_string_full, but always passes NULL for FINDER. */ -std::string +gdb::unique_xmalloc_ptr<char> cp_canonicalize_string_no_typedefs (const char *string) { return cp_canonicalize_string_full (string, NULL, NULL); } /* Parse STRING and convert it to canonical form. If parsing fails, - or if STRING is already canonical, return the empty string. + or if STRING is already canonical, return nullptr. Otherwise return the canonical form. */ -std::string +gdb::unique_xmalloc_ptr<char> cp_canonicalize_string (const char *string) { std::unique_ptr<demangle_parse_info> info; unsigned int estimated_len; if (cp_already_canonical (string)) - return std::string (); + return nullptr; info = cp_demangled_name_to_comp (string, NULL); if (info == NULL) - return std::string (); + return nullptr; estimated_len = strlen (string) * 2; gdb::unique_xmalloc_ptr<char> us (cp_comp_to_string (info->tree, @@ -575,15 +576,13 @@ cp_canonicalize_string (const char *string) { warning (_("internal error: string \"%s\" failed to be canonicalized"), string); - return std::string (); + return nullptr; } - std::string ret (us.get ()); - - if (ret == string) - return std::string (); + if (strcmp (us.get (), string) == 0) + return nullptr; - return ret; + return us; } /* Convert a mangled name to a demangle_component tree. *MEMORY is |