1*99451b44SJordan Rupprecht"""Show bitfields and check that they display correctly."""
2*99451b44SJordan Rupprecht
3*99451b44SJordan Rupprechtimport lldb
4*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
5*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
6*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
7*99451b44SJordan Rupprecht
8*99451b44SJordan Rupprecht
9*99451b44SJordan Rupprechtclass CppBitfieldsTestCase(TestBase):
10*99451b44SJordan Rupprecht
11*99451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
12*99451b44SJordan Rupprecht
13*99451b44SJordan Rupprecht    def setUp(self):
14*99451b44SJordan Rupprecht        # Call super's setUp().
15*99451b44SJordan Rupprecht        TestBase.setUp(self)
16*99451b44SJordan Rupprecht        # Find the line number to break inside main().
17*99451b44SJordan Rupprecht        self.line = line_number('main.cpp', '// Set break point at this line.')
18*99451b44SJordan Rupprecht
19*99451b44SJordan Rupprecht    # BitFields exhibit crashes in record layout on Windows
20*99451b44SJordan Rupprecht    # (http://llvm.org/pr21800)
21*99451b44SJordan Rupprecht    @skipIfWindows
22*99451b44SJordan Rupprecht    def test_and_run_command(self):
23*99451b44SJordan Rupprecht        """Test 'frame variable ...' on a variable with bitfields."""
24*99451b44SJordan Rupprecht        self.build()
25*99451b44SJordan Rupprecht
26*99451b44SJordan Rupprecht        lldbutil.run_to_source_breakpoint(self, '// Set break point at this line.',
27*99451b44SJordan Rupprecht          lldb.SBFileSpec("main.cpp", False))
28*99451b44SJordan Rupprecht
29*99451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
30*99451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
31*99451b44SJordan Rupprecht                    substrs=['stopped',
32*99451b44SJordan Rupprecht                             'stop reason = breakpoint'])
33*99451b44SJordan Rupprecht
34*99451b44SJordan Rupprecht        # The breakpoint should have a hit count of 1.
35*99451b44SJordan Rupprecht        self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
36*99451b44SJordan Rupprecht                    substrs=[' resolved, hit count = 1'])
37*99451b44SJordan Rupprecht
38*99451b44SJordan Rupprecht        self.expect("expr (lba.a)", VARIABLES_DISPLAYED_CORRECTLY,
39*99451b44SJordan Rupprecht                    substrs=['unsigned int', '2'])
40*99451b44SJordan Rupprecht        self.expect("expr (lbb.b)", VARIABLES_DISPLAYED_CORRECTLY,
41*99451b44SJordan Rupprecht                    substrs=['unsigned int', '3'])
42*99451b44SJordan Rupprecht        self.expect("expr (lbc.c)", VARIABLES_DISPLAYED_CORRECTLY,
43*99451b44SJordan Rupprecht                    substrs=['unsigned int', '4'])
44*99451b44SJordan Rupprecht        self.expect("expr (lbd.a)", VARIABLES_DISPLAYED_CORRECTLY,
45*99451b44SJordan Rupprecht                    substrs=['unsigned int', '5'])
46*99451b44SJordan Rupprecht        self.expect("expr (clang_example.f.a)", VARIABLES_DISPLAYED_CORRECTLY,
47*99451b44SJordan Rupprecht                    substrs=['uint64_t', '1'])
48*99451b44SJordan Rupprecht
49*99451b44SJordan Rupprecht        self.expect(
50*99451b44SJordan Rupprecht            "frame variable --show-types lba",
51*99451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
52*99451b44SJordan Rupprecht            substrs=[
53*99451b44SJordan Rupprecht                '(int:32)  = ',
54*99451b44SJordan Rupprecht                '(unsigned int:20) a = 2',
55*99451b44SJordan Rupprecht                ])
56*99451b44SJordan Rupprecht
57*99451b44SJordan Rupprecht        self.expect(
58*99451b44SJordan Rupprecht            "frame variable --show-types lbb",
59*99451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
60*99451b44SJordan Rupprecht            substrs=[
61*99451b44SJordan Rupprecht                '(unsigned int:1) a = 1',
62*99451b44SJordan Rupprecht                '(int:31)  =',
63*99451b44SJordan Rupprecht                '(unsigned int:20) b = 3',
64*99451b44SJordan Rupprecht                ])
65*99451b44SJordan Rupprecht
66*99451b44SJordan Rupprecht        self.expect(
67*99451b44SJordan Rupprecht            "frame variable --show-types lbc",
68*99451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
69*99451b44SJordan Rupprecht            substrs=[
70*99451b44SJordan Rupprecht                '(int:22)  =',
71*99451b44SJordan Rupprecht                '(unsigned int:1) a = 1',
72*99451b44SJordan Rupprecht                '(unsigned int:1) b = 0',
73*99451b44SJordan Rupprecht                '(unsigned int:5) c = 4',
74*99451b44SJordan Rupprecht                '(unsigned int:1) d = 1',
75*99451b44SJordan Rupprecht                '(int:2)  =',
76*99451b44SJordan Rupprecht                '(unsigned int:20) e = 20',
77*99451b44SJordan Rupprecht                ])
78*99451b44SJordan Rupprecht
79*99451b44SJordan Rupprecht        self.expect(
80*99451b44SJordan Rupprecht            "frame variable --show-types lbd",
81*99451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
82*99451b44SJordan Rupprecht            substrs=[
83*99451b44SJordan Rupprecht                '(char [3]) arr = "ab"',
84*99451b44SJordan Rupprecht                '(int:32)  =',
85*99451b44SJordan Rupprecht                '(unsigned int:20) a = 5',
86*99451b44SJordan Rupprecht                ])
87*99451b44SJordan Rupprecht
88*99451b44SJordan Rupprecht        self.expect(
89*99451b44SJordan Rupprecht            "frame variable --show-types clang_example",
90*99451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
91*99451b44SJordan Rupprecht            substrs=[
92*99451b44SJordan Rupprecht                   '(int:22)  =',
93*99451b44SJordan Rupprecht                   '(uint64_t:1) a = 1',
94*99451b44SJordan Rupprecht                   '(uint64_t:1) b = 0',
95*99451b44SJordan Rupprecht                   '(uint64_t:1) c = 1',
96*99451b44SJordan Rupprecht                   '(uint64_t:1) d = 0',
97*99451b44SJordan Rupprecht                   '(uint64_t:1) e = 1',
98*99451b44SJordan Rupprecht                   '(uint64_t:1) f = 0',
99*99451b44SJordan Rupprecht                   '(uint64_t:1) g = 1',
100*99451b44SJordan Rupprecht                   '(uint64_t:1) h = 0',
101*99451b44SJordan Rupprecht                   '(uint64_t:1) i = 1',
102*99451b44SJordan Rupprecht                   '(uint64_t:1) j = 0',
103*99451b44SJordan Rupprecht                   '(uint64_t:1) k = 1',
104*99451b44SJordan Rupprecht                ])
105*99451b44SJordan Rupprecht
106