public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] De-duplicate .gdb_index
@ 2022-04-25 18:48 Tom Tromey
  0 siblings, 0 replies; only message in thread
From: Tom Tromey @ 2022-04-25 18:48 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This de-duplicates variables and types in .gdb_index, making the new
index closer to what gdb generated before the new DWARF scanner
series.  Spot-checking the resulting index for gdb itself, it seems
that the new scanner picks up some extra symbols not detected by the
old one.  I tested both the new and old versions of gdb on both new
and old versions of the index, and startup time in all cases is
roughly the same (it's worth noting that, for gdb itself, the index no
longer provides any benefit over the DWARF scanner).  So, I think this
fixes the size issue with the new index writer.

Regression tested on x86-64 Fedora 34.
---
 gdb/dwarf2/index-write.c | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c
index a5ab67f3163..ef43370fdcb 100644
--- a/gdb/dwarf2/index-write.c
+++ b/gdb/dwarf2/index-write.c
@@ -1103,6 +1103,15 @@ write_cooked_index (cooked_index_vector *table,
 		    const cu_index_map &cu_index_htab,
 		    struct mapped_symtab *symtab)
 {
+  /* We track type names and only enter a given type once.  */
+  htab_up type_names (htab_create_alloc (10, htab_hash_string, htab_eq_string,
+					 nullptr, xcalloc, xfree));
+  /* Same with variable names.  However, if a type and variable share
+     a name, we want both, which is why there are two hash tables
+     here.  */
+  htab_up var_names (htab_create_alloc (10, htab_hash_string, htab_eq_string,
+					nullptr, xcalloc, xfree));
+
   for (const cooked_index_entry *entry : table->all_entries ())
     {
       /* GDB never put linkage names into .gdb_index.  The theory here
@@ -1124,12 +1133,24 @@ write_cooked_index (cooked_index_vector *table,
       else if (entry->tag == DW_TAG_variable
 	       || entry->tag == DW_TAG_constant
 	       || entry->tag == DW_TAG_enumerator)
-	kind = GDB_INDEX_SYMBOL_KIND_VARIABLE;
+	{
+	  kind = GDB_INDEX_SYMBOL_KIND_VARIABLE;
+	  void **slot = htab_find_slot (var_names.get (), name, INSERT);
+	  if (*slot != nullptr)
+	    continue;
+	  *slot = (void *) name;
+	}
       else if (entry->tag == DW_TAG_module
 	       || entry->tag == DW_TAG_common_block)
 	kind = GDB_INDEX_SYMBOL_KIND_OTHER;
       else
-	kind = GDB_INDEX_SYMBOL_KIND_TYPE;
+	{
+	  kind = GDB_INDEX_SYMBOL_KIND_TYPE;
+	  void **slot = htab_find_slot (type_names.get (), name, INSERT);
+	  if (*slot != nullptr)
+	    continue;
+	  *slot = (void *) name;
+	}
 
       add_index_entry (symtab, name, (entry->flags & IS_STATIC) != 0,
 		       kind, it->second);
-- 
2.34.1


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-04-25 18:48 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-25 18:48 [PATCH] De-duplicate .gdb_index Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).