aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2021-06-18 12:02:09 +0200
committerTom de Vries <tdevries@suse.de>2021-06-24 17:48:26 +0200
commit3dadba589a50365b5b76cdd32b9789af87876cdb (patch)
tree8bc00d84741ab1e8d2ac91fe7adb3a07aa5c63bd
parent7cfa3f39ada3a8c2ac875e4fdd10a8be65c968b7 (diff)
downloadbinutils-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.c42
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. */