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