[gdb/symtab] Make gold index workaround more precise
authorTom de Vries <tdevries@suse.de>
Thu, 28 May 2020 15:26:22 +0000 (17:26 +0200)
committerTom de Vries <tdevries@suse.de>
Thu, 28 May 2020 15:26:22 +0000 (17:26 +0200)
There's a PR gold/15646 - "gold-generated .gdb_index has duplicated
symbols that gdb-generated index doesn't", that causes gold to generate
duplicate symbols in the index.

F.i., a namespace N1 declared in a header file can be listed for two CUs that
include the header file:
...
[759] N1:
        2 [global type]
        3 [global type]
...

This causes a gdb performance problem: f.i. when attempting to set a
breakpoint on a non-existing function N1::misspelled, the symtab for both CUs
will be expanded.

Gdb contains a workaround for this, added in commit 8943b87476 "Work around
gold/15646", that skips duplicate global symbols in the index.

However, the workaround does not check for the symbol kind ("type" in the
example above).

Make the workaround more precise by limiting it to symbol kind "type".

Tested on x86_64-linux, with target boards cc-with-gdb-index and
gold-gdb-index.

gdb/ChangeLog:

2020-05-28  Tom de Vries  <tdevries@suse.de>

* dwarf2/read.c (dw2_symtab_iter_next, dw2_expand_marked_cus): Limit
PR gold/15646 workaround to symbol kind "type".

gdb/ChangeLog
gdb/dwarf2/read.c

index 90577b7e61eb34431558856c84a258d63991dcf4..593ff01cc9d031fc0b9ff3aef3f48ccf74022bdb 100644 (file)
@@ -1,3 +1,8 @@
+2020-05-28  Tom de Vries  <tdevries@suse.de>
+
+       * dwarf2/read.c (dw2_symtab_iter_next, dw2_expand_marked_cus): Limit
+       PR gold/15646 workaround to symbol kind "type".
+
 2020-05-27  Tom Tromey  <tromey@adacore.com>
 
        * dwarf2/read.c (load_partial_dies): Use add_partial_symbol.
index a62224c0be2ae87d0e8295019640677eef8b4ee9..25f05fb99302c2622d8a940eb889c731db536bb0 100644 (file)
@@ -3522,10 +3522,14 @@ dw2_symtab_iter_next (struct dw2_symtab_iterator *iter)
            }
 
          /* Work around gold/15646.  */
-         if (!is_static && iter->global_seen)
-           continue;
-         if (!is_static)
-           iter->global_seen = 1;
+         if (!is_static
+             && symbol_kind == GDB_INDEX_SYMBOL_KIND_TYPE)
+           {
+             if (iter->global_seen)
+               continue;
+
+             iter->global_seen = 1;
+           }
        }
 
       /* Only check the symbol's kind if it has one.  */
@@ -4627,12 +4631,14 @@ dw2_expand_marked_cus
         && symbol_kind != GDB_INDEX_SYMBOL_KIND_NONE);
 
       /* Work around gold/15646.  */
-      if (attrs_valid)
+      if (attrs_valid
+         && !is_static
+         && symbol_kind == GDB_INDEX_SYMBOL_KIND_TYPE)
        {
-         if (!is_static && global_seen)
+         if (global_seen)
            continue;
-         if (!is_static)
-           global_seen = true;
+
+         global_seen = true;
        }
 
       /* Only check the symbol's kind if it has one.  */