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)