From patchwork Sat Feb 15 16:54:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 38100 Received: (qmail 85589 invoked by alias); 15 Feb 2020 16:54:53 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 85446 invoked by uid 89); 15 Feb 2020 16:54:52 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-20.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.1 spammy=nb, CUs, UD:B, cus X-HELO: gateway22.websitewelcome.com Received: from gateway22.websitewelcome.com (HELO gateway22.websitewelcome.com) (192.185.47.168) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 15 Feb 2020 16:54:49 +0000 Received: from cm12.websitewelcome.com (cm12.websitewelcome.com [100.42.49.8]) by gateway22.websitewelcome.com (Postfix) with ESMTP id 50DBD4FB4 for ; Sat, 15 Feb 2020 10:54:48 -0600 (CST) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id 30iOj80s7vBMd30iOj65sO; Sat, 15 Feb 2020 10:54:48 -0600 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: 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=leJ8X4y0S1ne0N6K5Be6x7ZMy4/0iCLuB+pIi1zYZWc=; b=CUmXx/9ijfiD9XIr9js19YSWaC 4QljOKwFsE/IqPwds2celooDhnciIU6jEXasPva1+BNYSumHfgxXHgvkD0xO0Gh2uPNFyHcY1QxII gtU7jm1PWFhShT6b05w/POfmf; Received: from 75-166-123-50.hlrn.qwest.net ([75.166.123.50]:45240 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.92) (envelope-from ) id 1j30iO-000xcC-3I; Sat, 15 Feb 2020 09:54:48 -0700 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 07/14] Add dwarf2_per_cu_data::index Date: Sat, 15 Feb 2020 09:54:37 -0700 Message-Id: <20200215165444.32653-8-tom@tromey.com> In-Reply-To: <20200215165444.32653-1-tom@tromey.com> References: <20200215165444.32653-1-tom@tromey.com> Currently a dwarf2_per_cu_data can hold a link to the corresponding compunit_symtab. However, once these objects are shared across objfiles, a simple pointer won't work. Instead, this link will be stored in the dwarf2_unshareable object. To enable this, we add an index to each dwarf2_per_cu_data and signatured_type. 2020-02-15 Tom Tromey * dwarf2/read.h (struct dwarf2_per_objfile) : Declare new methods. (struct dwarf2_per_cu_data) : New member. (struct dwarf2_per_objfile) : New member. * dwarf2/read.c (dwarf2_per_objfile::allocate_per_cu) (dwarf2_per_objfile::allocate_signatured_type): New methods. (create_cu_from_index_list): Use allocate_per_cu. (create_signatured_type_table_from_index) (create_signatured_type_table_from_debug_names) (create_debug_type_hash_table, add_type_unit) (read_comp_units_from_section): Use allocate_signatured_type. --- gdb/ChangeLog | 14 +++++++++++++ gdb/dwarf2/read.c | 52 +++++++++++++++++++++++++++-------------------- gdb/dwarf2/read.h | 18 ++++++++++++++++ 3 files changed, 62 insertions(+), 22 deletions(-) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index cb04eb19beb..281d39ad271 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -2415,18 +2415,36 @@ dwarf2_per_objfile::get_tu (int index) return this->all_type_units[index]; } +/* See read.h. */ + +dwarf2_per_cu_data * +dwarf2_per_objfile::allocate_per_cu () +{ + dwarf2_per_cu_data *result = OBSTACK_ZALLOC (&obstack, dwarf2_per_cu_data); + result->index = num_psymtabs++; + return result; +} + +/* See read.h. */ + +signatured_type * +dwarf2_per_objfile::allocate_signatured_type () +{ + signatured_type *result = OBSTACK_ZALLOC (&obstack, signatured_type); + result->per_cu.index = num_psymtabs++; + return result; +} + /* Return a new dwarf2_per_cu_data allocated on the dwarf2_per_objfile obstack, and constructed with the specified field values. */ static dwarf2_per_cu_data * create_cu_from_index_list (struct dwarf2_per_objfile *dwarf2_per_objfile, - struct dwarf2_section_info *section, - int is_dwz, - sect_offset sect_off, ULONGEST length) + struct dwarf2_section_info *section, + int is_dwz, + sect_offset sect_off, ULONGEST length) { - dwarf2_per_cu_data *the_cu - = OBSTACK_ZALLOC (&dwarf2_per_objfile->obstack, - struct dwarf2_per_cu_data); + dwarf2_per_cu_data *the_cu = dwarf2_per_objfile->allocate_per_cu (); the_cu->sect_off = sect_off; the_cu->length = length; the_cu->dwarf2_per_objfile = dwarf2_per_objfile; @@ -2517,8 +2535,7 @@ create_signatured_type_table_from_index signature = extract_unsigned_integer (bytes + 16, 8, BFD_ENDIAN_LITTLE); bytes += 3 * 8; - sig_type = OBSTACK_ZALLOC (&dwarf2_per_objfile->obstack, - struct signatured_type); + sig_type = dwarf2_per_objfile->allocate_signatured_type (); sig_type->signature = signature; sig_type->type_offset_in_tu = type_offset_in_tu; sig_type->per_cu.is_debug_types = 1; @@ -2574,8 +2591,7 @@ create_signatured_type_table_from_debug_names section->buffer + to_underlying (sect_off), rcuh_kind::TYPE); - sig_type = OBSTACK_ZALLOC (&dwarf2_per_objfile->obstack, - struct signatured_type); + sig_type = dwarf2_per_objfile->allocate_signatured_type (); sig_type->signature = cu_header.signature; sig_type->type_offset_in_tu = cu_header.type_cu_offset_in_tu; sig_type->per_cu.is_debug_types = 1; @@ -6091,8 +6107,7 @@ create_debug_type_hash_table (struct dwarf2_per_objfile *dwarf2_per_objfile, /* N.B.: type_offset is not usable if this type uses a DWO file. The real type_offset is in the DWO file. */ dwo_tu = NULL; - sig_type = OBSTACK_ZALLOC (&dwarf2_per_objfile->obstack, - struct signatured_type); + sig_type = dwarf2_per_objfile->allocate_signatured_type (); sig_type->signature = header.signature; sig_type->type_offset_in_tu = header.type_cu_offset_in_tu; sig_type->per_cu.dwarf2_per_objfile = dwarf2_per_objfile; @@ -6207,8 +6222,7 @@ add_type_unit (struct dwarf2_per_objfile *dwarf2_per_objfile, ULONGEST sig, == dwarf2_per_objfile->all_type_units.capacity ()) ++dwarf2_per_objfile->tu_stats.nr_all_type_units_reallocs; - signatured_type *sig_type = OBSTACK_ZALLOC (&dwarf2_per_objfile->obstack, - struct signatured_type); + signatured_type *sig_type = dwarf2_per_objfile->allocate_signatured_type (); dwarf2_per_objfile->all_type_units.push_back (sig_type); sig_type->signature = sig; @@ -7835,16 +7849,10 @@ read_comp_units_from_section (struct dwarf2_per_objfile *dwarf2_per_objfile, /* Save the compilation unit for later lookup. */ if (cu_header.unit_type != DW_UT_type) - { - this_cu = XOBNEW (&dwarf2_per_objfile->obstack, - struct dwarf2_per_cu_data); - memset (this_cu, 0, sizeof (*this_cu)); - } + this_cu = dwarf2_per_objfile->allocate_per_cu (); else { - auto sig_type = XOBNEW (&dwarf2_per_objfile->obstack, - struct signatured_type); - memset (sig_type, 0, sizeof (*sig_type)); + auto sig_type = dwarf2_per_objfile->allocate_signatured_type (); sig_type->signature = cu_header.signature; sig_type->type_offset_in_tu = cu_header.type_cu_offset_in_tu; this_cu = &sig_type->per_cu; diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h index 06a0fa3a19a..5fc7f7f72e5 100644 --- a/gdb/dwarf2/read.h +++ b/gdb/dwarf2/read.h @@ -128,6 +128,17 @@ struct dwarf2_per_objfile /* Free all cached compilation units. */ void free_cached_comp_units (); + + /* A convenience function to allocate a dwarf2_per_cu_data (or + object holding one, using C-style derivation). The returned + object has its "index" field set properly. The object is + allocated on the dwarf2_per_objfile obstack. FIXME the index + here is weird since it may not (!?!?) be the same as the other + index */ + dwarf2_per_cu_data *allocate_per_cu (); + + signatured_type *allocate_signatured_type (); + private: /* This function is mapped across the sections and remembers the offset and size of each of the debugging sections we are @@ -255,6 +266,10 @@ public: /* CUs that are queued to be read. */ std::queue queue; + /* The total number of per_cu and signatured_type objects that have + been created for this reader. */ + size_t num_psymtabs = 0; + /* State that cannot be shared across objfiles. This is normally nullptr and is temporarily set to the correct value at the entry points of the reader. */ @@ -336,6 +351,9 @@ struct dwarf2_per_cu_data This flag is only valid if is_debug_types is true. */ unsigned int tu_read : 1; + /* Our index in the unshared "all_cutus" vector. */ + unsigned index; + /* The section this CU/TU lives in. If the DIE refers to a DWO file, this is always the original die, not the DWO file. */