From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gateway31.websitewelcome.com (gateway31.websitewelcome.com [192.185.144.94]) by sourceware.org (Postfix) with ESMTPS id A0BEE382E834 for ; Sun, 28 Feb 2021 20:38:14 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org A0BEE382E834 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=tromey.com Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=tom@tromey.com Received: from cm10.websitewelcome.com (cm10.websitewelcome.com [100.42.49.4]) by gateway31.websitewelcome.com (Postfix) with ESMTP id 477F520497 for ; Sun, 28 Feb 2021 14:38:14 -0600 (CST) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id GSpSlTTmDkscSGSpSlawvm; Sun, 28 Feb 2021 14:38:14 -0600 X-Authority-Reason: nr=8 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Sender:Reply-To:Cc:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=aT/oeeFV+SRqi7DXld3CpOSFHwV/TM07DrYnLy2MmNc=; b=vdR78uV4DwxD28XtM/DSkEkjRS Bh97TuGB+2voN7vkY31sxcGskKOGHW3RJbbhyCrVynv5e4CeOMM7BcUHf1Yw8RNZ20dI3QhtO1IwZ EYW9dwhP2TkjpZEszlh9ylqL/; Received: from 97-122-70-152.hlrn.qwest.net ([97.122.70.152]:36732 helo=localhost.localdomain) by box5379.bluehost.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.93) (envelope-from ) id 1lGSpR-000Xkq-Ou for gdb-patches@sourceware.org; Sun, 28 Feb 2021 13:38:13 -0700 From: Tom Tromey To: gdb-patches@sourceware.org Subject: [PATCH 17/26] Attach partial symtab storage to psymbol_functions Date: Sun, 28 Feb 2021 13:37:54 -0700 Message-Id: <20210228203803.1693413-18-tom@tromey.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210228203803.1693413-1-tom@tromey.com> References: <20210228203803.1693413-1-tom@tromey.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - box5379.bluehost.com X-AntiAbuse: Original Domain - sourceware.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - tromey.com X-BWhitelist: no X-Source-IP: 97.122.70.152 X-Source-L: No X-Exim-ID: 1lGSpR-000Xkq-Ou X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: 97-122-70-152.hlrn.qwest.net (localhost.localdomain) [97.122.70.152]:36732 X-Source-Auth: tom+tromey.com X-Email-Count: 18 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes X-Spam-Status: No, score=-3034.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, JMQ_SPF_NEUTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_NEUTRAL, 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: Sun, 28 Feb 2021 20:38:16 -0000 Currently, the storage for partial symtabs is attached to the objfile. Ultimately, though, this direct assocation will be removed, and the storage will be owned by the psymbol_functions object. This patch is a step toward this goal. The storage is already managed as a shared_ptr, to enable cross-objfile sharing, so this adds a reference from the psymbol_functions, and changes some code in psymtab.c to use this reference instead. gdb/ChangeLog 2021-02-28 Tom Tromey * dwarf2/read.c (dwarf2_build_psymtabs): Call set_partial_symtabs. * symfile.c (syms_from_objfile_1, reread_symbols): Update. * psymtab.h (make_psymbol_functions): Add partial_symtabs parameter. * psymtab.c (find_pc_sect_psymtab): Add partial_symtabs parameter. (psymbol_functions::find_pc_sect_compunit_symtab) (psymbol_functions::print_stats, psymbol_functions::dump) (psymbol_functions::has_symbols): Update. (make_psymbol_functions, dump_psymtab_addrmap): Add partial_symtabs parameter. (maintenance_print_psymbols): Update. (psymbol_functions::expand_symtabs_matching): Update. * psympriv.h (struct psymbol_functions): Add constructor. : New member. : New method. --- gdb/ChangeLog | 20 ++++++++++++++++++ gdb/dwarf2/read.c | 6 ++++++ gdb/psympriv.h | 15 ++++++++++++++ gdb/psymtab.c | 52 ++++++++++++++++++++++++++++------------------- gdb/psymtab.h | 3 ++- gdb/symfile.c | 4 ++-- 6 files changed, 76 insertions(+), 24 deletions(-) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 9aaf484a31e..3a050b351a0 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -6358,6 +6358,12 @@ dwarf2_build_psymtabs (struct objfile *objfile) /* Partial symbols were already read, so now we can simply attach them. */ objfile->partial_symtabs = per_bfd->partial_symtabs; + /* This is a temporary hack to ensure that the objfile and 'qf' + psymtabs are identical. */ + psymbol_functions *psf + = dynamic_cast (objfile->qf.get ()); + gdb_assert (psf != nullptr); + psf->set_partial_symtabs (per_bfd->partial_symtabs); per_objfile->resize_symtabs (); return; } diff --git a/gdb/psympriv.h b/gdb/psympriv.h index 943d6c13919..b1b8027ce3a 100644 --- a/gdb/psympriv.h +++ b/gdb/psympriv.h @@ -476,6 +476,11 @@ class psymtab_discarder partial symbols. */ struct psymbol_functions : public quick_symbol_functions { + explicit psymbol_functions (const std::shared_ptr &storage) + : m_partial_symtabs (storage) + { + } + bool has_symbols (struct objfile *objfile) override; struct symtab *find_last_source_symtab (struct objfile *objfile) override; @@ -540,6 +545,13 @@ struct psymbol_functions : public quick_symbol_functions m_psymbol_map.clear (); } + /* Replace the partial symbol table storage in this object with + SYMS. */ + void set_partial_symtabs (const std::shared_ptr &syms) + { + m_partial_symtabs = syms; + } + private: void fill_psymbol_map (struct objfile *objfile, @@ -547,6 +559,9 @@ struct psymbol_functions : public quick_symbol_functions std::set *seen_addrs, const std::vector &symbols); + /* Storage for the partial symbols. */ + std::shared_ptr m_partial_symtabs; + /* Map symbol addresses to the partial symtab that defines the object at that address. */ diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 867b71530eb..1549ead04d0 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -275,7 +275,9 @@ find_pc_sect_psymtab_closer (struct objfile *objfile, psymtab that contains a symbol whose address is closest to PC. */ static struct partial_symtab * -find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc, +find_pc_sect_psymtab (struct objfile *objfile, + psymtab_storage *partial_symtabs, + CORE_ADDR pc, struct obj_section *section, struct bound_minimal_symbol msymbol) { @@ -291,14 +293,14 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc, partial symtabs then we will end up returning a pointer to an object that is not a partial_symtab, which doesn't end well. */ - if (objfile->partial_symtabs->psymtabs != NULL - && objfile->partial_symtabs->psymtabs_addrmap != NULL) + if (partial_symtabs->psymtabs != NULL + && partial_symtabs->psymtabs_addrmap != NULL) { CORE_ADDR baseaddr = objfile->text_section_offset (); struct partial_symtab *pst = ((struct partial_symtab *) - addrmap_find (objfile->partial_symtabs->psymtabs_addrmap, + addrmap_find (partial_symtabs->psymtabs_addrmap, pc - baseaddr)); if (pst != NULL) { @@ -367,7 +369,9 @@ psymbol_functions::find_pc_sect_compunit_symtab struct obj_section *section, int warn_if_readin) { - struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc, section, + struct partial_symtab *ps = find_pc_sect_psymtab (objfile, + m_partial_symtabs.get (), + pc, section, msymbol); if (ps != NULL) { @@ -1013,12 +1017,12 @@ psymbol_functions::print_stats (struct objfile *objfile, bool print_bcache) printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"), i); printf_filtered (_(" Total memory used for psymbol cache: %d\n"), - objfile->partial_symtabs->psymbol_cache.memory_used ()); + m_partial_symtabs->psymbol_cache.memory_used ()); } else { printf_filtered (_("Psymbol byte cache statistics:\n")); - objfile->partial_symtabs->psymbol_cache.print_statistics + m_partial_symtabs->psymbol_cache.print_statistics ("partial symbol cache"); } } @@ -1031,10 +1035,10 @@ psymbol_functions::dump (struct objfile *objfile) { struct partial_symtab *psymtab; - if (objfile->partial_symtabs->psymtabs) + if (m_partial_symtabs->psymtabs) { printf_filtered ("Psymtabs:\n"); - for (psymtab = objfile->partial_symtabs->psymtabs; + for (psymtab = m_partial_symtabs->psymtabs; psymtab != NULL; psymtab = psymtab->next) { @@ -1321,7 +1325,7 @@ psymbol_functions::expand_symtabs_matching for (partial_symtab *ps : require_partial_symbols (objfile, true)) ps->searched_flag = PST_NOT_SEARCHED; - for (partial_symtab *ps : objfile->psymtabs ()) + for (partial_symtab *ps : m_partial_symtabs->range ()) { QUIT; @@ -1373,7 +1377,7 @@ psymbol_functions::expand_symtabs_matching bool psymbol_functions::has_symbols (struct objfile *objfile) { - return objfile->partial_symtabs->psymtabs != NULL; + return m_partial_symtabs->psymtabs != NULL; } /* Helper function for psym_find_compunit_symtab_by_address that fills @@ -1446,9 +1450,9 @@ psymbol_functions::find_compunit_symtab_by_address (struct objfile *objfile, } quick_symbol_functions_up -make_psymbol_functions () +make_psymbol_functions (const std::shared_ptr &storage) { - return quick_symbol_functions_up (new psymbol_functions); + return quick_symbol_functions_up (new psymbol_functions (storage)); } @@ -1724,14 +1728,16 @@ dump_psymtab_addrmap_1 (void *datap, CORE_ADDR start_addr, void *obj) of PSYMTAB. If PSYMTAB is NULL print the entire addrmap. */ static void -dump_psymtab_addrmap (struct objfile *objfile, struct partial_symtab *psymtab, +dump_psymtab_addrmap (struct objfile *objfile, + psymtab_storage *partial_symtabs, + struct partial_symtab *psymtab, struct ui_file *outfile) { struct dump_psymtab_addrmap_data addrmap_dump_data; if ((psymtab == NULL || psymtab->psymtabs_addrmap_supported) - && objfile->partial_symtabs->psymtabs_addrmap != NULL) + && partial_symtabs->psymtabs_addrmap != NULL) { addrmap_dump_data.objfile = objfile; addrmap_dump_data.psymtab = psymtab; @@ -1739,7 +1745,7 @@ dump_psymtab_addrmap (struct objfile *objfile, struct partial_symtab *psymtab, addrmap_dump_data.previous_matched = 0; fprintf_filtered (outfile, "%sddress map:\n", psymtab == NULL ? "Entire a" : " A"); - addrmap_foreach (objfile->partial_symtabs->psymtabs_addrmap, + addrmap_foreach (partial_symtabs->psymtabs_addrmap, dump_psymtab_addrmap_1, &addrmap_dump_data); } } @@ -1830,14 +1836,17 @@ maintenance_print_psymbols (const char *args, int from_tty) if (!print_for_objfile) continue; + psymtab_storage *partial_symtabs = objfile->partial_symtabs.get (); + if (address_arg != NULL) { struct bound_minimal_symbol msymbol = { NULL, NULL }; /* We don't assume each pc has a unique objfile (this is for debugging). */ - struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc, - section, msymbol); + struct partial_symtab *ps + = find_pc_sect_psymtab (objfile, partial_symtabs, pc, + section, msymbol); if (ps != NULL) { if (!printed_objfile_header) @@ -1847,7 +1856,7 @@ maintenance_print_psymbols (const char *args, int from_tty) printed_objfile_header = 1; } dump_psymtab (objfile, ps, outfile); - dump_psymtab_addrmap (objfile, ps, outfile); + dump_psymtab_addrmap (objfile, partial_symtabs, ps, outfile); found = 1; } } @@ -1874,7 +1883,8 @@ maintenance_print_psymbols (const char *args, int from_tty) printed_objfile_header = 1; } dump_psymtab (objfile, ps, outfile); - dump_psymtab_addrmap (objfile, ps, outfile); + dump_psymtab_addrmap (objfile, partial_symtabs, ps, + outfile); } } } @@ -1886,7 +1896,7 @@ maintenance_print_psymbols (const char *args, int from_tty) && objfile->partial_symtabs->psymtabs_addrmap != NULL) { outfile->puts ("\n"); - dump_psymtab_addrmap (objfile, NULL, outfile); + dump_psymtab_addrmap (objfile, partial_symtabs, NULL, outfile); } } diff --git a/gdb/psymtab.h b/gdb/psymtab.h index 45eaf0b9013..18b47c55b3c 100644 --- a/gdb/psymtab.h +++ b/gdb/psymtab.h @@ -154,6 +154,7 @@ class psymtab_storage extern psymtab_storage::partial_symtab_range require_partial_symbols (struct objfile *objfile, bool verbose); -extern quick_symbol_functions_up make_psymbol_functions (); +extern quick_symbol_functions_up make_psymbol_functions + (const std::shared_ptr &); #endif /* PSYMTAB_H */ diff --git a/gdb/symfile.c b/gdb/symfile.c index d0b9da2138b..12746c43374 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -904,7 +904,7 @@ syms_from_objfile_1 (struct objfile *objfile, const int mainline = add_flags & SYMFILE_MAINLINE; objfile_set_sym_fns (objfile, find_sym_fns (objfile->obfd)); - objfile->qf = make_psymbol_functions (); + objfile->qf = make_psymbol_functions (objfile->partial_symtabs); if (objfile->sf == NULL) { @@ -2555,7 +2555,7 @@ reread_symbols (void) based on whether .gdb_index is present, and we need it to start over. PR symtab/15885 */ objfile_set_sym_fns (objfile, find_sym_fns (objfile->obfd)); - objfile->qf = make_psymbol_functions (); + objfile->qf = make_psymbol_functions (objfile->partial_symtabs); build_objfile_section_table (objfile); -- 2.26.2