From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from barracuda.ebox.ca (barracuda.ebox.ca [96.127.255.19]) by sourceware.org (Postfix) with ESMTPS id 01189395383D for ; Tue, 12 May 2020 21:09:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 01189395383D X-ASG-Debug-ID: 1589317755-0c856e18f31444b50001-fS2M51 Received: from smtp.ebox.ca (smtp.ebox.ca [96.127.255.82]) by barracuda.ebox.ca with ESMTP id O7mGeeZuMotmNsnW (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 12 May 2020 17:09:15 -0400 (EDT) X-Barracuda-Envelope-From: simon.marchi@efficios.com X-Barracuda-RBL-Trusted-Forwarder: 96.127.255.82 Received: from epycamd.internal.efficios.com (192-222-181-218.qc.cable.ebox.net [192.222.181.218]) by smtp.ebox.ca (Postfix) with ESMTP id 430BF441D65; Tue, 12 May 2020 17:09:15 -0400 (EDT) From: Simon Marchi X-Barracuda-Effective-Source-IP: 192-222-181-218.qc.cable.ebox.net[192.222.181.218] X-Barracuda-Apparent-Source-IP: 192.222.181.218 X-Barracuda-RBL-IP: 192.222.181.218 To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH v2 00/42] Share DWARF partial symtabs between objfiles Date: Tue, 12 May 2020 17:08:31 -0400 X-ASG-Orig-Subj: [PATCH v2 00/42] Share DWARF partial symtabs between objfiles Message-Id: <20200512210913.5593-1-simon.marchi@efficios.com> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: smtp.ebox.ca[96.127.255.82] X-Barracuda-Start-Time: 1589317755 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://96.127.255.19:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5699 X-Virus-Scanned: by bsmtpd at ebox.ca X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=8.0 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.81805 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Spam-Status: No, score=-26.6 required=5.0 tests=BAYES_00, KAM_DMARC_NONE, KAM_DMARC_STATUS, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_SOFTFAIL, TXREP autolearn=no 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: Tue, 12 May 2020 21:09:18 -0000 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