[PATCH v2 00/42] Share DWARF partial symtabs between objfiles

Simon Marchi
2020-05-12T21:09:17Z

This is version 2 of this patchset originally written by Tom:

https://sourceware.org/legacy-ml/gdb-patches/2020-02/msg00594.html

The current patchset therefore contains a mix of Tom's patches that I modified,
plus a few new patches. I won't repeat everything that is said in the cover
letter of that patchset, please read that to understand the motivation behind
this change..

The big difference between v1 and v2 is how the split is done. In v1, the
object structure looks like this:

objfile -> dwarf2_per_objfile -> dwarf2_unshareable

where `dwarf2_per_objfile` is actually shared between objfiles (there is one
copy per BFD), and `dwarf2_unshareable` is not (there is one copy per objfile).
The dwarf2_per_objfile -> dwarf2_unshareable link is updated at all entry
points of the DWARF code based on what is the current objfile.

The current patchset (v2) proposes this structure instead, which in my opinion
is more natural:

objfile -> dwarf2_per_objfile -> dwarf2_per_bfd

Where `dwarf2_per_objfile` is really per-objfile (there is one copy per
objfile) and `dwarf2_per_bfd` is per-bfd (there is one copy per-bfd). There is
no link to update, whatever is shared between objfiles is put in
`dwarf2_per_bfd` and each `dwarf2_per_objfile` always points to one
`dwarf2_per_bfd`.

Since there were performance numbers with the original patchset, I made my own
here to see if the speedups were still there. Like in the original patchset, I
set "maintenance time 1" and did "add-inferior -exec ./gdb" after "./gdb gdb".
I disabled any auto-loading to avoid loading gdb-gdb.{gdb,py}. GDB is built
with -O2 and gcc 9, and it is running on an AMD EPYC 7351P.

Before: Command execution time: 1.213480 (cpu), 1.214268 (wall)
After: Command execution time: 0.001697 (cpu), 0.001694 (wall)

These are the times of one run, but all runs I did are very close. The "after"
time is surpringly low compared to the original numbers, I hope it doesn't mean
I messed up something and we are skipping something important...

At some point I tested with all these boards and did not see any regression
(they helped very much to find some issues in the process though):

unix cc-with-debug-names cc-with-dwz cc-with-dwz-m cc-with-gdb-index dwarf4-gdb-index fission-dwp fission readnow

I have since rebased the patchset and resolved conflicts, it's therefore
possible I messed something up.

Simon Marchi (35):
Split dwarf2_per_objfile into dwarf2_per_objfile and dwarf2_per_bfd
Remove symtab links from dwarf2_psymtab and dwarf2_per_cu_quick_data
Move die_type_hash to dwarf2_per_objfile
Add dwarf2_per_objfile field to dwarf2_cu
Remove reference to dwarf2_per_cu_data::dwarf2_per_objfile in
dw2_do_instantiate_symtab
Remove dwarf2_cu->per_cu->dwarf2_per_objfile references
Add dwarf2_per_bfd field to dwarf2_per_cu_data
Make dwarf2_get_dwz_file take a dwarf2_per_bfd
Use bfd_get_filename instead of objfile_name in lookup_dwo_unit
Add dwarf2_per_objfile parameter to cutu_reader's constructors
Make queue_and_load_dwo_tu receive a dwarf2_cu
Remove dwarf2_per_cu_data::dwarf2_per_objfile reference in
cutu_reader::keep
Add dwarf2_per_objfile parameter to create_partial_symtab
Add dwarf2_per_objfile parameter to recursively_compute_inclusions
Add dwarf2_per_objfile parameter to process_full_{comp,type}_unit
Pass dwarf2_cu objects to dwo-related functions, instead of
dwarf2_per_cu_data
Remove reference to dwarf2_per_cu_data::dwarf2_per_objfile in
queue_and_load_all_dwo_tus
Move int type methods out of dwarf2_per_cu_data
Add dwarf2_per_objfile to dwarf_expr_context and dwarf2_frame_cache
Remove dwarf2_per_cu_data::text_offset
Add dwarf2_per_objfile parameter to dwarf2_read_addr_index
Add dwarf2_per_objfile parameter to allocate_piece_closure
Add dwarf2_per_objfile parameters to dwarf2_fetch_* functions
Remove dwarf2_per_cu_data::objfile ()
Add dwarf2_per_objfile parameter to free_one_cached_comp_unit
Add dwarf2_per_objfile parameter to get_die_type_at_offset
Remove leftover references to dwarf2_per_cu_data::dwarf2_per_objfile
Remove dwarf2_per_cu_data::dwarf2_per_objfile
Pass dwarf2_per_bfd instead of dwarf2_per_objfile to some
index-related functions
Pass dwarf2_cu to process_full_{comp,type}_unit
Make load_cu return the loaded dwarf2_cu
Add comp_unit_head to dwarf2_per_cu_data
Pass existing_cu object to cutu_reader
Replace dwarf2_per_cu_data::cu backlink with per-objfile map
Make mapped_debug_names independent of objfile

Tom Tromey (7):
Introduce dwarf2_per_objfile::obstack
Add "objfile" parameter to two partial_symtab methods
Add dwarf2_per_cu_data::index
Add dwarf2_per_objfile member to DWARF batons
Split type_unit_group
Move signatured_type::type to unshareable object
Share DWARF partial symtabs

gdb/compile/compile-loc2c.c | 20 +-
gdb/compile/compile.h | 13 +-
gdb/dwarf2/expr.c | 11 +-
gdb/dwarf2/expr.h | 11 +-
gdb/dwarf2/frame.c | 67 +-
gdb/dwarf2/index-cache.c | 2 +-
gdb/dwarf2/index-write.c | 51 +-
gdb/dwarf2/loc.c | 289 ++--
gdb/dwarf2/loc.h | 11 +-
gdb/dwarf2/macro.c | 11 +-
gdb/dwarf2/read.c | 2490 ++++++++++++++++++-----------------
gdb/dwarf2/read.h | 298 +++--
gdb/gdbtypes.h | 8 +-
gdb/objfiles.h | 2 +-
gdb/psympriv.h | 19 +-
gdb/psymtab.c | 44 +-
16 files changed, 1848 insertions(+), 1499 deletions(-)

--
2.26.2