From 62e77f56f0ce8b10122881d8f0acd70e113fde93 Mon Sep 17 00:00:00 2001 From: Christian Biesinger Date: Mon, 18 Nov 2019 20:48:36 -0600 Subject: [PATCH] Turn off threaded minsym demangling by default Per discussion on gdb-patches with Joel, this patch turns off multihreaded symbol loading by default. It can be turned on using: maint set worker-threads unlimited To keep the behavior as close as possible to the old code, it still calls symbol_set_names in the old place if n_worker_threads is 0. gdb/ChangeLog: 2019-11-27 Christian Biesinger * maint.c (n_worker_threads): Default to 0. (worker_threads_disabled): New function. * maint.h (worker_threads_disabled): New function. * minsyms.c (minimal_symbol_reader::record_full): Call symbol_set_names here if worker_threads_disabled () is true. (minimal_symbol_reader::install): Skip all threading if worker_threads_disabled () is true. Change-Id: I92ba4f6bbf07363189666327cad452d6b9c8e01d --- gdb/ChangeLog | 10 ++++++++++ gdb/maint.c | 7 ++++++- gdb/maint.h | 2 ++ gdb/minsyms.c | 18 +++++++++++++++--- 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 64c8ab52cf1..3033cf6455a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2019-11-27 Christian Biesinger + + * maint.c (n_worker_threads): Default to 0. + (worker_threads_disabled): New function. + * maint.h (worker_threads_disabled): New function. + * minsyms.c (minimal_symbol_reader::record_full): Call symbol_set_names + here if worker_threads_disabled () is true. + (minimal_symbol_reader::install): Skip all threading if + worker_threads_disabled () is true. + 2019-11-27 Christian Biesinger * minsyms.c (add_minsym_to_hash_table): Use a previously computed diff --git a/gdb/maint.c b/gdb/maint.c index 7ab3fdb64c1..dbc949a61c0 100644 --- a/gdb/maint.c +++ b/gdb/maint.c @@ -845,7 +845,12 @@ maintenance_set_profile_cmd (const char *args, int from_tty, } #endif -static int n_worker_threads = -1; +static int n_worker_threads = 0; + +bool worker_threads_disabled () +{ + return n_worker_threads == 0; +} /* Update the thread pool for the desired number of threads. */ static void diff --git a/gdb/maint.h b/gdb/maint.h index 827964d8253..cbaf9deaa88 100644 --- a/gdb/maint.h +++ b/gdb/maint.h @@ -26,6 +26,8 @@ extern void set_per_command_time (int); extern void set_per_command_space (int); +extern bool worker_threads_disabled (); + /* Records a run time and space usage to be used as a base for reporting elapsed time or change in space. */ diff --git a/gdb/minsyms.c b/gdb/minsyms.c index 94240c9955e..4f7260b3803 100644 --- a/gdb/minsyms.c +++ b/gdb/minsyms.c @@ -54,6 +54,7 @@ #include #include "safe-ctype.h" #include "gdbsupport/parallel-for.h" +#include "maint.h" #if CXX_STD_THREAD #include @@ -1137,6 +1138,15 @@ minimal_symbol_reader::record_full (gdb::string_view name, else msymbol->name = name.data (); + if (worker_threads_disabled ()) + { + /* To keep our behavior as close as possible to the previous non-threaded + behavior for GDB 9.1, we call symbol_set_names here when threads + are disabled. */ + symbol_set_names (msymbol, msymbol->name, false, m_objfile->per_bfd); + msymbol->name_set = 1; + } + SET_MSYMBOL_VALUE_ADDRESS (msymbol, address); MSYMBOL_SECTION (msymbol) = section; @@ -1407,10 +1417,12 @@ minimal_symbol_reader::install () (msym, demangled_name, &m_objfile->per_bfd->storage_obstack); msym->name_set = 1; - - hash_values[idx].mangled_name_hash - = fast_hash (msym->name, hash_values[idx].name_length); } + /* This mangled_name_hash computation has to be outside of + the name_set check, or symbol_set_names below will + be called with an invalid hash value. */ + hash_values[idx].mangled_name_hash + = fast_hash (msym->name, hash_values[idx].name_length); hash_values[idx].minsym_hash = msymbol_hash (msym->linkage_name ()); /* We only use this hash code if the search name differs -- 2.30.2