[Lldb-commits] [clang] [lldb] [clang][lldb] Don't assert structure layout correctness for layouts provided by LLDB (PR #93809)

Michael Buch via lldb-commits lldb-commits at lists.llvm.org
Mon Jun 17 08:34:15 PDT 2024


Michael137 wrote:

Yea the problem with checking the size reported by the AST layout vs. the LLVM type layout is that in DWARF we get following representation:
```
// main.cpp
struct A {
  long c, d;
};

struct B {
  [[no_unique_address]] Empty x;
};

struct C {
  [[no_unique_address]] Empty x;
};

struct Foo : B, C, A {};

// dwarfdump
DW_TAG_structure_type
  DW_AT_name ("Foo")
  DW_AT_byte_size (0x10)
  DW_TAG_inheritance
    DW_AT_type (0x0000000000000085 "B")
    DW_AT_data_member_location (0x00)
  DW_TAG_inheritance
    DW_AT_type (0x00000000000000b9 "C")
    DW_AT_data_member_location (0x01)
  DW_TAG_inheritance
    DW_AT_type (0x0000000000000047 "A")
    DW_AT_data_member_location (0x00)
```
Which is a perfectly valid layout, and shows how `B` and `C` don't contribute any size to `Foo`.

However, the LLDB's AST gets lowered to:
```
Layout: <CGRecordLayout
  LLVMType:%struct.Foo = type { %struct.B, %struct.C, %struct.E, [18446744073709551615 x i8], [14 x i8], i64 }
  NonVirtualBaseLLVMType:%struct.Foo = type { %struct.B, %struct.C, %struct.E, [18446744073709551615 x i8], [14 x i8], i64 }
  IsZeroInitializable:1
  BitFields:[
]>
```
(side-note, the `18446744073709551615` here happens because using the offsets from DWARF results in negative padding during lowering, but `getTypeAllocSizeInBits` ends up wrapping the value around in the calculations without issues it seems).

This won't pass the `AST layout size == LLVM type size` check. So it doesn't seem like anything unexpected is going on here, the lack of `no_unique_address` causes the lowering to get confused. Though I don't think we would want to fixup the size passed to `RecordLayout`, because that's the one that we get from Clang via DWARF, and should be the correct one to use. Don't have a good idea on how we would get around the lack of `no_unique_address` here (without relaxing the assertion for external sources, or encoding it in DWARF in some way).

https://github.com/llvm/llvm-project/pull/93809


More information about the lldb-commits mailing list