xref: /llvm-project/lldb/test/API/lang/cpp/bitfields/TestCppBitfields.py (revision 974c2f5e22112659549a54ff95ee310a1aac469d)
1"""Show bitfields and check that they display correctly."""
2
3import lldb
4from lldbsuite.test.decorators import *
5from lldbsuite.test.lldbtest import *
6from lldbsuite.test import lldbutil
7
8
9class CppBitfieldsTestCase(TestBase):
10
11    mydir = TestBase.compute_mydir(__file__)
12
13    @no_debug_info_test
14    def test_bitfields(self):
15        self.build()
16        lldbutil.run_to_source_breakpoint(self, '// break here',
17            lldb.SBFileSpec("main.cpp", False))
18
19        # Accessing LargeBitsA.
20        self.expect_expr("lba", result_children=[
21            ValueCheck(name="", type="int:32"),
22            ValueCheck(name="a", type="unsigned int:20", value="2")
23        ])
24        self.expect_expr("lba.a", result_type="unsigned int", result_value="2")
25
26
27        # Accessing LargeBitsB.
28        self.expect_expr("lbb", result_children=[
29            ValueCheck(name="a", type="unsigned int:1", value="1"),
30            ValueCheck(name="", type="int:31"),
31            ValueCheck(name="b", type="unsigned int:20", value="3")
32        ])
33        self.expect_expr("lbb.b", result_type="unsigned int", result_value="3")
34
35
36        # Accessing LargeBitsC.
37        self.expect_expr("lbc", result_children=[
38            ValueCheck(name="", type="int:22"),
39            ValueCheck(name="a", type="unsigned int:1", value="1"),
40            ValueCheck(name="b", type="unsigned int:1", value="0"),
41            ValueCheck(name="c", type="unsigned int:5", value="4"),
42            ValueCheck(name="d", type="unsigned int:1", value="1"),
43            ValueCheck(name="", type="int:2"),
44            ValueCheck(name="e", type="unsigned int:20", value="20"),
45        ])
46        self.expect_expr("lbc.c", result_type="unsigned int", result_value="4")
47
48
49        # Accessing LargeBitsD.
50        self.expect_expr("lbd", result_children=[
51            ValueCheck(name="arr", type="char[3]", summary='"ab"'),
52            ValueCheck(name="", type="int:32"),
53            ValueCheck(name="a", type="unsigned int:20", value="5")
54        ])
55        self.expect_expr("lbd.a", result_type="unsigned int", result_value="5")
56
57
58        # Test BitfieldsInStructInUnion.
59        # FIXME: This needs some more explanation for what it's actually testing.
60        nested_struct_children = [
61            ValueCheck(name="", type="int:22"),
62            ValueCheck(name="a", type="uint64_t:1", value="1"),
63            ValueCheck(name="b", type="uint64_t:1", value="0"),
64            ValueCheck(name="c", type="uint64_t:1", value="1"),
65            ValueCheck(name="d", type="uint64_t:1", value="0"),
66            ValueCheck(name="e", type="uint64_t:1", value="1"),
67            ValueCheck(name="f", type="uint64_t:1", value="0"),
68            ValueCheck(name="g", type="uint64_t:1", value="1"),
69            ValueCheck(name="h", type="uint64_t:1", value="0"),
70            ValueCheck(name="i", type="uint64_t:1", value="1"),
71            ValueCheck(name="j", type="uint64_t:1", value="0"),
72            ValueCheck(name="k", type="uint64_t:1", value="1")
73        ]
74        self.expect_expr("bitfields_in_struct_in_union",
75            result_type="BitfieldsInStructInUnion",
76            result_children=[ValueCheck(name="", children=[
77              ValueCheck(name="f", children=nested_struct_children)
78            ])]
79        )
80        self.expect_expr("bitfields_in_struct_in_union.f.a",
81            result_type="uint64_t", result_value="1")
82
83
84        # Unions with bitfields.
85        self.expect_expr("uwbf", result_type="UnionWithBitfields", result_children=[
86            ValueCheck(name="a", value="255"),
87            ValueCheck(name="b", value="65535"),
88            ValueCheck(name="c", value="4294967295"),
89            ValueCheck(name="x", value="4294967295")
90        ])
91        self.expect_expr("uwubf", result_type="UnionWithUnnamedBitfield",
92            result_children=[
93                ValueCheck(name="a", value="16777215"),
94                ValueCheck(name="x", value="4294967295")
95            ]
96        )
97
98        # Class with a base class and a bitfield.
99        self.expect_expr("derived", result_type="Derived", result_children=[
100            ValueCheck(name="Base", children=[
101              ValueCheck(name="b_a", value="2", type="uint32_t")
102            ]),
103            ValueCheck(name="d_a", value="1", type="uint32_t:1")
104        ])
105
106
107        # Struct with bool bitfields.
108        self.expect_expr("bb", result_type="", result_children=[
109            ValueCheck(name="a", value="true", type="bool:1"),
110            ValueCheck(name="b", value="false", type="bool:1"),
111            ValueCheck(name="c", value="true", type="bool:2"),
112            ValueCheck(name="d", value="true", type="bool:2")
113        ])
114
115        bb = self.frame().FindVariable('bb')
116        self.assertSuccess(bb.GetError())
117
118        bb_a = bb.GetChildAtIndex(0)
119        self.assertSuccess(bb_a.GetError())
120        self.assertEqual(bb_a.GetValueAsUnsigned(), 1)
121        self.assertEqual(bb_a.GetValueAsSigned(), 1)
122
123        bb_b = bb.GetChildAtIndex(1)
124        self.assertSuccess(bb_b.GetError())
125        self.assertEqual(bb_b.GetValueAsUnsigned(), 0)
126        self.assertEqual(bb_b.GetValueAsSigned(), 0)
127
128        bb_c = bb.GetChildAtIndex(2)
129        self.assertSuccess(bb_c.GetError())
130        self.assertEqual(bb_c.GetValueAsUnsigned(), 1)
131        self.assertEqual(bb_c.GetValueAsSigned(), 1)
132
133        bb_d = bb.GetChildAtIndex(3)
134        self.assertSuccess(bb_d.GetError())
135        self.assertEqual(bb_d.GetValueAsUnsigned(), 1)
136        self.assertEqual(bb_d.GetValueAsSigned(), 1)
137
138        # Test a class with a base class that has a vtable ptr. The derived
139        # class has bitfields.
140        base_with_vtable_children = [
141            ValueCheck(name="a", type="unsigned int:4", value="5"),
142            ValueCheck(name="b", type="unsigned int:4", value="0"),
143            ValueCheck(name="c", type="unsigned int:4", value="5")
144        ]
145        self.expect_expr("base_with_vtable", result_children=base_with_vtable_children)
146        self.expect_var_path("base_with_vtable", children=base_with_vtable_children)
147
148    # FIXME: These all crash due the vtable ptr.
149    @skipIf
150    @no_debug_info_test
151    def test_bitfield_behind_vtable_ptr(self):
152        self.build()
153        lldbutil.run_to_source_breakpoint(self, '// break here',
154            lldb.SBFileSpec("main.cpp", False))
155
156        # Test a class with a vtable ptr and bitfields.
157        with_vtable_children = [
158            ValueCheck(name="a", type="unsigned int:4", value="5"),
159            ValueCheck(name="b", type="unsigned int:4", value="0"),
160            ValueCheck(name="c", type="unsigned int:4", value="5")
161        ]
162        self.expect_expr("with_vtable", result_children=with_vtable_children)
163        self.expect_var_path("with_vtable", children=with_vtable_children)
164
165        # Test a class with a vtable ptr and unnamed bitfield directly after.
166        with_vtable_and_unnamed_children = [
167            ValueCheck(name="", type="unsigned int:4", value="0"),
168            ValueCheck(name="b", type="unsigned int:4", value="0"),
169            ValueCheck(name="c", type="unsigned int:4", value="5")
170        ]
171        self.expect_expr("with_vtable_and_unnamed",
172                         result_children=with_vtable_and_unnamed_children)
173        self.expect_var_path("with_vtable_and_unnamed",
174                         children=with_vtable_and_unnamed_children)
175