Hello,

I've observed a difference in DWARF output for the same input source code 
between GCC 5 and GCC 6, specifically in the DW_AT_data_member_location values 
for bitfield members of structs. For example,

s.c:
struct s {
  unsigned int shutdown:2,
    no_check_tx:1,
    no_check_rx:1,
    userlocks:4,
    protocol:8,
    type:16;
};

int main() {
  struct s s;
  return 0;
}
    

GCC 5 reports DW_AT_data_member_location for all the fields as 0, which is 
expected.
GCC 6 reports DW_AT_data_member_location for the "type" and "protocol" fields 
as 2 and 1 respectively, all other fields 0 as expected. The DW_AT_bt_offset 
fields for "type" and "protocol" change as well.

Am I wrong to expect that for the given struct above, that the member location 
offset for all fields should be 0 across both compilers?

GCC 5.4.0 readelf --debug-dump:
<snip>
 <2><64>: Abbrev Number: 3 (DW_TAG_member)
    <65>   DW_AT_name        : (indirect string, offset: 0x0): userlocks        
    <69>   DW_AT_decl_file   : 1        
    <6a>   DW_AT_decl_line   : 5        
    <6b>   DW_AT_type        : <0x92>   
    <6f>   DW_AT_byte_size   : 4        
    <70>   DW_AT_bit_size    : 4        
    <71>   DW_AT_bit_offset  : 24       
    <72>   DW_AT_data_member_location: 0        
 <2><73>: Abbrev Number: 3 (DW_TAG_member)
    <74>   DW_AT_name        : (indirect string, offset: 0x1c): protocol        
    <78>   DW_AT_decl_file   : 1        
    <79>   DW_AT_decl_line   : 6        
    <7a>   DW_AT_type        : <0x92>   
    <7e>   DW_AT_byte_size   : 4        
    <7f>   DW_AT_bit_size    : 8        
    <80>   DW_AT_bit_offset  : 16       
    <81>   DW_AT_data_member_location: 0        
 <2><82>: Abbrev Number: 3 (DW_TAG_member)
    <83>   DW_AT_name        : (indirect string, offset: 0x17): type    
    <87>   DW_AT_decl_file   : 1        
    <88>   DW_AT_decl_line   : 7        
    <89>   DW_AT_type        : <0x92>   
    <8d>   DW_AT_byte_size   : 4        
    <8e>   DW_AT_bit_size    : 16       
    <8f>   DW_AT_bit_offset  : 0        
    <90>   DW_AT_data_member_location: 0        
<snip>

GCC 6.1.0 readelf --debug-dump:
<snip>
 <2><64>: Abbrev Number: 3 (DW_TAG_member)
    <65>   DW_AT_name        : (indirect string, offset: 0x0): userlocks        
    <69>   DW_AT_decl_file   : 1        
    <6a>   DW_AT_decl_line   : 5        
    <6b>   DW_AT_type        : <0x92>   
    <6f>   DW_AT_byte_size   : 4        
    <70>   DW_AT_bit_size    : 4        
    <71>   DW_AT_bit_offset  : 24       
    <72>   DW_AT_data_member_location: 0        
 <2><73>: Abbrev Number: 3 (DW_TAG_member)
    <74>   DW_AT_name        : (indirect string, offset: 0x4a): protocol        
    <78>   DW_AT_decl_file   : 1        
    <79>   DW_AT_decl_line   : 6        
    <7a>   DW_AT_type        : <0x92>   
    <7e>   DW_AT_byte_size   : 4        
    <7f>   DW_AT_bit_size    : 8        
    <80>   DW_AT_bit_offset  : 24       
    <81>   DW_AT_data_member_location: 1        
 <2><82>: Abbrev Number: 3 (DW_TAG_member)
    <83>   DW_AT_name        : (indirect string, offset: 0x17): type    
    <87>   DW_AT_decl_file   : 1        
    <88>   DW_AT_decl_line   : 7        
    <89>   DW_AT_type        : <0x92>   
    <8d>   DW_AT_byte_size   : 4        
    <8e>   DW_AT_bit_size    : 16       
    <8f>   DW_AT_bit_offset  : 16       
    <90>   DW_AT_data_member_location: 2        
<snip>

Reply via email to