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

Simon Marchi simon.marchi@efficios.com
Tue May 12 21:08:31 GMT 2020


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



More information about the Gdb-patches mailing list