1"""Show bitfields and check that they display correctly.""" 2 3import lldb 4from lldbsuite.test.decorators import * 5from lldbsuite.test.lldbtest import * 6from lldbsuite.test import lldbutil 7 8 9class CppBitfieldsTestCase(TestBase): 10 11 @no_debug_info_test 12 def test_bitfields(self): 13 self.build() 14 lldbutil.run_to_source_breakpoint(self, '// break here', 15 lldb.SBFileSpec("main.cpp", False)) 16 17 # Accessing LargeBitsA. 18 self.expect_expr("lba", result_children=[ 19 ValueCheck(name="", type="int:32"), 20 ValueCheck(name="a", type="unsigned int:20", value="2") 21 ]) 22 self.expect_expr("lba.a", result_type="unsigned int", result_value="2") 23 24 25 # Accessing LargeBitsB. 26 self.expect_expr("lbb", result_children=[ 27 ValueCheck(name="a", type="unsigned int:1", value="1"), 28 ValueCheck(name="", type="int:31"), 29 ValueCheck(name="b", type="unsigned int:20", value="3") 30 ]) 31 self.expect_expr("lbb.b", result_type="unsigned int", result_value="3") 32 33 34 # Accessing LargeBitsC. 35 self.expect_expr("lbc", result_children=[ 36 ValueCheck(name="", type="int:22"), 37 ValueCheck(name="a", type="unsigned int:1", value="1"), 38 ValueCheck(name="b", type="unsigned int:1", value="0"), 39 ValueCheck(name="c", type="unsigned int:5", value="4"), 40 ValueCheck(name="d", type="unsigned int:1", value="1"), 41 ValueCheck(name="", type="int:2"), 42 ValueCheck(name="e", type="unsigned int:20", value="20"), 43 ]) 44 self.expect_expr("lbc.c", result_type="unsigned int", result_value="4") 45 46 47 # Accessing LargeBitsD. 48 self.expect_expr("lbd", result_children=[ 49 ValueCheck(name="arr", type="char[3]", summary='"ab"'), 50 ValueCheck(name="", type="int:32"), 51 ValueCheck(name="a", type="unsigned int:20", value="5") 52 ]) 53 self.expect_expr("lbd.a", result_type="unsigned int", result_value="5") 54 55 56 # Test BitfieldsInStructInUnion. 57 # FIXME: This needs some more explanation for what it's actually testing. 58 nested_struct_children = [ 59 ValueCheck(name="", type="int:22"), 60 ValueCheck(name="a", type="uint64_t:1", value="1"), 61 ValueCheck(name="b", type="uint64_t:1", value="0"), 62 ValueCheck(name="c", type="uint64_t:1", value="1"), 63 ValueCheck(name="d", type="uint64_t:1", value="0"), 64 ValueCheck(name="e", type="uint64_t:1", value="1"), 65 ValueCheck(name="f", type="uint64_t:1", value="0"), 66 ValueCheck(name="g", type="uint64_t:1", value="1"), 67 ValueCheck(name="h", type="uint64_t:1", value="0"), 68 ValueCheck(name="i", type="uint64_t:1", value="1"), 69 ValueCheck(name="j", type="uint64_t:1", value="0"), 70 ValueCheck(name="k", type="uint64_t:1", value="1") 71 ] 72 self.expect_expr("bitfields_in_struct_in_union", 73 result_type="BitfieldsInStructInUnion", 74 result_children=[ValueCheck(name="", children=[ 75 ValueCheck(name="f", children=nested_struct_children) 76 ])] 77 ) 78 self.expect_expr("bitfields_in_struct_in_union.f.a", 79 result_type="uint64_t", result_value="1") 80 81 82 # Unions with bitfields. 83 self.expect_expr("uwbf", result_type="UnionWithBitfields", result_children=[ 84 ValueCheck(name="a", value="255"), 85 ValueCheck(name="b", value="65535"), 86 ValueCheck(name="c", value="4294967295"), 87 ValueCheck(name="x", value="4294967295") 88 ]) 89 self.expect_expr("uwubf", result_type="UnionWithUnnamedBitfield", 90 result_children=[ 91 ValueCheck(name="a", value="16777215"), 92 ValueCheck(name="x", value="4294967295") 93 ] 94 ) 95 96 # Class with a base class and a bitfield. 97 self.expect_expr("derived", result_type="Derived", result_children=[ 98 ValueCheck(name="Base", children=[ 99 ValueCheck(name="b_a", value="2", type="uint32_t") 100 ]), 101 ValueCheck(name="d_a", value="1", type="uint32_t:1") 102 ]) 103 104 105 # Struct with bool bitfields. 106 self.expect_expr("bb", result_type="", result_children=[ 107 ValueCheck(name="a", value="true", type="bool:1"), 108 ValueCheck(name="b", value="false", type="bool:1"), 109 ValueCheck(name="c", value="true", type="bool:2"), 110 ValueCheck(name="d", value="true", type="bool:2") 111 ]) 112 113 bb = self.frame().FindVariable('bb') 114 self.assertSuccess(bb.GetError()) 115 116 bb_a = bb.GetChildAtIndex(0) 117 self.assertSuccess(bb_a.GetError()) 118 self.assertEqual(bb_a.GetValueAsUnsigned(), 1) 119 self.assertEqual(bb_a.GetValueAsSigned(), 1) 120 121 bb_b = bb.GetChildAtIndex(1) 122 self.assertSuccess(bb_b.GetError()) 123 self.assertEqual(bb_b.GetValueAsUnsigned(), 0) 124 self.assertEqual(bb_b.GetValueAsSigned(), 0) 125 126 bb_c = bb.GetChildAtIndex(2) 127 self.assertSuccess(bb_c.GetError()) 128 self.assertEqual(bb_c.GetValueAsUnsigned(), 1) 129 self.assertEqual(bb_c.GetValueAsSigned(), 1) 130 131 bb_d = bb.GetChildAtIndex(3) 132 self.assertSuccess(bb_d.GetError()) 133 self.assertEqual(bb_d.GetValueAsUnsigned(), 1) 134 self.assertEqual(bb_d.GetValueAsSigned(), 1) 135 136 # Test a class with a base class that has a vtable ptr. The derived 137 # class has bitfields. 138 base_with_vtable_children = [ 139 ValueCheck(name="a", type="unsigned int:4", value="5"), 140 ValueCheck(name="b", type="unsigned int:4", value="0"), 141 ValueCheck(name="c", type="unsigned int:4", value="5") 142 ] 143 self.expect_expr("base_with_vtable", result_children=base_with_vtable_children) 144 self.expect_var_path("base_with_vtable", children=base_with_vtable_children) 145 146 @no_debug_info_test 147 def test_bitfield_behind_vtable_ptr(self): 148 self.build() 149 lldbutil.run_to_source_breakpoint(self, '// break here', 150 lldb.SBFileSpec("main.cpp", False)) 151 152 # Test a class with a vtable ptr and bitfields. 153 with_vtable_children = [ 154 ValueCheck(name="a", type="unsigned int:4", value="5"), 155 ValueCheck(name="b", type="unsigned int:4", value="0"), 156 ValueCheck(name="c", type="unsigned int:4", value="5") 157 ] 158 self.expect_expr("with_vtable", result_children=with_vtable_children) 159 self.expect_var_path("with_vtable", children=with_vtable_children) 160 161 # Test a class with a vtable ptr and unnamed bitfield directly after. 162 with_vtable_and_unnamed_children = [ 163 ValueCheck(name="", type="int:4", value="0"), 164 ValueCheck(name="b", type="unsigned int:4", value="0"), 165 ValueCheck(name="c", type="unsigned int:4", value="5") 166 ] 167 self.expect_expr("with_vtable_and_unnamed", 168 result_children=with_vtable_and_unnamed_children) 169 self.expect_var_path("with_vtable_and_unnamed", 170 children=with_vtable_and_unnamed_children) 171