diff options
author | shafik <syaghmour@apple.com> | 2020-01-23 14:42:12 -0800 |
---|---|---|
committer | Hans Wennborg <hans@chromium.org> | 2020-01-27 15:10:11 +0100 |
commit | b5cf892651812003e64c4a8f0dbf81f74a499016 (patch) | |
tree | db4ff10565697d63826611da6bd021238969cd18 /lldb/packages/Python/lldbsuite/test/lang/cpp/bitfields/main.cpp | |
parent | 2c9cb89d0d00dc8669410a7d57ada11c5f7f8409 (diff) | |
download | bcm5719-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.cpp | 81 |
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. +} |