summaryrefslogtreecommitdiffstats
path: root/lldb/packages/Python/lldbsuite/test/lang/cpp/bitfields/main.cpp
diff options
context:
space:
mode:
authorshafik <syaghmour@apple.com>2020-01-23 14:42:12 -0800
committerHans Wennborg <hans@chromium.org>2020-01-27 15:10:11 +0100
commitb5cf892651812003e64c4a8f0dbf81f74a499016 (patch)
treedb4ff10565697d63826611da6bd021238969cd18 /lldb/packages/Python/lldbsuite/test/lang/cpp/bitfields/main.cpp
parent2c9cb89d0d00dc8669410a7d57ada11c5f7f8409 (diff)
downloadbcm5719-llvm-b5cf892651812003e64c4a8f0dbf81f74a499016.tar.gz
bcm5719-llvm-b5cf892651812003e64c4a8f0dbf81f74a499016.zip
[LLDB] Fix the handling of unnamed bit-fields when parsing DWARF
We ran into an assert when debugging clang and performing an expression on a class derived from DeclContext. The assert was indicating we were getting the offsets wrong for RecordDeclBitfields. We were getting both the size and offset of unnamed bit-field members wrong. We could fix this case with a quick change but as I extended the test suite to include more combinations we kept finding more cases that were being handled incorrectly. A fix that handled all the new cases as well as the cases already covered required a refactor of the existing technique. Differential Revision: https://reviews.llvm.org/D72953 (cherry picked from commit fcaf5f6c01a09f23b948afb8c91c4dd951d4525e)
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test/lang/cpp/bitfields/main.cpp')
-rw-r--r--lldb/packages/Python/lldbsuite/test/lang/cpp/bitfields/main.cpp81
1 files changed, 81 insertions, 0 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/bitfields/main.cpp b/lldb/packages/Python/lldbsuite/test/lang/cpp/bitfields/main.cpp
new file mode 100644
index 00000000000..975c0f05683
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/bitfields/main.cpp
@@ -0,0 +1,81 @@
+#include <stdint.h>
+
+int main(int argc, char const *argv[]) {
+ struct LargeBitsA {
+ unsigned int : 30, a : 20;
+ } lba;
+
+ struct LargeBitsB {
+ unsigned int a : 1, : 11, : 12, b : 20;
+ } lbb;
+
+ struct LargeBitsC {
+ unsigned int : 13, : 9, a : 1, b : 1, c : 5, d : 1, e : 20;
+ } lbc;
+
+ struct LargeBitsD {
+ char arr[3];
+ unsigned int : 30, a : 20;
+ } lbd;
+
+ // This case came up when debugging clang and models RecordDeclBits
+ struct BitExampleFromClangDeclContext {
+ class fields {
+ uint64_t : 13;
+ uint64_t : 9;
+
+ uint64_t a: 1;
+ uint64_t b: 1;
+ uint64_t c: 1;
+ uint64_t d: 1;
+ uint64_t e: 1;
+ uint64_t f: 1;
+ uint64_t g: 1;
+ uint64_t h: 1;
+ uint64_t i: 1;
+ uint64_t j: 1;
+ uint64_t k: 1;
+
+ // In order to reproduce the crash for this case we need the
+ // members of fields to stay private :-(
+ friend struct BitExampleFromClangDeclContext;
+ };
+
+ union {
+ struct fields f;
+ };
+
+ BitExampleFromClangDeclContext() {
+ f.a = 1;
+ f.b = 0;
+ f.c = 1;
+ f.d = 0;
+ f.e = 1;
+ f.f = 0;
+ f.g = 1;
+ f.h = 0;
+ f.i = 1;
+ f.j = 0;
+ f.k = 1;
+ }
+ } clang_example;
+
+ lba.a = 2;
+
+ lbb.a = 1;
+ lbb.b = 3;
+
+ lbc.a = 1;
+ lbc.b = 0;
+ lbc.c = 4;
+ lbc.d = 1;
+ lbc.e = 20;
+
+ lbd.arr[0] = 'a';
+ lbd.arr[1] = 'b';
+ lbd.arr[2] = 'c';
+ lbd.a = 5;
+
+
+ return 0; // Set break point at this line.
+}
OpenPOWER on IntegriCloud