From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 1DBC63858D33 for ; Mon, 18 Jan 2021 08:13:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 1DBC63858D33 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-469-o0wuTtY8Mba-nZl_KnZIxQ-1; Mon, 18 Jan 2021 03:13:05 -0500 X-MC-Unique: o0wuTtY8Mba-nZl_KnZIxQ-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D66921005513; Mon, 18 Jan 2021 08:13:03 +0000 (UTC) Received: from tucnak.zalov.cz (ovpn-112-64.ams2.redhat.com [10.36.112.64]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 827B160BFA; Mon, 18 Jan 2021 08:13:03 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.16.1/8.16.1) with ESMTPS id 10I8D05t2608257 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 18 Jan 2021 09:13:00 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.16.1/8.16.1/Submit) id 10I8CxsF2608256; Mon, 18 Jan 2021 09:12:59 +0100 Date: Mon, 18 Jan 2021 09:12:59 +0100 From: Jakub Jelinek To: Mark Wielaard Cc: dwz@sourceware.org Subject: Re: [PATCH] Handle DW_FORM_implicit_const Message-ID: <20210118081259.GS1034503@tucnak> Reply-To: Jakub Jelinek References: <20210117222400.22763-1-mark@klomp.org> MIME-Version: 1.0 In-Reply-To: <20210117222400.22763-1-mark@klomp.org> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-6.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, 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: dwz@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Dwz mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Jan 2021 08:13:08 -0000 On Sun, Jan 17, 2021 at 11:24:00PM +0100, Mark Wielaard wrote: > This handles DW_FORM_implicit_const. This form keeps the actual data > value in the abbrev. This makes things tricky because we have to decide > where to keep (a reference to) the value and when to update the value > if necessary. > > To not bloat each abbrev_attr struct we add an int64 *values to the > abbrev_tag struct which points to an array of values at the end. We > only allocate values up to the highest implicit_const form (if any) > when we know those upfront. In compute_abbrevs and recompute_abbrevs > we have to allocate a maximum number of values (just like we have to > allocate the maximum number of attributes). But when cloning those > we reduce the number of values (and attributes) to the minimum needed. > To keep the values field up to date always call pool_clone_abbrev > when copying an abbrev. > > When a DW_AT_decl_file or DW_AT_call_file attribute references a > file number using DW_FORM_implicit_const we need to be careful when > updating the value for a new file table. The abbrev can be used by > more than one DIE, but the value only needs to be updated once. We > use the fact that file references are positive, but an implicit_const > is signed. When updating we negate the new file number and don't update > a negative file number. Negative file numbers are made positive again when > calculating the new abbrev sizes in compute_abbrevs. > > * dwz.c (write_sleb128): New macro. > (struct abbrev_tag): Add values pointer field. > (pool_clone_abbrev): New function. > (abbrev_eq2): Handle DW_FORM_implicit_const by also comparing > the value. > (compute_abbrev_hash): Likewise. > (read_abbrev): Read DW_FORM_implicit_const. Keep track of > highest_implicit_value_ndx. Allocate values. > (get_AT): Return pointer to value for DW_FORM_implicit_const. > (get_AT_int): Return value of DW_FORM_implicit_const. > (checksum_die): Get value for DW_AT_decl_file or DW_AT_call_file > from DW_FORM_implicit_const, skip for others. > (checksum_ref_die): Likewise. > (die_eq_1): Likewise. > (mark_refs): Handle DW_FORM_implicit_const. > (read_debug_info): Handle DW_FORM_implicit_const, set cu_lang > for compile/partial units. > (size_of_sleb128): New function. > (build_abbrevs_for_die): Handle DW_FORM_implicit_const value. > Use pool_clone_abbrev. > (abbrev_cmp): Also compare DW_FORM_implicit_const values. > (compute_abbrevs): Use pool_clone_abbrev. Switch any negative > file implicit_const values back before calculating size. > (write_abbrev): Also write DW_FORM_implicit_const value. > (write_die): Handle DW_FORM_implicit_const, but don't change > form/value for DW_AT_decl_file and DW_AT_call_file. > (recompute_abbrevs): Alloc space for max_nattr values, set > abbrev_tag values field. Ok, thanks. Jakub