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.
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.
Created attachment 20733 [details] gcc46-pr41048.patch Untested fix.
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
Fixed.