Bug 41048

Summary: bad DW_AT_data_member_location from g++
Product: gcc Reporter: Tom Tromey <tromey>
Component: debugAssignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED FIXED    
Severity: normal CC: david.plumb, dodji, gcc-bugs
Priority: P3    
Version: 4.5.0   
Target Milestone: ---   
Host: Target: HWi == 32bits
Build: Known to work:
Known to fail: Last reconfirmed:
Attachments: gcc46-pr41048.patch

Description Tom Tromey 2009-08-12 19:18:38 UTC
This example came from the gdb list:

#include "stdio.h"
class Blah
{
    public:
        Blah(): mFlag(0) {}
        void setFlag( int value ) {
            mFlag = value;
        }
        void printFlag() {
            printf( "Flag value is %d\n", mFlag );
        }
    private:
        int mHugeArray[0x08000001];
        int mFlag;
};

int main( int argc, char* argv[] )
{
    Blah* foo = new Blah();
    foo->setFlag(1);
    foo->printFlag();
    return 0;
}


I compiled this using today's svn trunk g++.
Then readelf shows:

 <2><8e>: Abbrev Number: 7 (DW_TAG_member)
    <8f>   DW_AT_name        : (indirect string, offset: 0x9f): mHugeArray      
    <93>   DW_AT_decl_file   : 1        
    <94>   DW_AT_decl_line   : 13       
    <95>   DW_AT_type        : <0xf2>   
    <99>   DW_AT_data_member_location: 2 byte block: 23 0       (DW_OP_plus_uconst: 0)
    <9c>   DW_AT_accessibility: 3       (private)
 <2><9d>: Abbrev Number: 7 (DW_TAG_member)
    <9e>   DW_AT_name        : (indirect string, offset: 0x0): mFlag    
    <a2>   DW_AT_decl_file   : 1        
    <a3>   DW_AT_decl_line   : 14       
    <a4>   DW_AT_type        : <0x53>   
    <a8>   DW_AT_data_member_location: 2 byte block: 23 0       (DW_OP_plus_uconst: 0)
    <ab>   DW_AT_accessibility: 3       (private)


Both fields the same DW_AT_data_member_location.
Comment 1 Andrew Pinski 2009-08-12 19:25:38 UTC
I think this only happens for HWI == 32bits.  It works for me with a compiler for ppc64-linux-gnu but fails with i686-linux-gnu.  (Oh it works for i386-darwin too which has HWI as being 64bits).

One more reason to change HWI for x86 to be 64bits by default.
Comment 2 Jakub Jelinek 2010-05-24 11:13:01 UTC
Created attachment 20733 [details]
gcc46-pr41048.patch

Untested fix.
Comment 3 Jakub Jelinek 2010-05-28 13:47:10 UTC
Subject: Bug 41048

Author: jakub
Date: Fri May 28 13:46:46 2010
New Revision: 159975

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=159975
Log:
	PR debug/41048
	* dwarf2out.c (double_int_type_size_in_bits): New function.
	(round_up_to_align): Change first argument and return value to
	double_int.
	(field_byte_offset): Work internally on double_ints.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/dwarf2out.c

Comment 4 Jakub Jelinek 2010-07-28 14:32:19 UTC
Fixed.