aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarf2
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2020-05-28 17:26:22 +0200
committerTom de Vries <tdevries@suse.de>2020-05-28 17:26:22 +0200
commitf030440daa989ae3dadc1fa4342cfa16d690db3c (patch)
treee551a19ef1af3a4e83594dccb72bdf4b6d5af4bc /gdb/dwarf2
parent9e85f042a6eda1cd96cc95e66f80db95f28d4557 (diff)
downloadgdb-f030440daa989ae3dadc1fa4342cfa16d690db3c.zip
gdb-f030440daa989ae3dadc1fa4342cfa16d690db3c.tar.gz
gdb-f030440daa989ae3dadc1fa4342cfa16d690db3c.tar.bz2
[gdb/symtab] Make gold index workaround more precise
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".
Diffstat (limited to 'gdb/dwarf2')
-rw-r--r--gdb/dwarf2/read.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index a62224c..25f05fb 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -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. */