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