[Dwarf-Discuss] How to map [[no_unique_address]] into DWARF
Jan Kratochvil
jan.kratochvil@redhat.com
Mon Jun 7 17:58:43 GMT 2021
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:
------------------------------------------------------------------------------
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
More information about the Dwarf-discuss
mailing list