From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gateway20.websitewelcome.com (gateway20.websitewelcome.com [192.185.58.11]) by sourceware.org (Postfix) with ESMTPS id E634B387703A for ; Sat, 28 Mar 2020 19:22:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org E634B387703A 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 cm17.websitewelcome.com (cm17.websitewelcome.com [100.42.49.20]) by gateway20.websitewelcome.com (Postfix) with ESMTP id 4B560400C57A0 for ; Sat, 28 Mar 2020 13:06:16 -0500 (CDT) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id IH24jzbpwAGTXIH24jNzz9; Sat, 28 Mar 2020 14:22:12 -0500 X-Authority-Reason: nr=8 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=ZPWAF6PTxfe9fNGQTXmQoltE4mSBzO5Wpi1jiUqzvwo=; b=gazEaoOhxHxBOj3QtI9GkyrG22 hON6WBPUQQxPiR/enDE96HaBt3fmXmJgpo8NSDDsJDlB3StkcS1SKMRo7PvMsemL6YcCR177Z5WPq YXoGW8N+SkaqFz41N9HB+EgOw; Received: from 97-118-117-21.hlrn.qwest.net ([97.118.117.21]:55190 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.92) (envelope-from ) id 1jIH24-003oZR-BP; Sat, 28 Mar 2020 13:22:12 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 11/20] Add reprocessing flag to struct attribute Date: Sat, 28 Mar 2020 13:21:59 -0600 Message-Id: <20200328192208.11324-12-tom@tromey.com> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20200328192208.11324-1-tom@tromey.com> References: <20200328192208.11324-1-tom@tromey.com> 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.118.117.21 X-Source-L: No X-Exim-ID: 1jIH24-003oZR-BP X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: 97-118-117-21.hlrn.qwest.net (bapiya.Home) [97.118.117.21]:55190 X-Source-Auth: tom+tromey.com X-Email-Count: 14 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes X-Spam-Status: No, score=-21.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, JMQ_SPF_NEUTRAL, RCVD_IN_ABUSEAT, RCVD_IN_DNSWL_NONE, RCVD_IN_SBL_CSS, SPF_HELO_PASS, SPF_NEUTRAL, TXREP, URIBL_CSS, URIBL_CSS_A 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: Sat, 28 Mar 2020 19:22:15 -0000 Some forms require "reprocessing" -- a second pass to update their value appropriately. In this case, we'll set the unsigned value on the attribute, and then later set it to the correct value. To handle this, we introduce a reprocessing flag to attribute. Then, we manage this flag to ensure that setting and unsetting is done properly. gdb/ChangeLog 2020-03-28 Tom Tromey * dwarf2/read.c (read_cutu_die_from_dwo): Use OBSTACK_ZALLOC. (read_attribute_reprocess, read_attribute_value): Update. (read_attribute): Clear requires_reprocessing. * dwarf2/attribute.h (struct attribute) : New methods. : Clear requires_reprocessing. : New method. : Shrink by one bit. : New member. * dwarf2/attribute.c (attribute::form_is_reprocessed): New method. --- gdb/ChangeLog | 14 ++++++++++++++ gdb/dwarf2/attribute.c | 14 ++++++++++++++ gdb/dwarf2/attribute.h | 30 +++++++++++++++++++++++++++++- gdb/dwarf2/read.c | 12 +++++++----- 4 files changed, 64 insertions(+), 6 deletions(-) diff --git a/gdb/dwarf2/attribute.c b/gdb/dwarf2/attribute.c index 72ec13c11f9..73c1ef9f792 100644 --- a/gdb/dwarf2/attribute.c +++ b/gdb/dwarf2/attribute.c @@ -206,3 +206,17 @@ attribute::form_is_unsigned () const || form == DW_FORM_ref8 || form == DW_FORM_ref_udata); } + +/* See attribute.h. */ + +bool +attribute::form_is_reprocessed () const +{ + return (form == DW_FORM_strx1 + || form == DW_FORM_strx2 + || form == DW_FORM_strx3 + || form == DW_FORM_strx4 + || form == DW_FORM_GNU_str_index + || form == DW_FORM_addrx + || form == DW_FORM_GNU_addr_index); +} diff --git a/gdb/dwarf2/attribute.h b/gdb/dwarf2/attribute.h index 0a4c8647f6e..b96fdac5201 100644 --- a/gdb/dwarf2/attribute.h +++ b/gdb/dwarf2/attribute.h @@ -73,6 +73,15 @@ struct attribute return u.snd; } + /* Return the unsigned value, but only for attributes requiring + reprocessing. */ + ULONGEST get_unsigned_reprocess () const + { + gdb_assert (form_is_reprocessed ()); + gdb_assert (requires_reprocessing); + return u.unsnd; + } + /* Return non-zero if ATTR's value is a section offset --- classes lineptr, loclistptr, macptr or rangelistptr --- or zero, otherwise. You may use DW_UNSND (attr) to retrieve such offsets. @@ -118,6 +127,10 @@ struct attribute /* Check if the attribute's form is an unsigned integer form. */ bool form_is_unsigned () const; + /* Check if the attribute's form is a form that requires + "reprocessing". */ + bool form_is_reprocessed () const; + /* Return DIE offset of this attribute. Return 0 with complaint if the attribute is not of the required kind. */ @@ -141,6 +154,7 @@ struct attribute gdb_assert (form_is_string ()); u.str = str; string_is_canonical = 0; + requires_reprocessing = 0; } /* Set the canonical string value for this attribute. */ @@ -179,8 +193,22 @@ struct attribute u.unsnd = unsnd; } + /* Temporarily this attribute to an unsigned integer. This is used + only for those forms that require reprocessing. */ + void set_unsigned_reprocess (ULONGEST unsnd) + { + gdb_assert (form_is_reprocessed ()); + u.unsnd = unsnd; + requires_reprocessing = 1; + } + + + ENUM_BITFIELD(dwarf_attribute) name : 15; + + /* If this requires reprocessing, is it in its final form, or is it + still stored as an unsigned? */ + unsigned int requires_reprocessing : 1; - ENUM_BITFIELD(dwarf_attribute) name : 16; ENUM_BITFIELD(dwarf_form) form : 15; /* Has u.str already been updated by dwarf2_canonicalize_name? This diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 75ac56efc02..a5c2c52375d 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -6471,7 +6471,7 @@ read_cutu_die_from_dwo (struct dwarf2_per_cu_data *this_cu, else if (stub_comp_dir != NULL) { /* Reconstruct the comp_dir attribute to simplify the code below. */ - comp_dir = XOBNEW (&cu->comp_unit_obstack, struct attribute); + comp_dir = OBSTACK_ZALLOC (&cu->comp_unit_obstack, struct attribute); comp_dir->name = DW_AT_comp_dir; comp_dir->form = DW_FORM_string; comp_dir->string_init (stub_comp_dir); @@ -18314,7 +18314,7 @@ read_attribute_reprocess (const struct die_reader_specs *reader, { case DW_FORM_addrx: case DW_FORM_GNU_addr_index: - DW_ADDR (attr) = read_addr_index (cu, DW_UNSND (attr)); + DW_ADDR (attr) = read_addr_index (cu, attr->get_unsigned_reprocess ()); break; case DW_FORM_strx: case DW_FORM_strx1: @@ -18323,7 +18323,7 @@ read_attribute_reprocess (const struct die_reader_specs *reader, case DW_FORM_strx4: case DW_FORM_GNU_str_index: { - unsigned int str_index = DW_UNSND (attr); + unsigned int str_index = attr->get_unsigned_reprocess (); gdb_assert (!attr->canonical_p ()); if (reader->dwo_file != NULL) attr->string_init (read_dwo_str_index (reader, str_index)); @@ -18532,7 +18532,8 @@ read_attribute_value (const struct die_reader_specs *reader, case DW_FORM_addrx: case DW_FORM_GNU_addr_index: *need_reprocess = true; - DW_UNSND (attr) = read_unsigned_leb128 (abfd, info_ptr, &bytes_read); + attr->set_unsigned_reprocess (read_unsigned_leb128 (abfd, info_ptr, + &bytes_read)); info_ptr += bytes_read; break; case DW_FORM_strx: @@ -18569,7 +18570,7 @@ read_attribute_value (const struct die_reader_specs *reader, info_ptr += bytes_read; } *need_reprocess = true; - DW_UNSND (attr) = str_index; + attr->set_unsigned_reprocess (str_index); } break; default: @@ -18610,6 +18611,7 @@ read_attribute (const struct die_reader_specs *reader, { attr->name = abbrev->name; attr->string_is_canonical = 0; + attr->requires_reprocessing = 0; return read_attribute_value (reader, attr, abbrev->form, abbrev->implicit_const, info_ptr, need_reprocess); -- 2.17.2