forked from Imagelibrary/binutils-gdb
Demangle minsyms in parallel
This patch introduces a simple parallel for_each and changes the minimal symbol reader to use it when computing the demangled name for a minimal symbol. This yields a speedup when reading minimal symbols. 2019-11-26 Christian Biesinger <cbiesinger@google.com> Tom Tromey <tom@tromey.com> * minsyms.c (minimal_symbol_reader::install): Use parallel_for_each. * gdbsupport/parallel-for.h: New file. * Makefile.in (HFILES_NO_SRCDIR): Add gdbsupport/parallel-for.h. Change-Id: I220341f70e94dd02df5dd424272c50a5afb64978
This commit is contained in:
21
gdb/symtab.c
21
gdb/symtab.c
@@ -787,13 +787,9 @@ create_demangled_names_hash (struct objfile_per_bfd_storage *per_bfd)
|
||||
free_demangled_name_entry, xcalloc, xfree));
|
||||
}
|
||||
|
||||
/* Try to determine the demangled name for a symbol, based on the
|
||||
language of that symbol. If the language is set to language_auto,
|
||||
it will attempt to find any demangling algorithm that works and
|
||||
then set the language appropriately. The returned name is allocated
|
||||
by the demangler and should be xfree'd. */
|
||||
/* See symtab.h */
|
||||
|
||||
static char *
|
||||
char *
|
||||
symbol_find_demangled_name (struct general_symbol_info *gsymbol,
|
||||
const char *mangled)
|
||||
{
|
||||
@@ -894,8 +890,15 @@ symbol_set_names (struct general_symbol_info *gsymbol,
|
||||
else
|
||||
linkage_name_copy = linkage_name;
|
||||
|
||||
gdb::unique_xmalloc_ptr<char> demangled_name_ptr
|
||||
(symbol_find_demangled_name (gsymbol, linkage_name_copy.data ()));
|
||||
/* The const_cast is safe because the only reason it is already
|
||||
initialized is if we purposefully set it from a background
|
||||
thread to avoid doing the work here. However, it is still
|
||||
allocated from the heap and needs to be freed by us, just
|
||||
like if we called symbol_find_demangled_name here. */
|
||||
gdb::unique_xmalloc_ptr<char> demangled_name
|
||||
(gsymbol->language_specific.demangled_name
|
||||
? const_cast<char *> (gsymbol->language_specific.demangled_name)
|
||||
: symbol_find_demangled_name (gsymbol, linkage_name_copy.data ()));
|
||||
|
||||
/* Suppose we have demangled_name==NULL, copy_name==0, and
|
||||
linkage_name_copy==linkage_name. In this case, we already have the
|
||||
@@ -929,7 +932,7 @@ symbol_set_names (struct general_symbol_info *gsymbol,
|
||||
new (*slot) demangled_name_entry
|
||||
(gdb::string_view (mangled_ptr, linkage_name.length ()));
|
||||
}
|
||||
(*slot)->demangled = std::move (demangled_name_ptr);
|
||||
(*slot)->demangled = std::move (demangled_name);
|
||||
(*slot)->language = gsymbol->language;
|
||||
}
|
||||
else if (gsymbol->language == language_unknown
|
||||
|
||||
Reference in New Issue
Block a user