diff options
author | Tom Tromey <tromey@adacore.com> | 2022-10-17 12:21:10 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2022-10-21 09:54:38 -0600 |
commit | 2afd002ac6acb01763d643686345cc0c6ad564bd (patch) | |
tree | fb27197f49373e6455523b3180494eca98981283 /gdb/dwarf2/cooked-index.h | |
parent | e379f6521a9fbc65de8cd90a950e28d0ca522ae3 (diff) | |
download | binutils-2afd002ac6acb01763d643686345cc0c6ad564bd.zip binutils-2afd002ac6acb01763d643686345cc0c6ad564bd.tar.gz binutils-2afd002ac6acb01763d643686345cc0c6ad564bd.tar.bz2 |
Fix incorrect .gdb_index with new DWARF scanner
PR symtab/29694 points out a regression caused by the new DWARF
scanner when the cc-with-gdb-index target board is used.
What happens here is that an older version of gdb will make an index
describing the "A" type as:
[737] A: 1 [global, type]
whereas the new gdb says:
[1008] A: 0 [global, type]
Here the old one is correct because the A in CU 0 is just a
declaration without a size:
<1><45>: Abbrev Number: 10 (DW_TAG_structure_type)
<46> DW_AT_name : A
<48> DW_AT_declaration : 1
<48> DW_AT_sibling : <0x6d>
This patch fixes the problem by introducing the idea of a "type
declaration". I think gdb still needs to recurse into these types,
searching for methods, but by marking the type itself as a
declaration, gdb can skip this type during lookups and when writing
the index.
Regression tested on x86-64 using the cc-with-gdb-index board.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29694
Diffstat (limited to 'gdb/dwarf2/cooked-index.h')
-rw-r--r-- | gdb/dwarf2/cooked-index.h | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/gdb/dwarf2/cooked-index.h b/gdb/dwarf2/cooked-index.h index f3c2648..2ea3278 100644 --- a/gdb/dwarf2/cooked-index.h +++ b/gdb/dwarf2/cooked-index.h @@ -48,6 +48,9 @@ enum cooked_index_flag_enum : unsigned char IS_ENUM_CLASS = 4, /* True if this entry uses the linkage name. */ IS_LINKAGE = 8, + /* True if this entry is just for the declaration of a type, not the + definition. */ + IS_TYPE_DECLARATION = 16, }; DEF_ENUM_FLAGS_TYPE (enum cooked_index_flag_enum, cooked_index_flag); @@ -76,6 +79,10 @@ struct cooked_index_entry : public allocate_on_obstack /* Return true if this entry matches SEARCH_FLAGS. */ bool matches (block_search_flags search_flags) const { + /* Just reject type declarations. */ + if ((flags & IS_TYPE_DECLARATION) != 0) + return false; + if ((search_flags & SEARCH_STATIC_BLOCK) != 0 && (flags & IS_STATIC) != 0) return true; @@ -88,6 +95,10 @@ struct cooked_index_entry : public allocate_on_obstack /* Return true if this entry matches DOMAIN. */ bool matches (domain_enum domain) const { + /* Just reject type declarations. */ + if ((flags & IS_TYPE_DECLARATION) != 0) + return false; + switch (domain) { case LABEL_DOMAIN: @@ -106,6 +117,10 @@ struct cooked_index_entry : public allocate_on_obstack /* Return true if this entry matches KIND. */ bool matches (enum search_domain kind) const { + /* Just reject type declarations. */ + if ((flags & IS_TYPE_DECLARATION) != 0) + return false; + switch (kind) { case VARIABLES_DOMAIN: |