public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Jan Kratochvil <jan.kratochvil@redhat.com>
To: git-commits@fedoraproject.org
Subject: [rpms/gdb] gdb-17.2-rebase-f44: Accelerate interactive symbols lookup 15x.
Date: Sat, 27 Jun 2026 23:56:51 GMT [thread overview]
Message-ID: <178260461193.1.6221437688458964167.rpms-gdb-862e0ed47f67@fedoraproject.org> (raw)
A new commit has been pushed.
Repo : rpms/gdb
Branch : gdb-17.2-rebase-f44
Commit : 862e0ed47f67caeedb095ebda1555284f429e594
Author : Jan Kratochvil <jan.kratochvil@redhat.com>
Date : 2014-10-21T07:55:19+02:00
Stats : +157/-1 in 2 file(s)
URL : https://src.fedoraproject.org/rpms/gdb/c/862e0ed47f67caeedb095ebda1555284f429e594?branch=gdb-17.2-rebase-f44
Log:
Accelerate interactive symbols lookup 15x.
---
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@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@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@redhat.com> - 7.8-28.fc21
+- Accelerate interactive symbols lookup 15x.
+
* Sun Oct 19 2014 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.8-27.fc21
- Workaround makeinfo F-22 Bug 1154436.
reply other threads:[~2026-06-27 23:56 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=178260461193.1.6221437688458964167.rpms-gdb-862e0ed47f67@fedoraproject.org \
--to=jan.kratochvil@redhat.com \
--cc=git-commits@fedoraproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox