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    def setUp(self):
14        # Call super's setUp().
15        TestBase.setUp(self)
16        # Find the line number to break inside main().
17        self.line = line_number('main.cpp', '// Set break point at this line.')
18
19    # BitFields exhibit crashes in record layout on Windows
20    # (http://llvm.org/pr21800)
21    @skipIfWindows
22    def test_and_run_command(self):
23        """Test 'frame variable ...' on a variable with bitfields."""
24        self.build()
25
26        lldbutil.run_to_source_breakpoint(self, '// Set break point at this line.',
27          lldb.SBFileSpec("main.cpp", False))
28
29        # The stop reason of the thread should be breakpoint.
30        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
31                    substrs=['stopped',
32                             'stop reason = breakpoint'])
33
34        # The breakpoint should have a hit count of 1.
35        self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
36                    substrs=[' resolved, hit count = 1'])
37
38        self.expect("expr (lba.a)", VARIABLES_DISPLAYED_CORRECTLY,
39                    substrs=['unsigned int', '2'])
40        self.expect("expr (lbb.b)", VARIABLES_DISPLAYED_CORRECTLY,
41                    substrs=['unsigned int', '3'])
42        self.expect("expr (lbc.c)", VARIABLES_DISPLAYED_CORRECTLY,
43                    substrs=['unsigned int', '4'])
44        self.expect("expr (lbd.a)", VARIABLES_DISPLAYED_CORRECTLY,
45                    substrs=['unsigned int', '5'])
46        self.expect("expr (clang_example.f.a)", VARIABLES_DISPLAYED_CORRECTLY,
47                    substrs=['uint64_t', '1'])
48
49        self.expect("expr uwbf",
50            substrs=['a = 255',
51                    'b = 65535',
52                    'c = 4294967295',
53                    'x = 4294967295'] )
54
55        self.expect("expr uwubf",
56            substrs=['a = 16777215',
57                    'x = 4294967295'] )
58
59        self.expect(
60            "frame variable --show-types lba",
61            VARIABLES_DISPLAYED_CORRECTLY,
62            substrs=[
63                '(int:32)  = ',
64                '(unsigned int:20) a = 2',
65                ])
66
67        self.expect(
68            "frame variable --show-types lbb",
69            VARIABLES_DISPLAYED_CORRECTLY,
70            substrs=[
71                '(unsigned int:1) a = 1',
72                '(int:31)  =',
73                '(unsigned int:20) b = 3',
74                ])
75
76        self.expect(
77            "frame variable --show-types lbc",
78            VARIABLES_DISPLAYED_CORRECTLY,
79            substrs=[
80                '(int:22)  =',
81                '(unsigned int:1) a = 1',
82                '(unsigned int:1) b = 0',
83                '(unsigned int:5) c = 4',
84                '(unsigned int:1) d = 1',
85                '(int:2)  =',
86                '(unsigned int:20) e = 20',
87                ])
88
89        self.expect(
90            "frame variable --show-types lbd",
91            VARIABLES_DISPLAYED_CORRECTLY,
92            substrs=[
93                '(char [3]) arr = "ab"',
94                '(int:32)  =',
95                '(unsigned int:20) a = 5',
96                ])
97
98        self.expect(
99            "frame variable --show-types clang_example",
100            VARIABLES_DISPLAYED_CORRECTLY,
101            substrs=[
102                   '(int:22)  =',
103                   '(uint64_t:1) a = 1',
104                   '(uint64_t:1) b = 0',
105                   '(uint64_t:1) c = 1',
106                   '(uint64_t:1) d = 0',
107                   '(uint64_t:1) e = 1',
108                   '(uint64_t:1) f = 0',
109                   '(uint64_t:1) g = 1',
110                   '(uint64_t:1) h = 0',
111                   '(uint64_t:1) i = 1',
112                   '(uint64_t:1) j = 0',
113                   '(uint64_t:1) k = 1',
114                ])
115
116        self.expect(
117            "frame variable --show-types derived",
118            VARIABLES_DISPLAYED_CORRECTLY,
119            substrs=[
120                '(uint32_t) b_a = 2',
121                '(uint32_t:1) d_a = 1',
122                ])
123
124        self.expect(
125            "frame variable --show-types bb",
126            VARIABLES_DISPLAYED_CORRECTLY,
127            substrs=[
128                '(bool:1) a = true',
129                '(bool:1) b = false',
130                '(bool:2) c = true',
131                '(bool:2) d = true',
132                ])
133
134        bb = self.frame().FindVariable('bb')
135        self.assertTrue(bb.IsValid())
136
137        bb_a = bb.GetChildAtIndex(0)
138        self.assertTrue(bb_a.IsValid())
139        self.assertEqual(bb_a.GetValueAsUnsigned(), 1)
140        self.assertEqual(bb_a.GetValueAsSigned(), 1)
141
142        bb_b = bb.GetChildAtIndex(1)
143        self.assertTrue(bb_b.IsValid())
144        self.assertEqual(bb_b.GetValueAsUnsigned(), 0)
145        self.assertEqual(bb_b.GetValueAsSigned(), 0)
146
147        bb_c = bb.GetChildAtIndex(2)
148        self.assertTrue(bb_c.IsValid())
149        self.assertEqual(bb_c.GetValueAsUnsigned(), 1)
150        self.assertEqual(bb_c.GetValueAsSigned(), 1)
151
152        bb_d = bb.GetChildAtIndex(3)
153        self.assertTrue(bb_d.IsValid())
154        self.assertEqual(bb_d.GetValueAsUnsigned(), 1)
155        self.assertEqual(bb_d.GetValueAsSigned(), 1)
156