Hi, On Fri, Oct 02, 2020 at 06:18:19PM -0300, Arnaldo Carvalho de Melo wrote: > Em Fri, Oct 02, 2020 at 06:11:06PM +0200, Mark Wielaard escreveu: > > Seems pahole with a recent version of elfutils libdw already handles > > most DWARF5 encodings. One thing it doesn't handle yet is > > DW_AT_data_bit_offset (this is actually a DWARF4 thing, but gcc only > > emits it for -gdwarf-5). > > > > Note that the actual bit offset for the different attributes is defined > > differently: > > > > DW_AT_bit_offset: The bit offset attribute describes the offset in bits > > of the high order bit of a value of the given type from the high order > > bit of the storage unit used to contain that value. > > > > DW_AT_data_bit_offset: the value is an integer constant that specifies > > the number of bits from the beginning of the containing entity to the > > beginning of the data member. > > > > If there is a DW_AT_data_bit_offset instead of a > > DW_AT_data_member_location then there will be no DW_AT_byte_size and no > > DW_AT_bit_offset. > > > > DWARF5 has some example for big and little endian in D.2.8 C/C++ Bit- > > Field Examples > > > > dwarf_loader.c already seems to do the right thing for little-endian > > machines with DW_AT_data_member_location and DW_AT_bit_offset. For > > DW_AT_data_bit_offset it doesn't have to do this fixup because it is > > already defined as you would expect. > > > > Example that shows the issue: > > > > $ cat bf.c > > struct pea > > { > > int type; > > long a:1, b:1, c:1; > > }; > > > > struct pea p; > > > > $ gcc -gdwarf-4 -c bf.c > > $ ./pahole ./bf.o > > struct pea { > > int type; /* 0 4 */ > > > > /* Bitfield combined with previous fields */ > > > > long int a:1; /* 0:32 8 */ > > long int b:1; /* 0:33 8 */ > > long int c:1; /* 0:34 8 */ > > > > /* size: 8, cachelines: 1, members: 4 */ > > /* bit_padding: 29 bits */ > > /* last cacheline: 8 bytes */ > > }; > > $ gcc -gdwarf-5 -c bf.c > > $ ./pahole ./bf.o > > DW_AT_<0xd>=0x21 > > DW_AT_<0xd>=0x21 > > DW_AT_<0xd>=0x21 > > struct pea { > > int type; /* 0 4 */ > > static long int a; /* 0 0 */ > > static long int b; /* 0 0 */ > > static long int c; /* 0 0 */ > > > > /* size: 8, cachelines: 1, members: 1, static members: 3 */ > > /* padding: 4 */ > > /* last cacheline: 8 bytes */ > > }; > > > > Note that GCC11 might default to DWARF5. > > Thanks for the detailed report, I'm releasing v1.18 right now, will look > into that for v1.19. Note that GCC11 indeed just switched to producing DWARF5 by default. It is not released yet, but already in stage4 and Fedora will start doing a mass-rebuild with it soon to shake out the last remaining bugs. Cheers, Mark