Bug 41048 - bad DW_AT_data_member_location from g++
Summary: bad DW_AT_data_member_location from g++
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: debug (show other bugs)
Version: 4.5.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2009-08-12 19:18 UTC by Tom Tromey
Modified: 2010-07-28 14:32 UTC (History)
3 users (show)

See Also:
Host:
Target: HWi == 32bits
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments
gcc46-pr41048.patch (3.11 KB, patch)
2010-05-24 11:13 UTC, Jakub Jelinek
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
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.