From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id X3JyD6GJol+pTgAAWB0awg (envelope-from ) for ; Wed, 04 Nov 2020 05:59:45 -0500 Received: by simark.ca (Postfix, from userid 112) id 30A991F08B; Wed, 4 Nov 2020 05:59:45 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-1.1 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,MAILING_LIST_MULTI,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 6EBDB1E58E for ; Wed, 4 Nov 2020 05:59:43 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 32A8A3857C46; Wed, 4 Nov 2020 10:59:42 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 32A8A3857C46 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1604487582; bh=5wj6Kb03AwRPddMkKf292ZWSxoB5Lfcp84msd5j+3aU=; h=Date:To:Subject:References:In-Reply-To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=QlECqN9nzdfHBlkaKnVDdM8dtBJ7OsLwd9Oh5l9DMRvLsHAapx9DwTi3iybAvcpVF 1dvRaD/cXfymIx6I4zMh+rxEUcXZcBJ7CiDn89Y3nv0jAjgqCzyr2+xdVNk8l7ae/Z qcqJLttRtebu4CoH3rL7VYsgDMmarUfeJmyVJjI8= Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by sourceware.org (Postfix) with ESMTP id E01053857C46 for ; Wed, 4 Nov 2020 10:59:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org E01053857C46 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-425-EuLhi5M-OsmtljLDAdOeAQ-1; Wed, 04 Nov 2020 05:59:35 -0500 X-MC-Unique: EuLhi5M-OsmtljLDAdOeAQ-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D361A18B9F01; Wed, 4 Nov 2020 10:59:34 +0000 (UTC) Received: from blade.nx (ovpn-115-156.ams2.redhat.com [10.36.115.156]) by smtp.corp.redhat.com (Postfix) with ESMTP id 331EB19C4F; Wed, 4 Nov 2020 10:59:34 +0000 (UTC) Received: by blade.nx (Postfix, from userid 1000) id 55C09816CD2E; Wed, 4 Nov 2020 10:59:33 +0000 (GMT) Date: Wed, 4 Nov 2020 10:59:33 +0000 To: Tom Tromey Subject: Re: [PATCH] Shrink size of dwarf2_per_cu_data Message-ID: <20201104105933.GA16965@blade.nx> References: <20201103221306.6688-1-tom@tromey.com> MIME-Version: 1.0 In-Reply-To: <20201103221306.6688-1-tom@tromey.com> X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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: , From: Gary Benson via Gdb-patches Reply-To: Gary Benson Cc: gdb-patches@sourceware.org Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" Tom Tromey wrote: > I noticed some holes in struct dwarf2_per_cu_data. This patch > rearranges the type slightly, and shrinks the size of some fields. > This reduces it from 136 bytes to 112 bytes (on x86-64). Nice. Though I'd assumed the compiler would do this. > I also reduced the size of the DWARF "version" fields in a couple of > spots. It seemed needless to use a short to hold a value that > ranges from 2 to 5, and this also helped the goal of shrinking > dwarf2_per_cu_data. There's other things in there if you were going that way, e.g.: unsigned char addr_size; unsigned char signed_addr_p; sect_offset abbrev_sect_off; /* Size of file offsets; either 4 or 8. */ unsigned int offset_size; /* Size of the length field; either 4 or 12. */ unsigned int initial_length_size; I presume you'd need to lose 8 whole bytes to shrink the struct further, so marking these as <8bit values probably wouldn't help any, but maybe it's worth it? How many CUs does something big have? Anyway, LGTM, I don't require any changes, the above is just commentary. Thanks, Gary > gdb/ChangeLog > 2020-11-03 Tom Tromey > > * dwarf2/read.h (struct dwarf2_per_cu_data) : Now > unsigned char. > (struct dwarf2_per_cu_data): Rearrange. > * dwarf2/comp-unit.h (struct comp_unit_head) : Now > unsigned char. > (struct comp_unit_head): Rearrange. > * dwarf2/comp-unit.c (read_comp_unit_head): Update. > --- > gdb/ChangeLog | 10 ++++++++++ > gdb/dwarf2/comp-unit.c | 7 ++++--- > gdb/dwarf2/comp-unit.h | 15 +++++++-------- > gdb/dwarf2/read.h | 26 +++++++++++++------------- > 4 files changed, 34 insertions(+), 24 deletions(-) > > diff --git a/gdb/dwarf2/comp-unit.c b/gdb/dwarf2/comp-unit.c > index 7ddc893aac6..05cf3f1c6a8 100644 > --- a/gdb/dwarf2/comp-unit.c > +++ b/gdb/dwarf2/comp-unit.c > @@ -75,11 +75,12 @@ read_comp_unit_head (struct comp_unit_head *cu_header, > cu_header->initial_length_size = bytes_read; > cu_header->offset_size = (bytes_read == 4) ? 4 : 8; > info_ptr += bytes_read; > - cu_header->version = read_2_bytes (abfd, info_ptr); > - if (cu_header->version < 2 || cu_header->version > 5) > + unsigned version = read_2_bytes (abfd, info_ptr); > + if (version < 2 || version > 5) > error (_("Dwarf Error: wrong version in compilation unit header " > "(is %d, should be 2, 3, 4 or 5) [in module %s]"), > - cu_header->version, filename); > + version, filename); > + cu_header->version = version; > info_ptr += 2; > if (cu_header->version < 5) > switch (section_kind) > diff --git a/gdb/dwarf2/comp-unit.h b/gdb/dwarf2/comp-unit.h > index 35bca8f8e9d..09ffac8d2da 100644 > --- a/gdb/dwarf2/comp-unit.h > +++ b/gdb/dwarf2/comp-unit.h > @@ -35,7 +35,7 @@ > struct comp_unit_head > { > unsigned int length; > - short version; > + unsigned char version; > unsigned char addr_size; > unsigned char signed_addr_p; > sect_offset abbrev_sect_off; > @@ -48,14 +48,16 @@ struct comp_unit_head > > enum dwarf_unit_type unit_type; > > - /* Offset to the first byte of this compilation unit header in the > - .debug_info section, for resolving relative reference dies. */ > - sect_offset sect_off; > - > /* Offset to first die in this cu from the start of the cu. > This will be the first byte following the compilation unit header. */ > cu_offset first_die_cu_offset; > > + /* Offset to the first byte of this compilation unit header in the > + .debug_info section, for resolving relative reference dies. */ > + sect_offset sect_off; > + > + /* For types, offset in the type's DIE of the type defined by this TU. */ > + cu_offset type_cu_offset_in_tu; > > /* 64-bit signature of this unit. For type units, it denotes the signature of > the type (DW_UT_type in DWARF 4, additionally DW_UT_split_type in DWARF 5). > @@ -63,9 +65,6 @@ struct comp_unit_head > DW_UT_skeleton or DW_UT_split_compile. */ > ULONGEST signature; > > - /* For types, offset in the type's DIE of the type defined by this TU. */ > - cu_offset type_cu_offset_in_tu; > - > /* Return the total length of the CU described by this header. */ > unsigned int get_length () const > { > diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h > index a0d76f349e8..f358c562fdf 100644 > --- a/gdb/dwarf2/read.h > +++ b/gdb/dwarf2/read.h > @@ -433,7 +433,7 @@ struct dwarf2_per_cu_data > unsigned int length; > > /* DWARF standard version this data has been read from (such as 4 or 5). */ > - short dwarf_version; > + unsigned char dwarf_version; > > /* Flag indicating this compilation unit will be read in before > any of the current compilation units are processed. */ > @@ -469,6 +469,18 @@ struct dwarf2_per_cu_data > This flag is only valid if is_debug_types is true. */ > unsigned int tu_read : 1; > > + /* True if HEADER has been read in. > + > + Don't access this field directly. It should be private, but we can't make > + it private at the moment. */ > + mutable bool m_header_read_in : 1; > + > + /* The unit type of this CU. */ > + ENUM_BITFIELD (dwarf_unit_type) unit_type : 8; > + > + /* The language of this CU. */ > + ENUM_BITFIELD (language) lang : LANGUAGE_BITS; > + > /* Our index in the unshared "symtabs" vector. */ > unsigned index; > > @@ -477,12 +489,6 @@ struct dwarf2_per_cu_data > not the DWO file. */ > struct dwarf2_section_info *section; > > - /* The unit type of this CU. */ > - enum dwarf_unit_type unit_type; > - > - /* The language of this CU. */ > - enum language lang; > - > /* Backlink to the owner of this. */ > dwarf2_per_bfd *per_bfd; > > @@ -495,12 +501,6 @@ struct dwarf2_per_cu_data > should be private, but we can't make it private at the moment. */ > mutable comp_unit_head m_header; > > - /* True if HEADER has been read in. > - > - Don't access this field directly. It should be private, but we can't make > - it private at the moment. */ > - mutable bool m_header_read_in; > - > /* When dwarf2_per_bfd::using_index is true, the 'quick' field > is active. Otherwise, the 'psymtab' field is active. */ > union > -- > 2.17.2 > -- Gary Benson - he / him / his Principal Software Engineer, Red Hat