[gdb] Accelerate interactive symbols lookup 15x.

Jan Kratochvil jankratochvil at fedoraproject.org
Tue Oct 21 05:55:26 UTC 2014


commit 862e0ed47f67caeedb095ebda1555284f429e594
Author: Jan Kratochvil <jan.kratochvil at redhat.com>
Date:   Tue Oct 21 07:55:19 2014 +0200

    Accelerate interactive symbols lookup 15x.

 gdb-symbols-lookup-accel.patch |  149 ++++++++++++++++++++++++++++++++++++++++
 gdb.spec                       |    9 ++-
 2 files changed, 157 insertions(+), 1 deletions(-)
---
diff --git a/gdb-symbols-lookup-accel.patch b/gdb-symbols-lookup-accel.patch
new file mode 100644
index 0000000..4c90f78
--- /dev/null
+++ b/gdb-symbols-lookup-accel.patch
@@ -0,0 +1,149 @@
+http://sourceware.org/ml/gdb-patches/2014-10/msg00524.html
+Subject: [patch 1/2] Accelerate iter_match_first_hashed 1.8x
+
+
+--17pEHd4RhPHOinZp
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+
+Hi,
+
+very simple caching.  dict_hash() is being called again and again for the same
+string.
+
+#0  in skip_spaces_const (chp=0x7fffb10f9bb6 "ts<char>, std::allocator<char> >::npos") at ./cli/cli-utils.c:244
+#1  in msymbol_hash_iw (string=0x7fffb10f9bb6 "ts<char>, std::allocator<char> >::npos") at minsyms.c:89
+#2  in dict_hash ( string0=0x7fffb10f9b90 "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::npos") at dictionary.c:840
+#3  in iter_match_first_hashed (dict=0x105a7840, name=0x7fffb10f9b90 "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::npos", compare=0x8b82f8 <strcmp_iw>, iterator=0x7fffb10f9970) at dictionary.c:659
+#4  in dict_iter_match_first (dict=0x105a7840, name=0x7fffb10f9b90 "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::npos", compare=0x8b82f8 <strcmp_iw>, iterator=0x7fffb10f9970) at dictionary.c:555
+#5  in dict_iter_name_first (dict=0x105a7840, name=0x7fffb10f9b90 "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::npos", iterator=0x7fffb10f9970) at dictionary.c:541
+#6  in block_iter_name_step (iterator=0x7fffb10f9960, name=0x7fffb10f9b90 "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::npos", first=1) at block.c:580
+#7  in block_iter_name_first (block=0x10593e10, name=0x7fffb10f9b90 "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::npos", iterator=0x7fffb10f9960) at block.c:609
+#8  in lookup_block_symbol (block=0x10593e10, name=0x7fffb10f9b90 "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::npos", domain=VAR_DOMAIN) at symtab.c:2062
+#9  in lookup_symbol_aux_objfile (objfile=0x466f870, block_index=0, name=0x7fffb10f9b90 "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::npos", domain=VAR_DOMAIN) at symtab.c:1664
+#10 in lookup_symbol_global_iterator_cb (objfile=0x466f870, cb_data=0x7fffb10f9ad0) at symtab.c:1868
+
+
+Maybe it could get cached at the caller but:
+ * We would need to pass the hash value along the whole {dict,block}_iter_*
+   call chain.
+ * The DICT_VECTOR virtualization would get violated as dict_linear*_vector do
+   not use any hash values.
+
+
+Jan
+
+--17pEHd4RhPHOinZp
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline; filename="idxcache1.patch"
+
+gdb/
+2014-10-20  Jan Kratochvil  <jan.kratochvil at redhat.com>
+
+	* dictionary.c (iter_match_first_hashed): Provide state cache for
+	hash_index from NAME.
+
+diff --git a/gdb/dictionary.c b/gdb/dictionary.c
+index 055c87e..90bcd6d 100644
+--- a/gdb/dictionary.c
++++ b/gdb/dictionary.c
+@@ -656,9 +656,26 @@ iter_match_first_hashed (const struct dictionary *dict, const char *name,
+ 			 symbol_compare_ftype *compare,
+ 			 struct dict_iterator *iterator)
+ {
+-  unsigned int hash_index = dict_hash (name) % DICT_HASHED_NBUCKETS (dict);
++  unsigned int hash_index;
+   struct symbol *sym;
+ 
++  /* Cache HASH_INDEX.  */
++  {
++    static const char *name_ptr_cached;
++    static char *name_content_cached;
++    static unsigned int dict_hash_cached;
++
++    if (name_ptr_cached != name || strcmp (name_content_cached, name) != 0)
++      {
++	dict_hash_cached = dict_hash (name);
++	name_ptr_cached = name;
++	xfree (name_content_cached);
++	name_content_cached = xstrdup (name);
++      }
++    hash_index = dict_hash_cached;
++  }
++  hash_index %= DICT_HASHED_NBUCKETS (dict);
++
+   DICT_ITERATOR_DICT (iterator) = dict;
+ 
+   /* Loop through the symbols in the given bucket, breaking when SYM
+
+--17pEHd4RhPHOinZp--
+
+http://sourceware.org/ml/gdb-patches/2014-10/msg00525.html
+Subject: [patch 2/2] Accelerate lookup_symbol_aux_objfile 8x
+
+
+--K8nIJk4ghYZn606h
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+
+Hi,
+
+lookup_symbol_aux_objfile() processing is very ineffective.  For each primary
+symtab it searches it and also all its secondary symtabs.  But that means that
+secondary symtabs included in many primary symtabs get needlessly searched
+many times during one lookup_symbol_aux_objfile() run.
+
+lookup_symbol_aux_objfile does not care in which primary/secondary symtab the
+symbol is found.
+
+
+Jan
+
+--K8nIJk4ghYZn606h
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline; filename="idxcache2.patch"
+
+gdb/
+2014-10-20  Jan Kratochvil  <jan.kratochvil at redhat.com>
+
+	* symtab.c (lookup_symbol_aux_objfile): Use ALL_OBJFILE_SYMTABS, inline
+	lookup_block_symbol.
+
+diff --git a/gdb/symtab.c b/gdb/symtab.c
+index c530d50..bc800ef 100644
+--- a/gdb/symtab.c
++++ b/gdb/symtab.c
+@@ -1657,15 +1657,25 @@ lookup_symbol_aux_objfile (struct objfile *objfile, int block_index,
+   const struct block *block;
+   struct symtab *s;
+ 
+-  ALL_OBJFILE_PRIMARY_SYMTABS (objfile, s)
++  gdb_assert (block_index == GLOBAL_BLOCK || block_index == STATIC_BLOCK);
++
++  ALL_OBJFILE_SYMTABS (objfile, s)
+     {
++      struct dict_iterator dict_iter;
++
+       bv = BLOCKVECTOR (s);
+       block = BLOCKVECTOR_BLOCK (bv, block_index);
+-      sym = lookup_block_symbol (block, name, domain);
+-      if (sym)
++
++      for (sym = dict_iter_name_first (block->dict, name, &dict_iter);
++	   sym != NULL;
++	   sym = dict_iter_name_next (name, &dict_iter))
+ 	{
+-	  block_found = block;
+-	  return fixup_symbol_section (sym, objfile);
++	  if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
++				     SYMBOL_DOMAIN (sym), domain))
++	    {
++	      block_found = block;
++	      return fixup_symbol_section (sym, objfile);
++	    }
+ 	}
+     }
+ 
+
+--K8nIJk4ghYZn606h--
+
diff --git a/gdb.spec b/gdb.spec
index 6e190a8..2ed582b 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -26,7 +26,7 @@ Version: 7.8
 
 # The release always contains a leading reserved number, start it at 1.
 # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
-Release: 27%{?dist}
+Release: 28%{?dist}
 
 License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain and GFDL
 Group: Development/Debuggers
@@ -547,6 +547,9 @@ Patch971: gdb-save-breakpoints-fix.patch
 # Fix 'Slow gstack performance' (RH BZ 1103894, Jan Kratochvil).
 Patch973: gdb-slow-gstack-performance.patch
 
+# Accelerate interactive symbols lookup 15x.
+Patch975: gdb-symbols-lookup-accel.patch
+
 %if 0%{!?rhel:1} || 0%{?rhel} > 6
 # RL_STATE_FEDORA_GDB would not be found for:
 # Patch642: gdb-readline62-ask-more-rh.patch
@@ -839,6 +842,7 @@ find -name "*.info*"|xargs rm -f
 %patch970 -p1
 %patch971 -p1
 %patch973 -p1
+%patch975 -p1
 
 %patch848 -p1
 %if 0%{!?el6:1}
@@ -1346,6 +1350,9 @@ then
 fi
 
 %changelog
+* Mon Oct 20 2014 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.8-28.fc21
+- Accelerate interactive symbols lookup 15x.
+
 * Sun Oct 19 2014 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.8-27.fc21
 - Workaround makeinfo F-22 Bug 1154436.
 


More information about the scm-commits mailing list