[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