From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15806 invoked by alias); 28 Jun 2010 19:10:13 -0000 Received: (qmail 15794 invoked by uid 22791); 28 Jun 2010 19:10:11 -0000 X-SWARE-Spam-Status: No, hits=-5.8 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,TW_GD,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 28 Jun 2010 19:10:04 +0000 Received: from int-mx04.intmail.prod.int.phx2.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.17]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o5SJA3Xv024701 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Jun 2010 15:10:03 -0400 Received: from host0.dyn.jankratochvil.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx04.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o5SJA0Co012827 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 28 Jun 2010 15:10:02 -0400 Received: from host0.dyn.jankratochvil.net (localhost [127.0.0.1]) by host0.dyn.jankratochvil.net (8.14.4/8.14.4) with ESMTP id o5SJA0em017062; Mon, 28 Jun 2010 21:10:00 +0200 Received: (from jkratoch@localhost) by host0.dyn.jankratochvil.net (8.14.4/8.14.4/Submit) id o5SJ9xq3017061; Mon, 28 Jun 2010 21:09:59 +0200 Date: Mon, 28 Jun 2010 19:10:00 -0000 From: Jan Kratochvil To: Doug Evans Cc: gdb-patches@sourceware.org Subject: Re: [RFA] Fix PR gdb/11702, printing of static const member variables Message-ID: <20100628190959.GA16958@host0.dyn.jankratochvil.net> References: <20100627182442.AF5CA84613@ruffy.mtv.corp.google.com> <20100628110222.GA21051@host0.dyn.jankratochvil.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.20 (2009-12-10) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-06/txt/msg00650.txt.bz2 On Mon, 28 Jun 2010 20:26:12 +0200, Doug Evans wrote: > On Mon, Jun 28, 2010 at 4:02 AM, Jan Kratochvil > wrote: > > On Sun, 27 Jun 2010 20:24:42 +0200, Doug Evans wrote: > >> btw, the dwarf4 standard, as I read it, says static member variables are > >> identified by having DW_AT_external.  [4.1 Data Object Entries] > >> However, dwarf2_add_field is calling die_is_declaration. > > > > echo 'class C { static const float i = 1; } c;'|g++ -c -o 1.o -Wall -g -x c++ - > >    < c>   DW_AT_producer    : (indirect string, offset: 0x11): GNU C++ 4.6.0 20100628 (experimental) > >  <2><33>: Abbrev Number: 3 (DW_TAG_member) > >    <34>   DW_AT_name        : i > >    <38>   DW_AT_type        : <0x45> > >    <3c>   DW_AT_external    : 1 > >    <3d>   DW_AT_accessibility: 3       (private) > >    <3e>   DW_AT_declaration : 1 > >    <3f>   DW_AT_const_value : 4 byte block: 0 0 80 3f > > > > Isn't it primarily a bug in GCC?  There is no other DIE for `i' and it is > > a complete definition so there is no place for DW_AT_declaration there. > > > > Just such GCC change will be incompatible with existing GDBs, maybe to make > > the GCC change only for -gdwarf-4 upwards which is incompatible with older > > GDBs anyway? > > I'm not sure I follow. > If all the GCC versions we care about are also adding DW_AT_external > to the DIE, gdb *could* check for it instead of die_is_declaration, > right? Or am I missing something? Your referenced text # DWARF-4: 4.1 Data Object Entries # The definitions of C++ static data members of structures or classes are # represented by variable entries flagged as external. Both file static and # local variables in C and C++ are represented by non-external variable entries. IMO more describes when `external' is present. It does not describe that member is `static' would be determined by presence of the `external' attribute. ------------------------------------------------------------------------------ There are several problems to solve: (a) How should the DWARF look from a blue sky compiler written from scratch, according to the latest DWARF standard. (b) How should GDB determine it is a `static' field. (c) How should be (b) made backward and forward compatible with current GCC versions. => means "specifies how should be" (b) must not => (a) (c) must not => (a) (a) => (b) (b) => (c) ------------------------------------------------------------------------------ So for the (a) point: I believe GCC should not produce DW_AT_declaration when the same DIE has DW_AT_const_value. (Also checked GCC source that it really does not emit it intentionally and it may be more a bug.) That's all. For the (b) point - GDB should check missing DW_AT_data_member_location. (Just guessed - is it OK? I have not tried to implement it.) (c) I guess the (b) rule works even with current GCC output, no special compatibility cludge is needed. Thanks, Jan