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