mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-27 01:28:46 +00:00
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.
This commit is contained in:
@@ -156,26 +156,28 @@ check_status_exception_catchpoint (struct bpstats *bs)
|
||||
if (self->pattern == NULL)
|
||||
return;
|
||||
|
||||
const char *name = nullptr;
|
||||
gdb::unique_xmalloc_ptr<char> canon;
|
||||
try
|
||||
{
|
||||
struct value *typeinfo_arg;
|
||||
std::string canon;
|
||||
|
||||
fetch_probe_arguments (NULL, &typeinfo_arg);
|
||||
type_name = cplus_typename_from_type_info (typeinfo_arg);
|
||||
|
||||
canon = cp_canonicalize_string (type_name.c_str ());
|
||||
if (!canon.empty ())
|
||||
std::swap (type_name, canon);
|
||||
name = (canon == nullptr
|
||||
? canon.get ()
|
||||
: type_name.c_str ());
|
||||
}
|
||||
catch (const gdb_exception_error &e)
|
||||
{
|
||||
exception_print (gdb_stderr, e);
|
||||
}
|
||||
|
||||
if (!type_name.empty ())
|
||||
if (name != nullptr)
|
||||
{
|
||||
if (self->pattern->exec (type_name.c_str (), 0, NULL, 0) != 0)
|
||||
if (self->pattern->exec (name, 0, NULL, 0) != 0)
|
||||
bs->stop = 0;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user