From: Tom de Vries Date: Fri, 18 Jun 2021 10:02:09 +0000 (+0200) Subject: [gdb/symtab] Expand type of interesting symbol X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3dadba589a50365b5b76cdd32b9789af87876cdb;p=thirdparty%2Fbinutils-gdb.git [gdb/symtab] Expand type of interesting symbol When looking up a variable, make sure its type is also marked as interesting. --- diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index e6789666431..cf6dc08367c 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -10552,23 +10552,31 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu) if (lazy_expand_symtab_p && cu->per_cu->interesting_symbols && cu->per_cu->interesting_symbols->size () > 0) { - auto interesting_symbol_it = cu->per_cu->interesting_symbols->cbegin (); - - for (child_die = die->child; child_die != nullptr && child_die->tag != 0; - child_die = child_die->sibling) + std::set expanded; + while (expanded.size () != cu->per_cu->interesting_symbols->size ()) { - if (interesting_symbol_it == cu->per_cu->interesting_symbols->cend ()) - break; + auto interesting_symbol_it = cu->per_cu->interesting_symbols->cbegin (); - sect_offset interesting_symbol = *interesting_symbol_it; + for (child_die = die->child; child_die != nullptr && child_die->tag != 0; + child_die = child_die->sibling) + { + if (interesting_symbol_it == cu->per_cu->interesting_symbols->cend ()) + break; - if (interesting_symbol > child_die->sect_off) - continue; + sect_offset interesting_symbol = *interesting_symbol_it; - gdb_assert (interesting_symbol == child_die->sect_off); - std::advance (interesting_symbol_it, 1); + if (interesting_symbol > child_die->sect_off) + continue; - process_die (child_die, cu); + gdb_assert (interesting_symbol == child_die->sect_off); + std::advance (interesting_symbol_it, 1); + + if (expanded.count (interesting_symbol) == 1) + continue; + expanded.emplace (interesting_symbol); + + process_die (child_die, cu); + } } } else @@ -22302,6 +22310,16 @@ lookup_die_type (struct die_info *die, const struct attribute *attr, from an inter-CU reference and the type's CU got expanded before ours. */ this_type = read_type_die (type_die, type_cu); + if (lazy_expand_symtab_p + && type_cu == cu && type_cu->per_cu->interesting_symbols) + { + struct die_info *interesting_die = type_die; + while (interesting_die->parent != nullptr + && interesting_die->parent->parent != nullptr) + interesting_die = interesting_die->parent; + gdb_assert (type_cu->header.sect_off < interesting_die->sect_off); + type_cu->per_cu->interesting_symbols->emplace (interesting_die->sect_off); + } } /* If we still don't have a type use an error marker. */