From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca (simark.ca [158.69.221.121]) by sourceware.org (Postfix) with ESMTPS id D611F3851C15 for ; Wed, 13 May 2020 14:52:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org D611F3851C15 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=simark.ca Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=simark@simark.ca Received: from [10.0.0.193] (unknown [192.222.164.54]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 3D2451E5F9; Wed, 13 May 2020 10:52:42 -0400 (EDT) Subject: Re: [PATCH v2 00/42] Share DWARF partial symtabs between objfiles To: Simon Marchi , gdb-patches@sourceware.org References: <20200512210913.5593-1-simon.marchi@efficios.com> From: Simon Marchi Message-ID: <0ffe15c9-93cf-6541-d0ad-8f19ab79b744@simark.ca> Date: Wed, 13 May 2020 10:52:41 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <20200512210913.5593-1-simon.marchi@efficios.com> Content-Type: text/plain; charset=utf-8 Content-Language: tl Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-7.3 required=5.0 tests=BAYES_00, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 13 May 2020 14:52:46 -0000 On 2020-05-12 5:08 p.m., Simon Marchi via Gdb-patches wrote: > 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 > For convenience, I pushed this series on user branch `users/simark/submit/share-dwarf-partial-symtabs-v2`: https://sourceware.org/git/?p=binutils-gdb.git;a=shortlog;h=refs/heads/users/simark/submit/share-dwarf-partial-symtabs-v2 Simon