On Mon, Jun 7, 2021 at 10:58 AM Jan Kratochvil via Dwarf-Discuss <dwarf-discuss@lists.dwarfstd.org> wrote: > > Hi, > > clang-12 will create the same DWARF for class B with [[no_unique_address]] > either present or not. Despite that class C derived from B has different > layout depending on from which class B it gets derived
Why is this ^ a problem? The layout seems accurate - in that 'a' shares its address with 'c' - so both members having the same offset seems like an accurate representation of the layout of the struct? > : > > ------------------------------------------------------------------------------ > struct A {}; > struct By { [[no_unique_address]] A a; }; > struct Cy : By { char c; } cy; > struct Bn { A a; }; > struct Cn : Bn { char c; } cn; > #include <iostream> > int main() { > std::cout << "sizeof(Cy) = " << sizeof(Cy) << " offsetof(Cy, c) = " << > offsetof(Cy, c) << "\n"; > std::cout << "sizeof(Cn) = " << sizeof(Cn) << " offsetof(Cn, c) = " << > offsetof(Cn, c) << "\n"; > } > // sizeof(Cy) = 1 offsetof(Cy, c) = 0 > // sizeof(Cn) = 2 offsetof(Cn, c) = 1 > ------------------------------------------------------------------------------ > > gcc-11 creates a different DWARF for the two variants of B but that DWARF does > not look as compliant to me: > > ------------------------------------------------------------------------------ > > DW_TAG_structure_type > DW_AT_name ("B") > DW_AT_byte_size (1) > > DW_TAG_member > DW_AT_name ("a") > DW_AT_type (0x0000001e "A") > By: DW_AT_data_member_location (-1) > Bn: DW_AT_data_member_location (0x00) > > NULL > ------------------------------------------------------------------------------ > > From a discussion at https://reviews.llvm.org/D101237 : > > (1) Raphael Isemann (teemperor) notes: > FWIW, I took a look at the DWARF standard and I think that is actually > something we should already emit in the form of a > "DW_AT_byte_size 0" attribute at the field? Quote: > If the size of a data member is not the same as the size of the type > given for the data member, the data member has either > a DW_AT_byte_size or a DW_AT_bit_size attribute whose integer constant > value (see Section 2.19) is the amount of storage needed to hold the > value of the data member. > > (2) David Blaikie maybe meant in the beginning new DW_AT_no_unique_address > but IIUC that may have been probably later deprecated as not really > needed. > > (3) One could also omit such member completely but that would break template > metaprogramming based on such missing types from DWARF. > > I do not see many other options. That (1) would look like: > > ------------------------------------------------------------------------------ > DW_TAG_structure_type > DW_AT_calling_convention (DW_CC_pass_by_value) > DW_AT_name ("B") > DW_AT_byte_size (0x01) > > DW_TAG_member > DW_AT_name ("a") > DW_AT_type (0x00000065 "A") > Bn: > By: DW_AT_byte_size (0x00) > DW_AT_data_member_location (0x00) > > NULL > ------------------------------------------------------------------------------ > > > Jan > > _______________________________________________ > Dwarf-Discuss mailing list > Dwarf-Discuss@lists.dwarfstd.org > http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org _______________________________________________ Dwarf-Discuss mailing list Dwarf-Discuss@lists.dwarfstd.org http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org