From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 34728 invoked by alias); 18 Feb 2020 11:39:06 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 34717 invoked by uid 89); 18 Feb 2020 11:39:05 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.1 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: mail-qk1-f195.google.com Received: from mail-qk1-f195.google.com (HELO mail-qk1-f195.google.com) (209.85.222.195) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 18 Feb 2020 11:39:03 +0000 Received: by mail-qk1-f195.google.com with SMTP id d11so19100174qko.8 for ; Tue, 18 Feb 2020 03:39:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-language:content-transfer-encoding; bh=BC4jqvNfznepA9gQ+R3SS5Yxxc7XjilkGQIyl6wtd38=; b=Ww02M42vrU/xI65fikU50jgVzioH2ahUGtjlv1vbKjcXGoNDUkW+N2hy3oT2GNC2rI oOIcMoYf79LA10QoUAeNzAjs/8ks6IkabJK7qFV1D0lcCaZBAo1JX4QtYOF/38NN97m7 vRPvkmouLGUgabWFbIBfOZJt0k/2BDagJrF1EHmxcIU6QCBpF3tFQHegFvrLIOKalxrR sqEr21qKTMw3DmVvgO6BLDQOizgP2WJiYeID2Vch143p8XwzOgTAg4sCI4sZq1SqpvuN yDV1Ol5YHduJiZKripUbhTF1ggePVpocdVfq6CTBz+q7EPZuBDX15tBdBsrU1zAbFj0Y YggQ== Return-Path: Received: from [192.168.0.185] ([179.177.236.155]) by smtp.gmail.com with ESMTPSA id h13sm1655343qtu.23.2020.02.18.03.38.59 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 18 Feb 2020 03:39:00 -0800 (PST) Subject: Re: [PATCH 07/14] Add dwarf2_per_cu_data::index To: Tom Tromey , gdb-patches@sourceware.org References: <20200215165444.32653-1-tom@tromey.com> <20200215165444.32653-8-tom@tromey.com> From: Luis Machado Message-ID: <467b34b2-5fea-95a0-6557-b08e64338bd0@linaro.org> Date: Tue, 18 Feb 2020 11:39:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.4.1 MIME-Version: 1.0 In-Reply-To: <20200215165444.32653-8-tom@tromey.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2020-02/txt/msg00708.txt.bz2 On 2/15/20 1:54 PM, Tom Tromey wrote: > 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) allocate_signatured_type>: 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) Did only formatting change above? > { > - 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 */ I'm a bit lost on the above comment. Instead of having a FIXME here, is there something we can do better at this point? Or maybe it will be addressed later in the series? I couldn't quite understand the problems with the indexes, but you're more familiar with the DWARF reading code than i am. > + 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; > + What is the all_cutus vector? I don't see it being added later in the series. Should we make it more clear? Maybe you meant "all CU's/TU's"? > /* 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. */ >