diff options
author | Tom de Vries <tdevries@suse.de> | 2021-06-18 12:02:09 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2021-06-24 17:48:26 +0200 |
commit | 3dadba589a50365b5b76cdd32b9789af87876cdb (patch) | |
tree | 8bc00d84741ab1e8d2ac91fe7adb3a07aa5c63bd | |
parent | 7cfa3f39ada3a8c2ac875e4fdd10a8be65c968b7 (diff) | |
download | binutils-3dadba589a50365b5b76cdd32b9789af87876cdb.zip binutils-3dadba589a50365b5b76cdd32b9789af87876cdb.tar.gz binutils-3dadba589a50365b5b76cdd32b9789af87876cdb.tar.bz2 |
[gdb/symtab] Expand type of interesting symbol
When looking up a variable, make sure its type is also marked as interesting.
-rw-r--r-- | gdb/dwarf2/read.c | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index e678966..cf6dc08 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<sect_offset> 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. */ |