[LLDB] Fix handling of bit-fields in a union

When parsing DWARF and laying out bit-fields we don't properly take into account when they are in a union, they will all have a zero offset.

Differential Revision: https://reviews.llvm.org/D91118
This commit is contained in:
shafik
2020-11-12 11:22:02 -08:00
parent d5e89e8fc1
commit bae9aedb34
3 changed files with 30 additions and 1 deletions

View File

@@ -2581,7 +2581,11 @@ void DWARFASTParserClang::ParseSingleMember(
// The ObjC runtime knows the byte offset but we still need to provide
// the bit-offset in the layout. It just means something different then
// what it does in C and C++. So we skip this check for ObjC types.
//
// We also skip this for fields of a union since they will all have a
// zero offset.
if (!TypeSystemClang::IsObjCObjectOrInterfaceType(class_clang_type) &&
!(parent_die.Tag() == DW_TAG_union_type && this_field_info.bit_offset == 0) &&
((this_field_info.bit_offset >= parent_bit_size) ||
(last_field_info.IsBitfield() &&
!last_field_info.NextBitfieldOffsetIsValid(

View File

@@ -46,6 +46,16 @@ class CppBitfieldsTestCase(TestBase):
self.expect("expr (clang_example.f.a)", VARIABLES_DISPLAYED_CORRECTLY,
substrs=['uint64_t', '1'])
self.expect("expr uwbf",
substrs=['a = 255',
'b = 65535',
'c = 4294967295',
'x = 4294967295'] )
self.expect("expr uwubf",
substrs=['a = 16777215',
'x = 4294967295'] )
self.expect(
"frame variable --show-types lba",
VARIABLES_DISPLAYED_CORRECTLY,

View File

@@ -57,7 +57,7 @@ int main(int argc, char const *argv[]) {
f.i = 1;
f.j = 0;
f.k = 1;
}
}
} clang_example;
class B {
@@ -70,6 +70,18 @@ int main(int argc, char const *argv[]) {
uint32_t d_a : 1;
} derived;
union union_with_bitfields {
unsigned int a : 8;
unsigned int b : 16;
unsigned int c : 32;
unsigned int x;
} uwbf;
union union_with_unnamed_bitfield {
unsigned int : 16, a : 24;
unsigned int x;
} uwubf;
lba.a = 2;
lbb.a = 1;
@@ -89,5 +101,8 @@ int main(int argc, char const *argv[]) {
derived.b_a = 2;
derived.d_a = 1;
uwbf.x = 0xFFFFFFFF;
uwubf.x = 0xFFFFFFFF;
return 0; // Set break point at this line.
}