diff options
author | Tom de Vries <tdevries@suse.de> | 2021-06-21 15:50:51 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2021-06-24 17:44:36 +0200 |
commit | e8165209545eb07a7c2e5d96e31aa5b37e913c3b (patch) | |
tree | 02b14d690d5471a8f22703935d75ba66a9f01e11 | |
parent | fa33eebfca9d560942e456bf9246502dda20b092 (diff) | |
download | binutils-e8165209545eb07a7c2e5d96e31aa5b37e913c3b.zip binutils-e8165209545eb07a7c2e5d96e31aa5b37e913c3b.tar.gz binutils-e8165209545eb07a7c2e5d96e31aa5b37e913c3b.tar.bz2 |
[gdb/symtab] Handle interesting_symbols in read_file_scope
Use the interesting_symbols vector to filter the DIEs that we process when
doing read_file_scope.
At this point we start to get the benefit of lazy expansion:
...
$ time gdb -q -iex "maint set lazy-expand-symtab 0" -batch \
lto/cc1 -ex "b do_rpo_vn"
Breakpoint 1 at 0xd40e30: do_rpo_vn. (2 locations)
real: 5.69
user: 5.47
system: 0.20
...
and with:
...
$ time gdb -q -iex "maint set lazy-expand-symtab 1" -batch \
lto/cc1 -ex "b do_rpo_vn"
Breakpoint 1 at 0xd40e30: do_rpo_vn. (2 locations)
real: 2.75
user: 2.71
system: 0.10
...
-rw-r--r-- | gdb/dwarf2/read.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index dc59ead..6c0dc60 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -10549,9 +10549,32 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu) handle_DW_AT_stmt_list (die, cu, fnd.comp_dir, lowpc); /* Process all dies in compilation unit. */ - for (child_die = die->child; child_die != nullptr && child_die->tag != 0; - child_die = child_die->sibling) - process_die (child_die, 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) + { + if (interesting_symbol_it == cu->per_cu->interesting_symbols->cend ()) + break; + + sect_offset interesting_symbol = *interesting_symbol_it; + + if (interesting_symbol > child_die->sect_off) + continue; + + gdb_assert (interesting_symbol == child_die->sect_off); + std::advance (interesting_symbol_it, 1); + + process_die (child_die, cu); + } + } + else + for (child_die = die->child; child_die != nullptr && child_die->tag != 0; + child_die = child_die->sibling) + process_die (child_die, cu); per_objfile->sym_cu = nullptr; |