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