From patchwork Fri Aug 31 14:53:02 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 29146 Received: (qmail 16818 invoked by alias); 31 Aug 2018 14:53:40 -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 16719 invoked by uid 89); 31 Aug 2018 14:53:39 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.4 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.2 spammy=Hx-languages-length:1834, our X-HELO: gateway21.websitewelcome.com Received: from gateway21.websitewelcome.com (HELO gateway21.websitewelcome.com) (192.185.45.91) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 31 Aug 2018 14:53:37 +0000 Received: from cm10.websitewelcome.com (cm10.websitewelcome.com [100.42.49.4]) by gateway21.websitewelcome.com (Postfix) with ESMTP id 94EA940106AE6 for ; Fri, 31 Aug 2018 09:53:36 -0500 (CDT) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id vknJfrXOOBcCXvknbfLHdl; Fri, 31 Aug 2018 09:53:35 -0500 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=m9ON/d3C/bRtsqjVWRrNDDyZ1NFYjGvYs1biJgLm8Bg=; b=MWO2bFDIu+Qfcra4hl/IdvDYYg JKM3HEpzVA85RXrLb3XsXzArau65jJQDgjVN4DxQBYB7PYoXHeb8On5fTWBDdc5rfLo4B2qvfhkvg 3wM6bsZgfQYf26dmMDvnY/5M5; Received: from 75-166-85-72.hlrn.qwest.net ([75.166.85.72]:60902 helo=pokyo.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.91) (envelope-from ) id 1fvknJ-000DE9-0j; Fri, 31 Aug 2018 09:53:05 -0500 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 8.2+trunk 2/2] Set TYPE_LENGTH on a variant part Date: Fri, 31 Aug 2018 08:53:02 -0600 Message-Id: <20180831145302.14493-3-tom@tromey.com> In-Reply-To: <20180831145302.14493-1-tom@tromey.com> References: <20180831145302.14493-1-tom@tromey.com> gdb represents a DW_TAG_variant_part as a union. While normally DWARF would not set the size of a DW_TAG_variant_part, gdb's representation requires the TYPE_LENGTH to be set. This patch arranges to set the TYPE_LENGTH of a variant part if it has not already been set. This fixes some Rust regressions when testing against a version of rustc that emits DW_TAG_variant_part. gdb/ChangeLog 2018-08-31 Tom Tromey * dwarf2read.c (dwarf2_add_field): Set the TYPE_LENGTH of the variant part type. --- gdb/ChangeLog | 5 +++++ gdb/dwarf2read.c | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0d55fd45f5..fc9e2b943f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2018-08-31 Tom Tromey + + * dwarf2read.c (dwarf2_add_field): Set the TYPE_LENGTH of the + variant part type. + 2018-08-30 Andrew Burgess * riscv-tdep.c (riscv_insn::decode): Decode c.addi4spn, c.sd, diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 8834d08a1c..d66dfeaf2d 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -15169,6 +15169,18 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die, fp->type = get_die_type (die, cu); fp->artificial = 1; fp->name = "<>"; + + /* Normally a DW_TAG_variant_part won't have a size, but our + representation requires one, so set it to the maximum of the + child sizes. */ + if (TYPE_LENGTH (fp->type) == 0) + { + unsigned max = 0; + for (int i = 0; i < TYPE_NFIELDS (fp->type); ++i) + if (TYPE_LENGTH (TYPE_FIELD_TYPE (fp->type, i)) > max) + max = TYPE_LENGTH (TYPE_FIELD_TYPE (fp->type, i)); + TYPE_LENGTH (fp->type) = max; + } } else gdb_assert_not_reached ("missing case in dwarf2_add_field");