[Lldb-commits] [PATCH] D76808: Fix handling of bit-fields when there is a base class when parsing DWARF
Shafik Yaghmour via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Wed Mar 25 15:44:11 PDT 2020
shafik created this revision.
shafik added reviewers: aprantl, labath.
shafik added a reviewer: vsk.
When parsing DWARF and laying out bit-fields we currently don't take into account whether we have a base class or not. Currently if the first field is a bit-field but the bit offset is due a field we inherit from a base class we currently treat it as an unnamed bit-field and therefore add an extra field.
This fix will not check if we have a base class and assume that this offset is due to members we are inheriting from the base. We are currently seeing asserts during codegen when debugging `clang::DiagnosticOptions`.
This assumption will fail in the case where the first field in the derived class in an unnamed bit-field. Fixing the first field being an unnamed bit-field looks like it will require a larger change since we will need a way to track or discover the last field offset of the bases(s).
https://reviews.llvm.org/D76808
Files:
lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
lldb/test/API/lang/cpp/bitfields/TestCppBitfields.py
lldb/test/API/lang/cpp/bitfields/main.cpp
Index: lldb/test/API/lang/cpp/bitfields/main.cpp
===================================================================
--- lldb/test/API/lang/cpp/bitfields/main.cpp
+++ lldb/test/API/lang/cpp/bitfields/main.cpp
@@ -60,6 +60,16 @@
}
} clang_example;
+ class B {
+ public:
+ uint32_t b_a;
+ };
+
+ class D : public B {
+ public:
+ uint32_t d_a:1;
+ } derived;
+
lba.a = 2;
lbb.a = 1;
@@ -76,6 +86,8 @@
lbd.arr[2] = '\0';
lbd.a = 5;
+ derived.b_a=2;
+ derived.d_a=1;
return 0; // Set break point at this line.
}
Index: lldb/test/API/lang/cpp/bitfields/TestCppBitfields.py
===================================================================
--- lldb/test/API/lang/cpp/bitfields/TestCppBitfields.py
+++ lldb/test/API/lang/cpp/bitfields/TestCppBitfields.py
@@ -103,3 +103,10 @@
'(uint64_t:1) k = 1',
])
+ self.expect(
+ "frame variable --show-types derived",
+ VARIABLES_DISPLAYED_CORRECTLY,
+ substrs=[
+ '(uint32_t) b_a = 2',
+ '(uint32_t:1) d_a = 1',
+ ])
Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
===================================================================
--- lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
+++ lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
@@ -2670,7 +2670,10 @@
// If we have a gap between the last_field_end and the current
// field we have an unnamed bit-field
if (this_field_info.bit_offset != last_field_end &&
- !(this_field_info.bit_offset < last_field_end)) {
+ !(this_field_info.bit_offset < last_field_end) &&
+ !(last_field_info.bit_offset == 0 &&
+ last_field_info.bit_size == 0 &&
+ layout_info.base_offsets.size() != 0)) {
unnamed_field_info = FieldInfo{};
unnamed_field_info->bit_size =
this_field_info.bit_offset - last_field_end;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D76808.252686.patch
Type: text/x-patch
Size: 2084 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20200325/ac39cc5d/attachment.bin>
More information about the lldb-commits
mailing list