199451b44SJordan Rupprecht"""Show bitfields and check that they display correctly."""
299451b44SJordan Rupprecht
399451b44SJordan Rupprechtimport lldb
499451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
599451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
699451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
799451b44SJordan Rupprecht
899451b44SJordan Rupprecht
999451b44SJordan Rupprechtclass CppBitfieldsTestCase(TestBase):
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
1299451b44SJordan Rupprecht
13*974c2f5eSRaphael Isemann    @no_debug_info_test
14*974c2f5eSRaphael Isemann    def test_bitfields(self):
1599451b44SJordan Rupprecht        self.build()
16*974c2f5eSRaphael Isemann        lldbutil.run_to_source_breakpoint(self, '// break here',
1799451b44SJordan Rupprecht            lldb.SBFileSpec("main.cpp", False))
1899451b44SJordan Rupprecht
19*974c2f5eSRaphael Isemann        # Accessing LargeBitsA.
20*974c2f5eSRaphael Isemann        self.expect_expr("lba", result_children=[
21*974c2f5eSRaphael Isemann            ValueCheck(name="", type="int:32"),
22*974c2f5eSRaphael Isemann            ValueCheck(name="a", type="unsigned int:20", value="2")
23*974c2f5eSRaphael Isemann        ])
24*974c2f5eSRaphael Isemann        self.expect_expr("lba.a", result_type="unsigned int", result_value="2")
2599451b44SJordan Rupprecht
2699451b44SJordan Rupprecht
27*974c2f5eSRaphael Isemann        # Accessing LargeBitsB.
28*974c2f5eSRaphael Isemann        self.expect_expr("lbb", result_children=[
29*974c2f5eSRaphael Isemann            ValueCheck(name="a", type="unsigned int:1", value="1"),
30*974c2f5eSRaphael Isemann            ValueCheck(name="", type="int:31"),
31*974c2f5eSRaphael Isemann            ValueCheck(name="b", type="unsigned int:20", value="3")
32*974c2f5eSRaphael Isemann        ])
33*974c2f5eSRaphael Isemann        self.expect_expr("lbb.b", result_type="unsigned int", result_value="3")
3499451b44SJordan Rupprecht
35bae9aedbSshafik
36*974c2f5eSRaphael Isemann        # Accessing LargeBitsC.
37*974c2f5eSRaphael Isemann        self.expect_expr("lbc", result_children=[
38*974c2f5eSRaphael Isemann            ValueCheck(name="", type="int:22"),
39*974c2f5eSRaphael Isemann            ValueCheck(name="a", type="unsigned int:1", value="1"),
40*974c2f5eSRaphael Isemann            ValueCheck(name="b", type="unsigned int:1", value="0"),
41*974c2f5eSRaphael Isemann            ValueCheck(name="c", type="unsigned int:5", value="4"),
42*974c2f5eSRaphael Isemann            ValueCheck(name="d", type="unsigned int:1", value="1"),
43*974c2f5eSRaphael Isemann            ValueCheck(name="", type="int:2"),
44*974c2f5eSRaphael Isemann            ValueCheck(name="e", type="unsigned int:20", value="20"),
45*974c2f5eSRaphael Isemann        ])
46*974c2f5eSRaphael Isemann        self.expect_expr("lbc.c", result_type="unsigned int", result_value="4")
47bae9aedbSshafik
48*974c2f5eSRaphael Isemann
49*974c2f5eSRaphael Isemann        # Accessing LargeBitsD.
50*974c2f5eSRaphael Isemann        self.expect_expr("lbd", result_children=[
51*974c2f5eSRaphael Isemann            ValueCheck(name="arr", type="char[3]", summary='"ab"'),
52*974c2f5eSRaphael Isemann            ValueCheck(name="", type="int:32"),
53*974c2f5eSRaphael Isemann            ValueCheck(name="a", type="unsigned int:20", value="5")
54*974c2f5eSRaphael Isemann        ])
55*974c2f5eSRaphael Isemann        self.expect_expr("lbd.a", result_type="unsigned int", result_value="5")
56*974c2f5eSRaphael Isemann
57*974c2f5eSRaphael Isemann
58*974c2f5eSRaphael Isemann        # Test BitfieldsInStructInUnion.
59*974c2f5eSRaphael Isemann        # FIXME: This needs some more explanation for what it's actually testing.
60*974c2f5eSRaphael Isemann        nested_struct_children = [
61*974c2f5eSRaphael Isemann            ValueCheck(name="", type="int:22"),
62*974c2f5eSRaphael Isemann            ValueCheck(name="a", type="uint64_t:1", value="1"),
63*974c2f5eSRaphael Isemann            ValueCheck(name="b", type="uint64_t:1", value="0"),
64*974c2f5eSRaphael Isemann            ValueCheck(name="c", type="uint64_t:1", value="1"),
65*974c2f5eSRaphael Isemann            ValueCheck(name="d", type="uint64_t:1", value="0"),
66*974c2f5eSRaphael Isemann            ValueCheck(name="e", type="uint64_t:1", value="1"),
67*974c2f5eSRaphael Isemann            ValueCheck(name="f", type="uint64_t:1", value="0"),
68*974c2f5eSRaphael Isemann            ValueCheck(name="g", type="uint64_t:1", value="1"),
69*974c2f5eSRaphael Isemann            ValueCheck(name="h", type="uint64_t:1", value="0"),
70*974c2f5eSRaphael Isemann            ValueCheck(name="i", type="uint64_t:1", value="1"),
71*974c2f5eSRaphael Isemann            ValueCheck(name="j", type="uint64_t:1", value="0"),
72*974c2f5eSRaphael Isemann            ValueCheck(name="k", type="uint64_t:1", value="1")
73*974c2f5eSRaphael Isemann        ]
74*974c2f5eSRaphael Isemann        self.expect_expr("bitfields_in_struct_in_union",
75*974c2f5eSRaphael Isemann            result_type="BitfieldsInStructInUnion",
76*974c2f5eSRaphael Isemann            result_children=[ValueCheck(name="", children=[
77*974c2f5eSRaphael Isemann              ValueCheck(name="f", children=nested_struct_children)
78*974c2f5eSRaphael Isemann            ])]
79*974c2f5eSRaphael Isemann        )
80*974c2f5eSRaphael Isemann        self.expect_expr("bitfields_in_struct_in_union.f.a",
81*974c2f5eSRaphael Isemann            result_type="uint64_t", result_value="1")
82*974c2f5eSRaphael Isemann
83*974c2f5eSRaphael Isemann
84*974c2f5eSRaphael Isemann        # Unions with bitfields.
85*974c2f5eSRaphael Isemann        self.expect_expr("uwbf", result_type="UnionWithBitfields", result_children=[
86*974c2f5eSRaphael Isemann            ValueCheck(name="a", value="255"),
87*974c2f5eSRaphael Isemann            ValueCheck(name="b", value="65535"),
88*974c2f5eSRaphael Isemann            ValueCheck(name="c", value="4294967295"),
89*974c2f5eSRaphael Isemann            ValueCheck(name="x", value="4294967295")
90*974c2f5eSRaphael Isemann        ])
91*974c2f5eSRaphael Isemann        self.expect_expr("uwubf", result_type="UnionWithUnnamedBitfield",
92*974c2f5eSRaphael Isemann            result_children=[
93*974c2f5eSRaphael Isemann                ValueCheck(name="a", value="16777215"),
94*974c2f5eSRaphael Isemann                ValueCheck(name="x", value="4294967295")
95*974c2f5eSRaphael Isemann            ]
96*974c2f5eSRaphael Isemann        )
97*974c2f5eSRaphael Isemann
98*974c2f5eSRaphael Isemann        # Class with a base class and a bitfield.
99*974c2f5eSRaphael Isemann        self.expect_expr("derived", result_type="Derived", result_children=[
100*974c2f5eSRaphael Isemann            ValueCheck(name="Base", children=[
101*974c2f5eSRaphael Isemann              ValueCheck(name="b_a", value="2", type="uint32_t")
102*974c2f5eSRaphael Isemann            ]),
103*974c2f5eSRaphael Isemann            ValueCheck(name="d_a", value="1", type="uint32_t:1")
10499451b44SJordan Rupprecht        ])
10599451b44SJordan Rupprecht
10699451b44SJordan Rupprecht
107*974c2f5eSRaphael Isemann        # Struct with bool bitfields.
108*974c2f5eSRaphael Isemann        self.expect_expr("bb", result_type="", result_children=[
109*974c2f5eSRaphael Isemann            ValueCheck(name="a", value="true", type="bool:1"),
110*974c2f5eSRaphael Isemann            ValueCheck(name="b", value="false", type="bool:1"),
111*974c2f5eSRaphael Isemann            ValueCheck(name="c", value="true", type="bool:2"),
112*974c2f5eSRaphael Isemann            ValueCheck(name="d", value="true", type="bool:2")
1130bab7b26SAndy Yankovsky        ])
1140bab7b26SAndy Yankovsky
1150bab7b26SAndy Yankovsky        bb = self.frame().FindVariable('bb')
116*974c2f5eSRaphael Isemann        self.assertSuccess(bb.GetError())
1170bab7b26SAndy Yankovsky
1180bab7b26SAndy Yankovsky        bb_a = bb.GetChildAtIndex(0)
119*974c2f5eSRaphael Isemann        self.assertSuccess(bb_a.GetError())
1200bab7b26SAndy Yankovsky        self.assertEqual(bb_a.GetValueAsUnsigned(), 1)
1210bab7b26SAndy Yankovsky        self.assertEqual(bb_a.GetValueAsSigned(), 1)
1220bab7b26SAndy Yankovsky
1230bab7b26SAndy Yankovsky        bb_b = bb.GetChildAtIndex(1)
124*974c2f5eSRaphael Isemann        self.assertSuccess(bb_b.GetError())
1250bab7b26SAndy Yankovsky        self.assertEqual(bb_b.GetValueAsUnsigned(), 0)
1260bab7b26SAndy Yankovsky        self.assertEqual(bb_b.GetValueAsSigned(), 0)
1270bab7b26SAndy Yankovsky
1280bab7b26SAndy Yankovsky        bb_c = bb.GetChildAtIndex(2)
129*974c2f5eSRaphael Isemann        self.assertSuccess(bb_c.GetError())
1300bab7b26SAndy Yankovsky        self.assertEqual(bb_c.GetValueAsUnsigned(), 1)
1310bab7b26SAndy Yankovsky        self.assertEqual(bb_c.GetValueAsSigned(), 1)
1320bab7b26SAndy Yankovsky
1330bab7b26SAndy Yankovsky        bb_d = bb.GetChildAtIndex(3)
134*974c2f5eSRaphael Isemann        self.assertSuccess(bb_d.GetError())
1350bab7b26SAndy Yankovsky        self.assertEqual(bb_d.GetValueAsUnsigned(), 1)
1360bab7b26SAndy Yankovsky        self.assertEqual(bb_d.GetValueAsSigned(), 1)
137*974c2f5eSRaphael Isemann
138*974c2f5eSRaphael Isemann        # Test a class with a base class that has a vtable ptr. The derived
139*974c2f5eSRaphael Isemann        # class has bitfields.
140*974c2f5eSRaphael Isemann        base_with_vtable_children = [
141*974c2f5eSRaphael Isemann            ValueCheck(name="a", type="unsigned int:4", value="5"),
142*974c2f5eSRaphael Isemann            ValueCheck(name="b", type="unsigned int:4", value="0"),
143*974c2f5eSRaphael Isemann            ValueCheck(name="c", type="unsigned int:4", value="5")
144*974c2f5eSRaphael Isemann        ]
145*974c2f5eSRaphael Isemann        self.expect_expr("base_with_vtable", result_children=base_with_vtable_children)
146*974c2f5eSRaphael Isemann        self.expect_var_path("base_with_vtable", children=base_with_vtable_children)
147*974c2f5eSRaphael Isemann
148*974c2f5eSRaphael Isemann    # FIXME: These all crash due the vtable ptr.
149*974c2f5eSRaphael Isemann    @skipIf
150*974c2f5eSRaphael Isemann    @no_debug_info_test
151*974c2f5eSRaphael Isemann    def test_bitfield_behind_vtable_ptr(self):
152*974c2f5eSRaphael Isemann        self.build()
153*974c2f5eSRaphael Isemann        lldbutil.run_to_source_breakpoint(self, '// break here',
154*974c2f5eSRaphael Isemann            lldb.SBFileSpec("main.cpp", False))
155*974c2f5eSRaphael Isemann
156*974c2f5eSRaphael Isemann        # Test a class with a vtable ptr and bitfields.
157*974c2f5eSRaphael Isemann        with_vtable_children = [
158*974c2f5eSRaphael Isemann            ValueCheck(name="a", type="unsigned int:4", value="5"),
159*974c2f5eSRaphael Isemann            ValueCheck(name="b", type="unsigned int:4", value="0"),
160*974c2f5eSRaphael Isemann            ValueCheck(name="c", type="unsigned int:4", value="5")
161*974c2f5eSRaphael Isemann        ]
162*974c2f5eSRaphael Isemann        self.expect_expr("with_vtable", result_children=with_vtable_children)
163*974c2f5eSRaphael Isemann        self.expect_var_path("with_vtable", children=with_vtable_children)
164*974c2f5eSRaphael Isemann
165*974c2f5eSRaphael Isemann        # Test a class with a vtable ptr and unnamed bitfield directly after.
166*974c2f5eSRaphael Isemann        with_vtable_and_unnamed_children = [
167*974c2f5eSRaphael Isemann            ValueCheck(name="", type="unsigned int:4", value="0"),
168*974c2f5eSRaphael Isemann            ValueCheck(name="b", type="unsigned int:4", value="0"),
169*974c2f5eSRaphael Isemann            ValueCheck(name="c", type="unsigned int:4", value="5")
170*974c2f5eSRaphael Isemann        ]
171*974c2f5eSRaphael Isemann        self.expect_expr("with_vtable_and_unnamed",
172*974c2f5eSRaphael Isemann                         result_children=with_vtable_and_unnamed_children)
173*974c2f5eSRaphael Isemann        self.expect_var_path("with_vtable_and_unnamed",
174*974c2f5eSRaphael Isemann                         children=with_vtable_and_unnamed_children)
175