1*025f6ca7SRaphael Isemann"""Test C bitfields.""" 299451b44SJordan Rupprecht 399451b44SJordan Rupprecht 499451b44SJordan Rupprecht 599451b44SJordan Rupprechtimport lldb 699451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 799451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 899451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 999451b44SJordan Rupprecht 1099451b44SJordan Rupprecht 11*025f6ca7SRaphael Isemannclass TestCase(TestBase): 1299451b44SJordan Rupprecht 13*025f6ca7SRaphael Isemann def run_to_main(self): 14*025f6ca7SRaphael Isemann self.build() 15*025f6ca7SRaphael Isemann lldbutil.run_to_source_breakpoint(self, "// break here", lldb.SBFileSpec("main.c")) 1699451b44SJordan Rupprecht 1799451b44SJordan Rupprecht # BitFields exhibit crashes in record layout on Windows 1899451b44SJordan Rupprecht # (http://llvm.org/pr21800) 1999451b44SJordan Rupprecht @skipIfWindows 20*025f6ca7SRaphael Isemann def test_bits(self): 21*025f6ca7SRaphael Isemann self.run_to_main() 2299451b44SJordan Rupprecht 23*025f6ca7SRaphael Isemann # Check each field of Bits. 24*025f6ca7SRaphael Isemann bits_children = [ 25*025f6ca7SRaphael Isemann ValueCheck(type="int:1"), # Unnamed and uninitialized 26*025f6ca7SRaphael Isemann ValueCheck(type="uint32_t:1", name="b1", value="1"), 27*025f6ca7SRaphael Isemann ValueCheck(type="uint32_t:2", name="b2", value="3"), 28*025f6ca7SRaphael Isemann ValueCheck(type="int:2"), # Unnamed and uninitialized 29*025f6ca7SRaphael Isemann ValueCheck(type="uint32_t:3", name="b3", value="7"), 30*025f6ca7SRaphael Isemann ValueCheck(type="uint32_t", name="b4", value="15"), 31*025f6ca7SRaphael Isemann ValueCheck(type="uint32_t:5", name="b5", value="31"), 32*025f6ca7SRaphael Isemann ValueCheck(type="uint32_t:6", name="b6", value="63"), 33*025f6ca7SRaphael Isemann ValueCheck(type="uint32_t:7", name="b7", value="127"), 34*025f6ca7SRaphael Isemann ValueCheck(type="uint32_t:4", name="four", value="15") 35*025f6ca7SRaphael Isemann ] 36*025f6ca7SRaphael Isemann self.expect_var_path("bits", type="Bits", children=bits_children) 37*025f6ca7SRaphael Isemann self.expect_expr("bits", result_children=bits_children) 3899451b44SJordan Rupprecht 39*025f6ca7SRaphael Isemann # Try accessing the different fields using the expression evaluator. 40*025f6ca7SRaphael Isemann self.expect_expr("bits.b1", result_type="uint32_t", result_value="1") 41*025f6ca7SRaphael Isemann self.expect_expr("bits.b2", result_type="uint32_t", result_value="3") 42*025f6ca7SRaphael Isemann self.expect_expr("bits.b3", result_type="uint32_t", result_value="7") 43*025f6ca7SRaphael Isemann self.expect_expr("bits.b4", result_type="uint32_t", result_value="15") 44*025f6ca7SRaphael Isemann self.expect_expr("bits.b5", result_type="uint32_t", result_value="31") 45*025f6ca7SRaphael Isemann self.expect_expr("bits.b6", result_type="uint32_t", result_value="63") 46*025f6ca7SRaphael Isemann self.expect_expr("bits.b7", result_type="uint32_t", result_value="127") 47*025f6ca7SRaphael Isemann self.expect_expr("bits.four", result_type="uint32_t", result_value="15") 4899451b44SJordan Rupprecht 49*025f6ca7SRaphael Isemann # Try accessing the different fields using variable paths. 50*025f6ca7SRaphael Isemann self.expect_var_path("bits.b1", type="uint32_t:1", value="1") 51*025f6ca7SRaphael Isemann self.expect_var_path("bits.b2", type="uint32_t:2", value="3") 52*025f6ca7SRaphael Isemann self.expect_var_path("bits.b4", type="uint32_t", value="15") 53*025f6ca7SRaphael Isemann self.expect_var_path("bits.b5", type="uint32_t:5", value="31") 54*025f6ca7SRaphael Isemann self.expect_var_path("bits.b7", type="uint32_t:7", value="127") 5599451b44SJordan Rupprecht 5699451b44SJordan Rupprecht 57*025f6ca7SRaphael Isemann # Check each field of MoreBits. 58*025f6ca7SRaphael Isemann more_bits_children = [ 59*025f6ca7SRaphael Isemann ValueCheck(type="uint32_t:3", name="a", value="3"), 60*025f6ca7SRaphael Isemann ValueCheck(type="int:1", value="0"), 61*025f6ca7SRaphael Isemann ValueCheck(type="uint8_t:1", name="b", value="'\\0'"), 62*025f6ca7SRaphael Isemann ValueCheck(type="uint8_t:1", name="c", value="'\\x01'"), 63*025f6ca7SRaphael Isemann ValueCheck(type="uint8_t:1", name="d", value="'\\0'"), 64*025f6ca7SRaphael Isemann ] 65*025f6ca7SRaphael Isemann self.expect_var_path("more_bits", type="MoreBits", children=more_bits_children) 66*025f6ca7SRaphael Isemann self.expect_expr("more_bits", result_children=more_bits_children) 6799451b44SJordan Rupprecht 68*025f6ca7SRaphael Isemann self.expect_expr("more_bits.a", result_type="uint32_t", result_value="3") 69*025f6ca7SRaphael Isemann self.expect_expr("more_bits.b", result_type="uint8_t", result_value="'\\0'") 70*025f6ca7SRaphael Isemann self.expect_expr("more_bits.c", result_type="uint8_t", result_value="'\\x01'") 71*025f6ca7SRaphael Isemann self.expect_expr("more_bits.d", result_type="uint8_t", result_value="'\\0'") 7299451b44SJordan Rupprecht 73*025f6ca7SRaphael Isemann # Test a struct with several single bit fields. 74*025f6ca7SRaphael Isemann many_single_bits_children = [ 75*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b1", value="1"), 76*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b2", value="0"), 77*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b3", value="0"), 78*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b4", value="0"), 79*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b5", value="1"), 80*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b6", value="0"), 81*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b7", value="1"), 82*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b8", value="0"), 83*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b9", value="0"), 84*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b10", value="0"), 85*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b11", value="0"), 86*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b12", value="0"), 87*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b13", value="1"), 88*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b14", value="0"), 89*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b15", value="0"), 90*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b16", value="0"), 91*025f6ca7SRaphael Isemann ValueCheck(type="uint16_t:1", name="b17", value="0"), 92*025f6ca7SRaphael Isemann ] 93*025f6ca7SRaphael Isemann self.expect_var_path("many_single_bits", type="ManySingleBits", children=many_single_bits_children) 94*025f6ca7SRaphael Isemann self.expect_expr("many_single_bits", result_type="ManySingleBits", 95*025f6ca7SRaphael Isemann result_children=many_single_bits_children) 9699451b44SJordan Rupprecht 97*025f6ca7SRaphael Isemann # Check a packed struct. 98*025f6ca7SRaphael Isemann self.expect_expr("packed.a", result_type="char", result_value="'a'") 99*025f6ca7SRaphael Isemann self.expect_expr("packed.b", result_type="uint32_t", result_value="10") 100*025f6ca7SRaphael Isemann self.expect_expr("packed.c", result_type="uint32_t", result_value=str(int("7112233", 16))) 10199451b44SJordan Rupprecht 102*025f6ca7SRaphael Isemann # A packed struct with bitfield size > 32. 10399451b44SJordan Rupprecht self.expect("v/x large_packed", VARIABLES_DISPLAYED_CORRECTLY, 10499451b44SJordan Rupprecht substrs=["a = 0x0000000cbbbbaaaa", "b = 0x0000000dffffeee"]) 10599451b44SJordan Rupprecht 10697ca9ca1SPavel Labath # Check reading a bitfield through a pointer in various ways (PR47743) 10797ca9ca1SPavel Labath self.expect("v/x large_packed_ptr->b", 10897ca9ca1SPavel Labath substrs=["large_packed_ptr->b = 0x0000000dffffeeee"]) 10997ca9ca1SPavel Labath self.expect("v/x large_packed_ptr[0].b", 11097ca9ca1SPavel Labath substrs=["large_packed_ptr[0].b = 0x0000000dffffeeee"]) 11197ca9ca1SPavel Labath 11219d64138SPavel Labath # BitFields exhibit crashes in record layout on Windows 11319d64138SPavel Labath # (http://llvm.org/pr21800) 11419d64138SPavel Labath @skipIfWindows 11519d64138SPavel Labath def test_expression_bug(self): 11619d64138SPavel Labath # Ensure evaluating (emulating) an expression does not break bitfield 11719d64138SPavel Labath # values for already parsed variables. The expression is run twice 11819d64138SPavel Labath # because the very first expression can resume a target (to allocate 11919d64138SPavel Labath # memory, etc.) even if it is not being jitted. 120*025f6ca7SRaphael Isemann self.run_to_main() 121*025f6ca7SRaphael Isemann 12219d64138SPavel Labath self.expect("v/x large_packed", VARIABLES_DISPLAYED_CORRECTLY, 12319d64138SPavel Labath substrs=["a = 0x0000000cbbbbaaaa", "b = 0x0000000dffffeee"]) 12419d64138SPavel Labath self.expect("expr --allow-jit false -- more_bits.a", VARIABLES_DISPLAYED_CORRECTLY, 12519d64138SPavel Labath substrs=['uint32_t', '3']) 12619d64138SPavel Labath self.expect("v/x large_packed", VARIABLES_DISPLAYED_CORRECTLY, 12719d64138SPavel Labath substrs=["a = 0x0000000cbbbbaaaa", "b = 0x0000000dffffeee"]) 12819d64138SPavel Labath self.expect("expr --allow-jit false -- more_bits.a", VARIABLES_DISPLAYED_CORRECTLY, 12919d64138SPavel Labath substrs=['uint32_t', '3']) 13019d64138SPavel Labath self.expect("v/x large_packed", VARIABLES_DISPLAYED_CORRECTLY, 13119d64138SPavel Labath substrs=["a = 0x0000000cbbbbaaaa", "b = 0x0000000dffffeee"]) 13299451b44SJordan Rupprecht 13399451b44SJordan Rupprecht @add_test_categories(['pyapi']) 13499451b44SJordan Rupprecht # BitFields exhibit crashes in record layout on Windows 13599451b44SJordan Rupprecht # (http://llvm.org/pr21800) 13699451b44SJordan Rupprecht @skipIfWindows 13799451b44SJordan Rupprecht def test_and_python_api(self): 13899451b44SJordan Rupprecht """Use Python APIs to inspect a bitfields variable.""" 139*025f6ca7SRaphael Isemann self.run_to_main() 14099451b44SJordan Rupprecht 14199451b44SJordan Rupprecht # Lookup the "bits" variable which contains 8 bitfields. 142*025f6ca7SRaphael Isemann bits = self.frame().FindVariable("bits") 14399451b44SJordan Rupprecht self.DebugSBValue(bits) 144*025f6ca7SRaphael Isemann self.assertEqual(bits.GetTypeName(), 'Bits') 145*025f6ca7SRaphael Isemann self.assertEqual(bits.GetNumChildren(), 10) 146*025f6ca7SRaphael Isemann self.assertEqual(bits.GetByteSize(), 32) 14799451b44SJordan Rupprecht 14899451b44SJordan Rupprecht # Notice the pattern of int(b1.GetValue(), 0). We pass a base of 0 14999451b44SJordan Rupprecht # so that the proper radix is determined based on the contents of the 15099451b44SJordan Rupprecht # string. 15199451b44SJordan Rupprecht b1 = bits.GetChildMemberWithName("b1") 15299451b44SJordan Rupprecht self.DebugSBValue(b1) 153*025f6ca7SRaphael Isemann self.assertEqual(b1.GetName(), "b1") 154*025f6ca7SRaphael Isemann self.assertEqual(b1.GetTypeName(), "uint32_t:1") 155*025f6ca7SRaphael Isemann self.assertTrue(b1.IsInScope()) 156*025f6ca7SRaphael Isemann self.assertEqual(int(b1.GetValue(), 0), 1) 15799451b44SJordan Rupprecht 15899451b44SJordan Rupprecht b7 = bits.GetChildMemberWithName("b7") 159*025f6ca7SRaphael Isemann self.assertEqual(b7.GetName(), "b7") 160*025f6ca7SRaphael Isemann self.assertEqual(b7.GetTypeName(), "uint32_t:7") 161*025f6ca7SRaphael Isemann self.assertTrue(b7.IsInScope()) 162*025f6ca7SRaphael Isemann self.assertEqual(int(b7.GetValue(), 0), 127) 16399451b44SJordan Rupprecht 16499451b44SJordan Rupprecht four = bits.GetChildMemberWithName("four") 165*025f6ca7SRaphael Isemann self.assertEqual(four.GetName(), "four") 166*025f6ca7SRaphael Isemann self.assertEqual(four.GetTypeName(), "uint32_t:4") 167*025f6ca7SRaphael Isemann self.assertTrue(four.IsInScope()) 168*025f6ca7SRaphael Isemann self.assertEqual(int(four.GetValue(), 0), 15)