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 13974c2f5eSRaphael Isemann @no_debug_info_test 14974c2f5eSRaphael Isemann def test_bitfields(self): 1599451b44SJordan Rupprecht self.build() 16974c2f5eSRaphael Isemann lldbutil.run_to_source_breakpoint(self, '// break here', 1799451b44SJordan Rupprecht lldb.SBFileSpec("main.cpp", False)) 1899451b44SJordan Rupprecht 19974c2f5eSRaphael Isemann # Accessing LargeBitsA. 20974c2f5eSRaphael Isemann self.expect_expr("lba", result_children=[ 21974c2f5eSRaphael Isemann ValueCheck(name="", type="int:32"), 22974c2f5eSRaphael Isemann ValueCheck(name="a", type="unsigned int:20", value="2") 23974c2f5eSRaphael Isemann ]) 24974c2f5eSRaphael Isemann self.expect_expr("lba.a", result_type="unsigned int", result_value="2") 2599451b44SJordan Rupprecht 2699451b44SJordan Rupprecht 27974c2f5eSRaphael Isemann # Accessing LargeBitsB. 28974c2f5eSRaphael Isemann self.expect_expr("lbb", result_children=[ 29974c2f5eSRaphael Isemann ValueCheck(name="a", type="unsigned int:1", value="1"), 30974c2f5eSRaphael Isemann ValueCheck(name="", type="int:31"), 31974c2f5eSRaphael Isemann ValueCheck(name="b", type="unsigned int:20", value="3") 32974c2f5eSRaphael Isemann ]) 33974c2f5eSRaphael Isemann self.expect_expr("lbb.b", result_type="unsigned int", result_value="3") 3499451b44SJordan Rupprecht 35bae9aedbSshafik 36974c2f5eSRaphael Isemann # Accessing LargeBitsC. 37974c2f5eSRaphael Isemann self.expect_expr("lbc", result_children=[ 38974c2f5eSRaphael Isemann ValueCheck(name="", type="int:22"), 39974c2f5eSRaphael Isemann ValueCheck(name="a", type="unsigned int:1", value="1"), 40974c2f5eSRaphael Isemann ValueCheck(name="b", type="unsigned int:1", value="0"), 41974c2f5eSRaphael Isemann ValueCheck(name="c", type="unsigned int:5", value="4"), 42974c2f5eSRaphael Isemann ValueCheck(name="d", type="unsigned int:1", value="1"), 43974c2f5eSRaphael Isemann ValueCheck(name="", type="int:2"), 44974c2f5eSRaphael Isemann ValueCheck(name="e", type="unsigned int:20", value="20"), 45974c2f5eSRaphael Isemann ]) 46974c2f5eSRaphael Isemann self.expect_expr("lbc.c", result_type="unsigned int", result_value="4") 47bae9aedbSshafik 48974c2f5eSRaphael Isemann 49974c2f5eSRaphael Isemann # Accessing LargeBitsD. 50974c2f5eSRaphael Isemann self.expect_expr("lbd", result_children=[ 51974c2f5eSRaphael Isemann ValueCheck(name="arr", type="char[3]", summary='"ab"'), 52974c2f5eSRaphael Isemann ValueCheck(name="", type="int:32"), 53974c2f5eSRaphael Isemann ValueCheck(name="a", type="unsigned int:20", value="5") 54974c2f5eSRaphael Isemann ]) 55974c2f5eSRaphael Isemann self.expect_expr("lbd.a", result_type="unsigned int", result_value="5") 56974c2f5eSRaphael Isemann 57974c2f5eSRaphael Isemann 58974c2f5eSRaphael Isemann # Test BitfieldsInStructInUnion. 59974c2f5eSRaphael Isemann # FIXME: This needs some more explanation for what it's actually testing. 60974c2f5eSRaphael Isemann nested_struct_children = [ 61974c2f5eSRaphael Isemann ValueCheck(name="", type="int:22"), 62974c2f5eSRaphael Isemann ValueCheck(name="a", type="uint64_t:1", value="1"), 63974c2f5eSRaphael Isemann ValueCheck(name="b", type="uint64_t:1", value="0"), 64974c2f5eSRaphael Isemann ValueCheck(name="c", type="uint64_t:1", value="1"), 65974c2f5eSRaphael Isemann ValueCheck(name="d", type="uint64_t:1", value="0"), 66974c2f5eSRaphael Isemann ValueCheck(name="e", type="uint64_t:1", value="1"), 67974c2f5eSRaphael Isemann ValueCheck(name="f", type="uint64_t:1", value="0"), 68974c2f5eSRaphael Isemann ValueCheck(name="g", type="uint64_t:1", value="1"), 69974c2f5eSRaphael Isemann ValueCheck(name="h", type="uint64_t:1", value="0"), 70974c2f5eSRaphael Isemann ValueCheck(name="i", type="uint64_t:1", value="1"), 71974c2f5eSRaphael Isemann ValueCheck(name="j", type="uint64_t:1", value="0"), 72974c2f5eSRaphael Isemann ValueCheck(name="k", type="uint64_t:1", value="1") 73974c2f5eSRaphael Isemann ] 74974c2f5eSRaphael Isemann self.expect_expr("bitfields_in_struct_in_union", 75974c2f5eSRaphael Isemann result_type="BitfieldsInStructInUnion", 76974c2f5eSRaphael Isemann result_children=[ValueCheck(name="", children=[ 77974c2f5eSRaphael Isemann ValueCheck(name="f", children=nested_struct_children) 78974c2f5eSRaphael Isemann ])] 79974c2f5eSRaphael Isemann ) 80974c2f5eSRaphael Isemann self.expect_expr("bitfields_in_struct_in_union.f.a", 81974c2f5eSRaphael Isemann result_type="uint64_t", result_value="1") 82974c2f5eSRaphael Isemann 83974c2f5eSRaphael Isemann 84974c2f5eSRaphael Isemann # Unions with bitfields. 85974c2f5eSRaphael Isemann self.expect_expr("uwbf", result_type="UnionWithBitfields", result_children=[ 86974c2f5eSRaphael Isemann ValueCheck(name="a", value="255"), 87974c2f5eSRaphael Isemann ValueCheck(name="b", value="65535"), 88974c2f5eSRaphael Isemann ValueCheck(name="c", value="4294967295"), 89974c2f5eSRaphael Isemann ValueCheck(name="x", value="4294967295") 90974c2f5eSRaphael Isemann ]) 91974c2f5eSRaphael Isemann self.expect_expr("uwubf", result_type="UnionWithUnnamedBitfield", 92974c2f5eSRaphael Isemann result_children=[ 93974c2f5eSRaphael Isemann ValueCheck(name="a", value="16777215"), 94974c2f5eSRaphael Isemann ValueCheck(name="x", value="4294967295") 95974c2f5eSRaphael Isemann ] 96974c2f5eSRaphael Isemann ) 97974c2f5eSRaphael Isemann 98974c2f5eSRaphael Isemann # Class with a base class and a bitfield. 99974c2f5eSRaphael Isemann self.expect_expr("derived", result_type="Derived", result_children=[ 100974c2f5eSRaphael Isemann ValueCheck(name="Base", children=[ 101974c2f5eSRaphael Isemann ValueCheck(name="b_a", value="2", type="uint32_t") 102974c2f5eSRaphael Isemann ]), 103974c2f5eSRaphael Isemann ValueCheck(name="d_a", value="1", type="uint32_t:1") 10499451b44SJordan Rupprecht ]) 10599451b44SJordan Rupprecht 10699451b44SJordan Rupprecht 107974c2f5eSRaphael Isemann # Struct with bool bitfields. 108974c2f5eSRaphael Isemann self.expect_expr("bb", result_type="", result_children=[ 109974c2f5eSRaphael Isemann ValueCheck(name="a", value="true", type="bool:1"), 110974c2f5eSRaphael Isemann ValueCheck(name="b", value="false", type="bool:1"), 111974c2f5eSRaphael Isemann ValueCheck(name="c", value="true", type="bool:2"), 112974c2f5eSRaphael Isemann ValueCheck(name="d", value="true", type="bool:2") 1130bab7b26SAndy Yankovsky ]) 1140bab7b26SAndy Yankovsky 1150bab7b26SAndy Yankovsky bb = self.frame().FindVariable('bb') 116974c2f5eSRaphael Isemann self.assertSuccess(bb.GetError()) 1170bab7b26SAndy Yankovsky 1180bab7b26SAndy Yankovsky bb_a = bb.GetChildAtIndex(0) 119974c2f5eSRaphael 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) 124974c2f5eSRaphael 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) 129974c2f5eSRaphael 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) 134974c2f5eSRaphael Isemann self.assertSuccess(bb_d.GetError()) 1350bab7b26SAndy Yankovsky self.assertEqual(bb_d.GetValueAsUnsigned(), 1) 1360bab7b26SAndy Yankovsky self.assertEqual(bb_d.GetValueAsSigned(), 1) 137974c2f5eSRaphael Isemann 138974c2f5eSRaphael Isemann # Test a class with a base class that has a vtable ptr. The derived 139974c2f5eSRaphael Isemann # class has bitfields. 140974c2f5eSRaphael Isemann base_with_vtable_children = [ 141974c2f5eSRaphael Isemann ValueCheck(name="a", type="unsigned int:4", value="5"), 142974c2f5eSRaphael Isemann ValueCheck(name="b", type="unsigned int:4", value="0"), 143974c2f5eSRaphael Isemann ValueCheck(name="c", type="unsigned int:4", value="5") 144974c2f5eSRaphael Isemann ] 145974c2f5eSRaphael Isemann self.expect_expr("base_with_vtable", result_children=base_with_vtable_children) 146974c2f5eSRaphael Isemann self.expect_var_path("base_with_vtable", children=base_with_vtable_children) 147974c2f5eSRaphael Isemann 148974c2f5eSRaphael Isemann @no_debug_info_test 149974c2f5eSRaphael Isemann def test_bitfield_behind_vtable_ptr(self): 150974c2f5eSRaphael Isemann self.build() 151974c2f5eSRaphael Isemann lldbutil.run_to_source_breakpoint(self, '// break here', 152974c2f5eSRaphael Isemann lldb.SBFileSpec("main.cpp", False)) 153974c2f5eSRaphael Isemann 154974c2f5eSRaphael Isemann # Test a class with a vtable ptr and bitfields. 155974c2f5eSRaphael Isemann with_vtable_children = [ 156974c2f5eSRaphael Isemann ValueCheck(name="a", type="unsigned int:4", value="5"), 157974c2f5eSRaphael Isemann ValueCheck(name="b", type="unsigned int:4", value="0"), 158974c2f5eSRaphael Isemann ValueCheck(name="c", type="unsigned int:4", value="5") 159974c2f5eSRaphael Isemann ] 160974c2f5eSRaphael Isemann self.expect_expr("with_vtable", result_children=with_vtable_children) 161974c2f5eSRaphael Isemann self.expect_var_path("with_vtable", children=with_vtable_children) 162974c2f5eSRaphael Isemann 163974c2f5eSRaphael Isemann # Test a class with a vtable ptr and unnamed bitfield directly after. 164974c2f5eSRaphael Isemann with_vtable_and_unnamed_children = [ 165*e2ede171SRaphael Isemann ValueCheck(name="", type="int:4", value="0"), 166974c2f5eSRaphael Isemann ValueCheck(name="b", type="unsigned int:4", value="0"), 167974c2f5eSRaphael Isemann ValueCheck(name="c", type="unsigned int:4", value="5") 168974c2f5eSRaphael Isemann ] 169974c2f5eSRaphael Isemann self.expect_expr("with_vtable_and_unnamed", 170974c2f5eSRaphael Isemann result_children=with_vtable_and_unnamed_children) 171974c2f5eSRaphael Isemann self.expect_var_path("with_vtable_and_unnamed", 172974c2f5eSRaphael Isemann children=with_vtable_and_unnamed_children) 173