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
11974c2f5eSRaphael Isemann    @no_debug_info_test
12974c2f5eSRaphael Isemann    def test_bitfields(self):
1399451b44SJordan Rupprecht        self.build()
14974c2f5eSRaphael Isemann        lldbutil.run_to_source_breakpoint(self, '// break here',
1599451b44SJordan Rupprecht            lldb.SBFileSpec("main.cpp", False))
1699451b44SJordan Rupprecht
17974c2f5eSRaphael Isemann        # Accessing LargeBitsA.
18974c2f5eSRaphael Isemann        self.expect_expr("lba", result_children=[
19974c2f5eSRaphael Isemann            ValueCheck(name="", type="int:32"),
20974c2f5eSRaphael Isemann            ValueCheck(name="a", type="unsigned int:20", value="2")
21974c2f5eSRaphael Isemann        ])
22974c2f5eSRaphael Isemann        self.expect_expr("lba.a", result_type="unsigned int", result_value="2")
2399451b44SJordan Rupprecht
2499451b44SJordan Rupprecht
25974c2f5eSRaphael Isemann        # Accessing LargeBitsB.
26974c2f5eSRaphael Isemann        self.expect_expr("lbb", result_children=[
27974c2f5eSRaphael Isemann            ValueCheck(name="a", type="unsigned int:1", value="1"),
28974c2f5eSRaphael Isemann            ValueCheck(name="", type="int:31"),
29974c2f5eSRaphael Isemann            ValueCheck(name="b", type="unsigned int:20", value="3")
30974c2f5eSRaphael Isemann        ])
31974c2f5eSRaphael Isemann        self.expect_expr("lbb.b", result_type="unsigned int", result_value="3")
3299451b44SJordan Rupprecht
33bae9aedbSshafik
34974c2f5eSRaphael Isemann        # Accessing LargeBitsC.
35974c2f5eSRaphael Isemann        self.expect_expr("lbc", result_children=[
36974c2f5eSRaphael Isemann            ValueCheck(name="", type="int:22"),
37974c2f5eSRaphael Isemann            ValueCheck(name="a", type="unsigned int:1", value="1"),
38974c2f5eSRaphael Isemann            ValueCheck(name="b", type="unsigned int:1", value="0"),
39974c2f5eSRaphael Isemann            ValueCheck(name="c", type="unsigned int:5", value="4"),
40974c2f5eSRaphael Isemann            ValueCheck(name="d", type="unsigned int:1", value="1"),
41974c2f5eSRaphael Isemann            ValueCheck(name="", type="int:2"),
42974c2f5eSRaphael Isemann            ValueCheck(name="e", type="unsigned int:20", value="20"),
43974c2f5eSRaphael Isemann        ])
44974c2f5eSRaphael Isemann        self.expect_expr("lbc.c", result_type="unsigned int", result_value="4")
45bae9aedbSshafik
46974c2f5eSRaphael Isemann
47974c2f5eSRaphael Isemann        # Accessing LargeBitsD.
48974c2f5eSRaphael Isemann        self.expect_expr("lbd", result_children=[
49974c2f5eSRaphael Isemann            ValueCheck(name="arr", type="char[3]", summary='"ab"'),
50974c2f5eSRaphael Isemann            ValueCheck(name="", type="int:32"),
51974c2f5eSRaphael Isemann            ValueCheck(name="a", type="unsigned int:20", value="5")
52974c2f5eSRaphael Isemann        ])
53974c2f5eSRaphael Isemann        self.expect_expr("lbd.a", result_type="unsigned int", result_value="5")
54974c2f5eSRaphael Isemann
55974c2f5eSRaphael Isemann
56974c2f5eSRaphael Isemann        # Test BitfieldsInStructInUnion.
57974c2f5eSRaphael Isemann        # FIXME: This needs some more explanation for what it's actually testing.
58974c2f5eSRaphael Isemann        nested_struct_children = [
59974c2f5eSRaphael Isemann            ValueCheck(name="", type="int:22"),
60974c2f5eSRaphael Isemann            ValueCheck(name="a", type="uint64_t:1", value="1"),
61974c2f5eSRaphael Isemann            ValueCheck(name="b", type="uint64_t:1", value="0"),
62974c2f5eSRaphael Isemann            ValueCheck(name="c", type="uint64_t:1", value="1"),
63974c2f5eSRaphael Isemann            ValueCheck(name="d", type="uint64_t:1", value="0"),
64974c2f5eSRaphael Isemann            ValueCheck(name="e", type="uint64_t:1", value="1"),
65974c2f5eSRaphael Isemann            ValueCheck(name="f", type="uint64_t:1", value="0"),
66974c2f5eSRaphael Isemann            ValueCheck(name="g", type="uint64_t:1", value="1"),
67974c2f5eSRaphael Isemann            ValueCheck(name="h", type="uint64_t:1", value="0"),
68974c2f5eSRaphael Isemann            ValueCheck(name="i", type="uint64_t:1", value="1"),
69974c2f5eSRaphael Isemann            ValueCheck(name="j", type="uint64_t:1", value="0"),
70974c2f5eSRaphael Isemann            ValueCheck(name="k", type="uint64_t:1", value="1")
71974c2f5eSRaphael Isemann        ]
72974c2f5eSRaphael Isemann        self.expect_expr("bitfields_in_struct_in_union",
73974c2f5eSRaphael Isemann            result_type="BitfieldsInStructInUnion",
74974c2f5eSRaphael Isemann            result_children=[ValueCheck(name="", children=[
75974c2f5eSRaphael Isemann              ValueCheck(name="f", children=nested_struct_children)
76974c2f5eSRaphael Isemann            ])]
77974c2f5eSRaphael Isemann        )
78974c2f5eSRaphael Isemann        self.expect_expr("bitfields_in_struct_in_union.f.a",
79974c2f5eSRaphael Isemann            result_type="uint64_t", result_value="1")
80974c2f5eSRaphael Isemann
81974c2f5eSRaphael Isemann
82974c2f5eSRaphael Isemann        # Unions with bitfields.
83974c2f5eSRaphael Isemann        self.expect_expr("uwbf", result_type="UnionWithBitfields", result_children=[
84974c2f5eSRaphael Isemann            ValueCheck(name="a", value="255"),
85974c2f5eSRaphael Isemann            ValueCheck(name="b", value="65535"),
86974c2f5eSRaphael Isemann            ValueCheck(name="c", value="4294967295"),
87974c2f5eSRaphael Isemann            ValueCheck(name="x", value="4294967295")
88974c2f5eSRaphael Isemann        ])
89974c2f5eSRaphael Isemann        self.expect_expr("uwubf", result_type="UnionWithUnnamedBitfield",
90974c2f5eSRaphael Isemann            result_children=[
91974c2f5eSRaphael Isemann                ValueCheck(name="a", value="16777215"),
92974c2f5eSRaphael Isemann                ValueCheck(name="x", value="4294967295")
93974c2f5eSRaphael Isemann            ]
94974c2f5eSRaphael Isemann        )
95974c2f5eSRaphael Isemann
96974c2f5eSRaphael Isemann        # Class with a base class and a bitfield.
97974c2f5eSRaphael Isemann        self.expect_expr("derived", result_type="Derived", result_children=[
98974c2f5eSRaphael Isemann            ValueCheck(name="Base", children=[
99974c2f5eSRaphael Isemann              ValueCheck(name="b_a", value="2", type="uint32_t")
100974c2f5eSRaphael Isemann            ]),
101974c2f5eSRaphael Isemann            ValueCheck(name="d_a", value="1", type="uint32_t:1")
10299451b44SJordan Rupprecht        ])
10399451b44SJordan Rupprecht
10499451b44SJordan Rupprecht
105974c2f5eSRaphael Isemann        # Struct with bool bitfields.
106974c2f5eSRaphael Isemann        self.expect_expr("bb", result_type="", result_children=[
107974c2f5eSRaphael Isemann            ValueCheck(name="a", value="true", type="bool:1"),
108974c2f5eSRaphael Isemann            ValueCheck(name="b", value="false", type="bool:1"),
109974c2f5eSRaphael Isemann            ValueCheck(name="c", value="true", type="bool:2"),
110974c2f5eSRaphael Isemann            ValueCheck(name="d", value="true", type="bool:2")
1110bab7b26SAndy Yankovsky        ])
1120bab7b26SAndy Yankovsky
1130bab7b26SAndy Yankovsky        bb = self.frame().FindVariable('bb')
114974c2f5eSRaphael Isemann        self.assertSuccess(bb.GetError())
1150bab7b26SAndy Yankovsky
1160bab7b26SAndy Yankovsky        bb_a = bb.GetChildAtIndex(0)
117974c2f5eSRaphael Isemann        self.assertSuccess(bb_a.GetError())
1180bab7b26SAndy Yankovsky        self.assertEqual(bb_a.GetValueAsUnsigned(), 1)
1190bab7b26SAndy Yankovsky        self.assertEqual(bb_a.GetValueAsSigned(), 1)
1200bab7b26SAndy Yankovsky
1210bab7b26SAndy Yankovsky        bb_b = bb.GetChildAtIndex(1)
122974c2f5eSRaphael Isemann        self.assertSuccess(bb_b.GetError())
1230bab7b26SAndy Yankovsky        self.assertEqual(bb_b.GetValueAsUnsigned(), 0)
1240bab7b26SAndy Yankovsky        self.assertEqual(bb_b.GetValueAsSigned(), 0)
1250bab7b26SAndy Yankovsky
1260bab7b26SAndy Yankovsky        bb_c = bb.GetChildAtIndex(2)
127974c2f5eSRaphael Isemann        self.assertSuccess(bb_c.GetError())
1280bab7b26SAndy Yankovsky        self.assertEqual(bb_c.GetValueAsUnsigned(), 1)
1290bab7b26SAndy Yankovsky        self.assertEqual(bb_c.GetValueAsSigned(), 1)
1300bab7b26SAndy Yankovsky
1310bab7b26SAndy Yankovsky        bb_d = bb.GetChildAtIndex(3)
132974c2f5eSRaphael Isemann        self.assertSuccess(bb_d.GetError())
1330bab7b26SAndy Yankovsky        self.assertEqual(bb_d.GetValueAsUnsigned(), 1)
1340bab7b26SAndy Yankovsky        self.assertEqual(bb_d.GetValueAsSigned(), 1)
135974c2f5eSRaphael Isemann
136974c2f5eSRaphael Isemann        # Test a class with a base class that has a vtable ptr. The derived
137974c2f5eSRaphael Isemann        # class has bitfields.
138974c2f5eSRaphael Isemann        base_with_vtable_children = [
139974c2f5eSRaphael Isemann            ValueCheck(name="a", type="unsigned int:4", value="5"),
140974c2f5eSRaphael Isemann            ValueCheck(name="b", type="unsigned int:4", value="0"),
141974c2f5eSRaphael Isemann            ValueCheck(name="c", type="unsigned int:4", value="5")
142974c2f5eSRaphael Isemann        ]
143974c2f5eSRaphael Isemann        self.expect_expr("base_with_vtable", result_children=base_with_vtable_children)
144974c2f5eSRaphael Isemann        self.expect_var_path("base_with_vtable", children=base_with_vtable_children)
145974c2f5eSRaphael Isemann
146974c2f5eSRaphael Isemann    @no_debug_info_test
147974c2f5eSRaphael Isemann    def test_bitfield_behind_vtable_ptr(self):
148974c2f5eSRaphael Isemann        self.build()
149974c2f5eSRaphael Isemann        lldbutil.run_to_source_breakpoint(self, '// break here',
150974c2f5eSRaphael Isemann            lldb.SBFileSpec("main.cpp", False))
151974c2f5eSRaphael Isemann
152974c2f5eSRaphael Isemann        # Test a class with a vtable ptr and bitfields.
153974c2f5eSRaphael Isemann        with_vtable_children = [
154974c2f5eSRaphael Isemann            ValueCheck(name="a", type="unsigned int:4", value="5"),
155974c2f5eSRaphael Isemann            ValueCheck(name="b", type="unsigned int:4", value="0"),
156974c2f5eSRaphael Isemann            ValueCheck(name="c", type="unsigned int:4", value="5")
157974c2f5eSRaphael Isemann        ]
158974c2f5eSRaphael Isemann        self.expect_expr("with_vtable", result_children=with_vtable_children)
159974c2f5eSRaphael Isemann        self.expect_var_path("with_vtable", children=with_vtable_children)
160974c2f5eSRaphael Isemann
161974c2f5eSRaphael Isemann        # Test a class with a vtable ptr and unnamed bitfield directly after.
162974c2f5eSRaphael Isemann        with_vtable_and_unnamed_children = [
163*e2ede171SRaphael Isemann            ValueCheck(name="", type="int:4", value="0"),
164974c2f5eSRaphael Isemann            ValueCheck(name="b", type="unsigned int:4", value="0"),
165974c2f5eSRaphael Isemann            ValueCheck(name="c", type="unsigned int:4", value="5")
166974c2f5eSRaphael Isemann        ]
167974c2f5eSRaphael Isemann        self.expect_expr("with_vtable_and_unnamed",
168974c2f5eSRaphael Isemann                         result_children=with_vtable_and_unnamed_children)
169974c2f5eSRaphael Isemann        self.expect_var_path("with_vtable_and_unnamed",
170974c2f5eSRaphael Isemann                         children=with_vtable_and_unnamed_children)
171