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