xref: /llvm-project/lldb/test/API/lang/cpp/bitfields/TestCppBitfields.py (revision 31e55d461693df035049e09cbeeb8886ca2cb6d3)
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):
10974c2f5eSRaphael Isemann    @no_debug_info_test
11*31e55d46SDmitry Vasilyev    @skipIf(oslist=["windows"], bugnumber="github.com/llvm/llvm-project/issues/105019")
12974c2f5eSRaphael Isemann    def test_bitfields(self):
1399451b44SJordan Rupprecht        self.build()
142238dcc3SJonas Devlieghere        lldbutil.run_to_source_breakpoint(
152238dcc3SJonas Devlieghere            self, "// break here", lldb.SBFileSpec("main.cpp", False)
162238dcc3SJonas Devlieghere        )
1799451b44SJordan Rupprecht
18974c2f5eSRaphael Isemann        # Accessing LargeBitsA.
192238dcc3SJonas Devlieghere        self.expect_expr(
202238dcc3SJonas Devlieghere            "lba",
212238dcc3SJonas Devlieghere            result_children=[
22974c2f5eSRaphael Isemann                ValueCheck(name="", type="int:32"),
232238dcc3SJonas Devlieghere                ValueCheck(name="a", type="unsigned int:20", value="2"),
242238dcc3SJonas Devlieghere            ],
252238dcc3SJonas Devlieghere        )
26974c2f5eSRaphael Isemann        self.expect_expr("lba.a", result_type="unsigned int", result_value="2")
2799451b44SJordan Rupprecht
28974c2f5eSRaphael Isemann        # Accessing LargeBitsB.
292238dcc3SJonas Devlieghere        self.expect_expr(
302238dcc3SJonas Devlieghere            "lbb",
312238dcc3SJonas Devlieghere            result_children=[
32974c2f5eSRaphael Isemann                ValueCheck(name="a", type="unsigned int:1", value="1"),
33974c2f5eSRaphael Isemann                ValueCheck(name="", type="int:31"),
342238dcc3SJonas Devlieghere                ValueCheck(name="b", type="unsigned int:20", value="3"),
352238dcc3SJonas Devlieghere            ],
362238dcc3SJonas Devlieghere        )
37974c2f5eSRaphael Isemann        self.expect_expr("lbb.b", result_type="unsigned int", result_value="3")
3899451b44SJordan Rupprecht
39974c2f5eSRaphael Isemann        # Accessing LargeBitsC.
402238dcc3SJonas Devlieghere        self.expect_expr(
412238dcc3SJonas Devlieghere            "lbc",
422238dcc3SJonas Devlieghere            result_children=[
43974c2f5eSRaphael Isemann                ValueCheck(name="", type="int:22"),
44974c2f5eSRaphael Isemann                ValueCheck(name="a", type="unsigned int:1", value="1"),
45974c2f5eSRaphael Isemann                ValueCheck(name="b", type="unsigned int:1", value="0"),
46974c2f5eSRaphael Isemann                ValueCheck(name="c", type="unsigned int:5", value="4"),
47974c2f5eSRaphael Isemann                ValueCheck(name="d", type="unsigned int:1", value="1"),
48974c2f5eSRaphael Isemann                ValueCheck(name="", type="int:2"),
49974c2f5eSRaphael Isemann                ValueCheck(name="e", type="unsigned int:20", value="20"),
502238dcc3SJonas Devlieghere            ],
512238dcc3SJonas Devlieghere        )
52974c2f5eSRaphael Isemann        self.expect_expr("lbc.c", result_type="unsigned int", result_value="4")
53bae9aedbSshafik
54974c2f5eSRaphael Isemann        # Accessing LargeBitsD.
552238dcc3SJonas Devlieghere        self.expect_expr(
562238dcc3SJonas Devlieghere            "lbd",
572238dcc3SJonas Devlieghere            result_children=[
58974c2f5eSRaphael Isemann                ValueCheck(name="arr", type="char[3]", summary='"ab"'),
59974c2f5eSRaphael Isemann                ValueCheck(name="", type="int:32"),
602238dcc3SJonas Devlieghere                ValueCheck(name="a", type="unsigned int:20", value="5"),
612238dcc3SJonas Devlieghere            ],
622238dcc3SJonas Devlieghere        )
63974c2f5eSRaphael Isemann        self.expect_expr("lbd.a", result_type="unsigned int", result_value="5")
64974c2f5eSRaphael Isemann
65974c2f5eSRaphael Isemann        # Test BitfieldsInStructInUnion.
66974c2f5eSRaphael Isemann        # FIXME: This needs some more explanation for what it's actually testing.
67974c2f5eSRaphael Isemann        nested_struct_children = [
68974c2f5eSRaphael Isemann            ValueCheck(name="", type="int:22"),
69974c2f5eSRaphael Isemann            ValueCheck(name="a", type="uint64_t:1", value="1"),
70974c2f5eSRaphael Isemann            ValueCheck(name="b", type="uint64_t:1", value="0"),
71974c2f5eSRaphael Isemann            ValueCheck(name="c", type="uint64_t:1", value="1"),
72974c2f5eSRaphael Isemann            ValueCheck(name="d", type="uint64_t:1", value="0"),
73974c2f5eSRaphael Isemann            ValueCheck(name="e", type="uint64_t:1", value="1"),
74974c2f5eSRaphael Isemann            ValueCheck(name="f", type="uint64_t:1", value="0"),
75974c2f5eSRaphael Isemann            ValueCheck(name="g", type="uint64_t:1", value="1"),
76974c2f5eSRaphael Isemann            ValueCheck(name="h", type="uint64_t:1", value="0"),
77974c2f5eSRaphael Isemann            ValueCheck(name="i", type="uint64_t:1", value="1"),
78974c2f5eSRaphael Isemann            ValueCheck(name="j", type="uint64_t:1", value="0"),
792238dcc3SJonas Devlieghere            ValueCheck(name="k", type="uint64_t:1", value="1"),
80974c2f5eSRaphael Isemann        ]
812238dcc3SJonas Devlieghere        self.expect_expr(
822238dcc3SJonas Devlieghere            "bitfields_in_struct_in_union",
83974c2f5eSRaphael Isemann            result_type="BitfieldsInStructInUnion",
842238dcc3SJonas Devlieghere            result_children=[
852238dcc3SJonas Devlieghere                ValueCheck(
862238dcc3SJonas Devlieghere                    name="",
872238dcc3SJonas Devlieghere                    children=[ValueCheck(name="f", children=nested_struct_children)],
88974c2f5eSRaphael Isemann                )
892238dcc3SJonas Devlieghere            ],
902238dcc3SJonas Devlieghere        )
912238dcc3SJonas Devlieghere        self.expect_expr(
922238dcc3SJonas Devlieghere            "bitfields_in_struct_in_union.f.a", result_type="uint64_t", result_value="1"
932238dcc3SJonas Devlieghere        )
94974c2f5eSRaphael Isemann
95974c2f5eSRaphael Isemann        # Unions with bitfields.
962238dcc3SJonas Devlieghere        self.expect_expr(
972238dcc3SJonas Devlieghere            "uwbf",
982238dcc3SJonas Devlieghere            result_type="UnionWithBitfields",
992238dcc3SJonas Devlieghere            result_children=[
100974c2f5eSRaphael Isemann                ValueCheck(name="a", value="255"),
101974c2f5eSRaphael Isemann                ValueCheck(name="b", value="65535"),
102974c2f5eSRaphael Isemann                ValueCheck(name="c", value="4294967295"),
1032238dcc3SJonas Devlieghere                ValueCheck(name="x", value="4294967295"),
1042238dcc3SJonas Devlieghere            ],
1052238dcc3SJonas Devlieghere        )
1062238dcc3SJonas Devlieghere        self.expect_expr(
1072238dcc3SJonas Devlieghere            "uwubf",
1082238dcc3SJonas Devlieghere            result_type="UnionWithUnnamedBitfield",
109974c2f5eSRaphael Isemann            result_children=[
110974c2f5eSRaphael Isemann                ValueCheck(name="a", value="16777215"),
1112238dcc3SJonas Devlieghere                ValueCheck(name="x", value="4294967295"),
1122238dcc3SJonas Devlieghere            ],
113974c2f5eSRaphael Isemann        )
114974c2f5eSRaphael Isemann
115974c2f5eSRaphael Isemann        # Class with a base class and a bitfield.
1162238dcc3SJonas Devlieghere        self.expect_expr(
1172238dcc3SJonas Devlieghere            "derived",
1182238dcc3SJonas Devlieghere            result_type="Derived",
1192238dcc3SJonas Devlieghere            result_children=[
1202238dcc3SJonas Devlieghere                ValueCheck(
1212238dcc3SJonas Devlieghere                    name="Base",
1222238dcc3SJonas Devlieghere                    children=[ValueCheck(name="b_a", value="2", type="uint32_t")],
1232238dcc3SJonas Devlieghere                ),
1242238dcc3SJonas Devlieghere                ValueCheck(name="d_a", value="1", type="uint32_t:1"),
1252238dcc3SJonas Devlieghere            ],
1262238dcc3SJonas Devlieghere        )
12799451b44SJordan Rupprecht
128974c2f5eSRaphael Isemann        # Struct with bool bitfields.
1292238dcc3SJonas Devlieghere        self.expect_expr(
1302238dcc3SJonas Devlieghere            "bb",
1312238dcc3SJonas Devlieghere            result_type="",
1322238dcc3SJonas Devlieghere            result_children=[
133974c2f5eSRaphael Isemann                ValueCheck(name="a", value="true", type="bool:1"),
134974c2f5eSRaphael Isemann                ValueCheck(name="b", value="false", type="bool:1"),
135974c2f5eSRaphael Isemann                ValueCheck(name="c", value="true", type="bool:2"),
1362238dcc3SJonas Devlieghere                ValueCheck(name="d", value="true", type="bool:2"),
1372238dcc3SJonas Devlieghere            ],
1382238dcc3SJonas Devlieghere        )
1390bab7b26SAndy Yankovsky
1402238dcc3SJonas Devlieghere        bb = self.frame().FindVariable("bb")
141974c2f5eSRaphael Isemann        self.assertSuccess(bb.GetError())
1420bab7b26SAndy Yankovsky
1430bab7b26SAndy Yankovsky        bb_a = bb.GetChildAtIndex(0)
144974c2f5eSRaphael Isemann        self.assertSuccess(bb_a.GetError())
1450bab7b26SAndy Yankovsky        self.assertEqual(bb_a.GetValueAsUnsigned(), 1)
1460bab7b26SAndy Yankovsky        self.assertEqual(bb_a.GetValueAsSigned(), 1)
1470bab7b26SAndy Yankovsky
1480bab7b26SAndy Yankovsky        bb_b = bb.GetChildAtIndex(1)
149974c2f5eSRaphael Isemann        self.assertSuccess(bb_b.GetError())
1500bab7b26SAndy Yankovsky        self.assertEqual(bb_b.GetValueAsUnsigned(), 0)
1510bab7b26SAndy Yankovsky        self.assertEqual(bb_b.GetValueAsSigned(), 0)
1520bab7b26SAndy Yankovsky
1530bab7b26SAndy Yankovsky        bb_c = bb.GetChildAtIndex(2)
154974c2f5eSRaphael Isemann        self.assertSuccess(bb_c.GetError())
1550bab7b26SAndy Yankovsky        self.assertEqual(bb_c.GetValueAsUnsigned(), 1)
1560bab7b26SAndy Yankovsky        self.assertEqual(bb_c.GetValueAsSigned(), 1)
1570bab7b26SAndy Yankovsky
1580bab7b26SAndy Yankovsky        bb_d = bb.GetChildAtIndex(3)
159974c2f5eSRaphael Isemann        self.assertSuccess(bb_d.GetError())
1600bab7b26SAndy Yankovsky        self.assertEqual(bb_d.GetValueAsUnsigned(), 1)
1610bab7b26SAndy Yankovsky        self.assertEqual(bb_d.GetValueAsSigned(), 1)
162974c2f5eSRaphael Isemann
163974c2f5eSRaphael Isemann        # Test a class with a base class that has a vtable ptr. The derived
164974c2f5eSRaphael Isemann        # class has bitfields.
165974c2f5eSRaphael Isemann        base_with_vtable_children = [
166974c2f5eSRaphael Isemann            ValueCheck(name="a", type="unsigned int:4", value="5"),
167974c2f5eSRaphael Isemann            ValueCheck(name="b", type="unsigned int:4", value="0"),
1682238dcc3SJonas Devlieghere            ValueCheck(name="c", type="unsigned int:4", value="5"),
169974c2f5eSRaphael Isemann        ]
170974c2f5eSRaphael Isemann        self.expect_expr("base_with_vtable", result_children=base_with_vtable_children)
171974c2f5eSRaphael Isemann        self.expect_var_path("base_with_vtable", children=base_with_vtable_children)
172974c2f5eSRaphael Isemann
173974c2f5eSRaphael Isemann    @no_debug_info_test
174974c2f5eSRaphael Isemann    def test_bitfield_behind_vtable_ptr(self):
175974c2f5eSRaphael Isemann        self.build()
1762238dcc3SJonas Devlieghere        lldbutil.run_to_source_breakpoint(
1772238dcc3SJonas Devlieghere            self, "// break here", lldb.SBFileSpec("main.cpp", False)
1782238dcc3SJonas Devlieghere        )
179974c2f5eSRaphael Isemann
180974c2f5eSRaphael Isemann        # Test a class with a vtable ptr and bitfields.
181974c2f5eSRaphael Isemann        with_vtable_children = [
182974c2f5eSRaphael Isemann            ValueCheck(name="a", type="unsigned int:4", value="5"),
183974c2f5eSRaphael Isemann            ValueCheck(name="b", type="unsigned int:4", value="0"),
1842238dcc3SJonas Devlieghere            ValueCheck(name="c", type="unsigned int:4", value="5"),
185974c2f5eSRaphael Isemann        ]
186974c2f5eSRaphael Isemann        self.expect_expr("with_vtable", result_children=with_vtable_children)
187974c2f5eSRaphael Isemann        self.expect_var_path("with_vtable", children=with_vtable_children)
188974c2f5eSRaphael Isemann
189974c2f5eSRaphael Isemann        # Test a class with a vtable ptr and unnamed bitfield directly after.
190974c2f5eSRaphael Isemann        with_vtable_and_unnamed_children = [
191e2ede171SRaphael Isemann            ValueCheck(name="", type="int:4", value="0"),
192974c2f5eSRaphael Isemann            ValueCheck(name="b", type="unsigned int:4", value="0"),
1932238dcc3SJonas Devlieghere            ValueCheck(name="c", type="unsigned int:4", value="5"),
194974c2f5eSRaphael Isemann        ]
1952238dcc3SJonas Devlieghere        self.expect_expr(
1962238dcc3SJonas Devlieghere            "with_vtable_and_unnamed", result_children=with_vtable_and_unnamed_children
1972238dcc3SJonas Devlieghere        )
1982238dcc3SJonas Devlieghere        self.expect_var_path(
1992238dcc3SJonas Devlieghere            "with_vtable_and_unnamed", children=with_vtable_and_unnamed_children
2002238dcc3SJonas Devlieghere        )
2013c30f224SMichael Buch
2023c30f224SMichael Buch        derived_with_vtable_children = [
2032238dcc3SJonas Devlieghere            ValueCheck(
2042238dcc3SJonas Devlieghere                name="Base",
2052238dcc3SJonas Devlieghere                children=[ValueCheck(name="b_a", value="2", type="uint32_t")],
2062238dcc3SJonas Devlieghere            ),
2072238dcc3SJonas Devlieghere            ValueCheck(name="a", value="1", type="unsigned int:1"),
2083c30f224SMichael Buch        ]
2092238dcc3SJonas Devlieghere        self.expect_expr(
2102238dcc3SJonas Devlieghere            "derived_with_vtable", result_children=derived_with_vtable_children
2112238dcc3SJonas Devlieghere        )
2122238dcc3SJonas Devlieghere        self.expect_var_path(
2132238dcc3SJonas Devlieghere            "derived_with_vtable", children=derived_with_vtable_children
2142238dcc3SJonas Devlieghere        )
215