From patchwork Mon Mar 31 17:47:50 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 358 Return-Path: X-Original-To: siddhesh@wilcox.dreamhost.com Delivered-To: siddhesh@wilcox.dreamhost.com Received: from homiemail-mx21.g.dreamhost.com (peon2454.g.dreamhost.com [208.113.200.127]) by wilcox.dreamhost.com (Postfix) with ESMTP id B86B436023F for ; Mon, 31 Mar 2014 10:47:58 -0700 (PDT) Received: by homiemail-mx21.g.dreamhost.com (Postfix, from userid 14314964) id 60D86100970B; Mon, 31 Mar 2014 10:47:58 -0700 (PDT) X-Original-To: gdb@patchwork.siddhesh.in Delivered-To: x14314964@homiemail-mx21.g.dreamhost.com Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by homiemail-mx21.g.dreamhost.com (Postfix) with ESMTPS id 28550FFD2B7 for ; Mon, 31 Mar 2014 10:47:58 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:references:date:in-reply-to :message-id:mime-version:content-type; q=dns; s=default; b=vKfdM SA+DBoqLm2tP7ahOeKl4f64SKBJF7Dxu2xgkerrkUPYmdAekPbO7FXiO7dYtFTi6 1qpqKppkExMaqEQ1LRhQ91fbOCSxFyFOw5OxiwDGOFZmFUWTO1DEXne4s3dyFyB1 qj/SC4aW+By84OBdaTvjpnmcS9dDGSqnccgdfk= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:references:date:in-reply-to :message-id:mime-version:content-type; s=default; bh=X9Yt+RssVt0 ONTIWIllTiX8Ye0E=; b=vicGqRugifri2TrWDAaiuhi+1ac+N/f/7mI1zlHf1CP w/tMm/ls4lv2kkOQtJuL0ZGEXzD7LMJMZJ0oT8vVPt4CfLNg1XvudMDn+7nBgw3s gS7WzuG3GLV41MtxljGyEAYiweQBB9rtI7GBP5ok6iYvwzhgwRcnDctJ4/NiAL2w = Received: (qmail 22564 invoked by alias); 31 Mar 2014 17:47:56 -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 22513 invoked by uid 89); 31 Mar 2014 17:47:55 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.1 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 31 Mar 2014 17:47:54 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2VHlq63012974 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 31 Mar 2014 13:47:52 -0400 Received: from barimba (ovpn-113-41.phx2.redhat.com [10.3.113.41]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2VHlokk014733 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO); Mon, 31 Mar 2014 13:47:51 -0400 From: Tom Tromey To: Mark Wielaard Cc: gdb-patches@sourceware.org Subject: Re: [PATCH] handle DW_AT_type on an enumeration References: <1395936887-8173-1-git-send-email-tromey@redhat.com> <1395999280.3824.64.camel@bordewijk.wildebeest.org> Date: Mon, 31 Mar 2014 11:47:50 -0600 In-Reply-To: <1395999280.3824.64.camel@bordewijk.wildebeest.org> (Mark Wielaard's message of "Fri, 28 Mar 2014 10:34:40 +0100") Message-ID: <87zjk6gszd.fsf@fleche.redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux) MIME-Version: 1.0 X-DH-Original-To: gdb@patchwork.siddhesh.in >>>>> "Mark" == Mark Wielaard writes: Mark> I build and did a make check against GCC with this patch applied: Mark> http://gcc.gnu.org/ml/gcc-patches/2014-03/msg01448.html Mark> And saw no regressions (and the new test passes) on RHEL6 x86_64. Thanks. >> @@ -13247,6 +13255,20 @@ read_enumeration_type (struct die_info >> *die, struct dwarf2_cu *cu) >> /* Finish the creation of this type by using the enum's children. */ >> update_enumeration_type_from_children (die, type, cu); Mark> You might want to add a comment here that you are still calling Mark> update_enumeration_type_from_children to guess the TYPE_FLAG_ENUM even Mark> though you will drop the TYPE_UNSIGNED guess later. At least I was a Mark> little confused at first why you still called Mark> update_enumeration_type_from_children in case you already knew the type. I've added /* Finish the creation of this type by using the enum's children. We must call this even when the underlying type has been provided so that we can determine if we're looking at a "flag" enum. */ update_enumeration_type_from_children (die, type, cu); New patch appended. Tom diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 25ab6fa..341287b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2014-03-31 Tom Tromey + + * dwarf2read.c (read_enumeration_type): Handle DW_AT_type. + 2014-03-30 Doug Evans * infrun.c (set_last_target_status): New function. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 64f7383..964c956 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -13224,6 +13224,14 @@ read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu) if (name != NULL) TYPE_TAG_NAME (type) = name; + attr = dwarf2_attr (die, DW_AT_type, cu); + if (attr != NULL) + { + struct type *underlying_type = die_type (die, cu); + + TYPE_TARGET_TYPE (type) = underlying_type; + } + attr = dwarf2_attr (die, DW_AT_byte_size, cu); if (attr) { @@ -13242,9 +13250,25 @@ read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu) if (die_is_declaration (die, cu)) TYPE_STUB (type) = 1; - /* Finish the creation of this type by using the enum's children. */ + /* Finish the creation of this type by using the enum's children. + We must call this even when the underlying type has been provided + so that we can determine if we're looking at a "flag" enum. */ update_enumeration_type_from_children (die, type, cu); + /* If this type has an underlying type that is not a stub, then we + may use its attributes. We always use the "unsigned" attribute + in this situation, because ordinarily we guess whether the type + is unsigned -- but the guess can be wrong and the underlying type + can tell us the reality. However, we defer to a local size + attribute if one exists, because this lets the compiler override + the underlying type if needed. */ + if (TYPE_TARGET_TYPE (type) != NULL && !TYPE_STUB (TYPE_TARGET_TYPE (type))) + { + TYPE_UNSIGNED (type) = TYPE_UNSIGNED (TYPE_TARGET_TYPE (type)); + if (TYPE_LENGTH (type) == 0) + TYPE_LENGTH (type) = TYPE_LENGTH (TYPE_TARGET_TYPE (type)); + } + return set_die_type (die, type, cu); } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 569c899..0711f14 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-03-31 Tom Tromey + + * gdb.dwarf2/enum-type.exp: New file. + 2014-03-31 Yao Qi * gdb.base/source-dir.exp: Allow ';' as a directory separator. diff --git a/gdb/testsuite/gdb.dwarf2/enum-type.exp b/gdb/testsuite/gdb.dwarf2/enum-type.exp new file mode 100644 index 0000000..60457a6 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/enum-type.exp @@ -0,0 +1,60 @@ +# Copyright 2014 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +load_lib dwarf.exp + +# This test can only be run on targets which support DWARF-2 and use gas. +if {![dwarf2_support]} { + return 0 +} + +standard_testfile main.c enum-type-dw.S + +# Make some DWARF for the test. +set asm_file [standard_output_file $srcfile2] +Dwarf::assemble $asm_file { + cu {} { + DW_TAG_compile_unit { + {DW_AT_language @DW_LANG_C} + {DW_AT_name enum-type-dw.c} + {DW_AT_comp_dir /tmp} + } { + declare_labels integer_label array_elt_label array_label \ + big_array_label + + integer_label: DW_TAG_base_type { + {DW_AT_byte_size 4 DW_FORM_sdata} + {DW_AT_encoding @DW_ATE_signed} + {DW_AT_name integer} + } + + DW_TAG_enumeration_type { + {DW_AT_name E} + {DW_AT_type :$integer_label} + } { + DW_TAG_enumerator { + {DW_AT_name ONE} + {DW_AT_const_value 1} + } + } + } + } +} + +if { [prepare_for_testing ${testfile}.exp ${testfile} \ + [list $srcfile $asm_file] {nodebug}] } { + return -1 +} + +gdb_test "print sizeof(enum E)" " = 4"