199451b44SJordan Rupprecht"""Show bitfields and check that they display correctly."""
299451b44SJordan Rupprecht
399451b44SJordan Rupprechtimport lldb
499451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
599451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
699451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
799451b44SJordan Rupprecht
899451b44SJordan Rupprecht
999451b44SJordan Rupprechtclass CppBitfieldsTestCase(TestBase):
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprecht    def setUp(self):
1499451b44SJordan Rupprecht        # Call super's setUp().
1599451b44SJordan Rupprecht        TestBase.setUp(self)
1699451b44SJordan Rupprecht        # Find the line number to break inside main().
1799451b44SJordan Rupprecht        self.line = line_number('main.cpp', '// Set break point at this line.')
1899451b44SJordan Rupprecht
1999451b44SJordan Rupprecht    # BitFields exhibit crashes in record layout on Windows
2099451b44SJordan Rupprecht    # (http://llvm.org/pr21800)
2199451b44SJordan Rupprecht    @skipIfWindows
2299451b44SJordan Rupprecht    def test_and_run_command(self):
2399451b44SJordan Rupprecht        """Test 'frame variable ...' on a variable with bitfields."""
2499451b44SJordan Rupprecht        self.build()
2599451b44SJordan Rupprecht
2699451b44SJordan Rupprecht        lldbutil.run_to_source_breakpoint(self, '// Set break point at this line.',
2799451b44SJordan Rupprecht          lldb.SBFileSpec("main.cpp", False))
2899451b44SJordan Rupprecht
2999451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
3099451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
3199451b44SJordan Rupprecht                    substrs=['stopped',
3299451b44SJordan Rupprecht                             'stop reason = breakpoint'])
3399451b44SJordan Rupprecht
3499451b44SJordan Rupprecht        # The breakpoint should have a hit count of 1.
3599451b44SJordan Rupprecht        self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
3699451b44SJordan Rupprecht                    substrs=[' resolved, hit count = 1'])
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        self.expect("expr (lba.a)", VARIABLES_DISPLAYED_CORRECTLY,
3999451b44SJordan Rupprecht                    substrs=['unsigned int', '2'])
4099451b44SJordan Rupprecht        self.expect("expr (lbb.b)", VARIABLES_DISPLAYED_CORRECTLY,
4199451b44SJordan Rupprecht                    substrs=['unsigned int', '3'])
4299451b44SJordan Rupprecht        self.expect("expr (lbc.c)", VARIABLES_DISPLAYED_CORRECTLY,
4399451b44SJordan Rupprecht                    substrs=['unsigned int', '4'])
4499451b44SJordan Rupprecht        self.expect("expr (lbd.a)", VARIABLES_DISPLAYED_CORRECTLY,
4599451b44SJordan Rupprecht                    substrs=['unsigned int', '5'])
4699451b44SJordan Rupprecht        self.expect("expr (clang_example.f.a)", VARIABLES_DISPLAYED_CORRECTLY,
4799451b44SJordan Rupprecht                    substrs=['uint64_t', '1'])
4899451b44SJordan Rupprecht
49bae9aedbSshafik        self.expect("expr uwbf",
50bae9aedbSshafik            substrs=['a = 255',
51bae9aedbSshafik                    'b = 65535',
52bae9aedbSshafik                    'c = 4294967295',
53bae9aedbSshafik                    'x = 4294967295'] )
54bae9aedbSshafik
55bae9aedbSshafik        self.expect("expr uwubf",
56bae9aedbSshafik            substrs=['a = 16777215',
57bae9aedbSshafik                    'x = 4294967295'] )
58bae9aedbSshafik
5999451b44SJordan Rupprecht        self.expect(
6099451b44SJordan Rupprecht            "frame variable --show-types lba",
6199451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
6299451b44SJordan Rupprecht            substrs=[
6399451b44SJordan Rupprecht                '(int:32)  = ',
6499451b44SJordan Rupprecht                '(unsigned int:20) a = 2',
6599451b44SJordan Rupprecht                ])
6699451b44SJordan Rupprecht
6799451b44SJordan Rupprecht        self.expect(
6899451b44SJordan Rupprecht            "frame variable --show-types lbb",
6999451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
7099451b44SJordan Rupprecht            substrs=[
7199451b44SJordan Rupprecht                '(unsigned int:1) a = 1',
7299451b44SJordan Rupprecht                '(int:31)  =',
7399451b44SJordan Rupprecht                '(unsigned int:20) b = 3',
7499451b44SJordan Rupprecht                ])
7599451b44SJordan Rupprecht
7699451b44SJordan Rupprecht        self.expect(
7799451b44SJordan Rupprecht            "frame variable --show-types lbc",
7899451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
7999451b44SJordan Rupprecht            substrs=[
8099451b44SJordan Rupprecht                '(int:22)  =',
8199451b44SJordan Rupprecht                '(unsigned int:1) a = 1',
8299451b44SJordan Rupprecht                '(unsigned int:1) b = 0',
8399451b44SJordan Rupprecht                '(unsigned int:5) c = 4',
8499451b44SJordan Rupprecht                '(unsigned int:1) d = 1',
8599451b44SJordan Rupprecht                '(int:2)  =',
8699451b44SJordan Rupprecht                '(unsigned int:20) e = 20',
8799451b44SJordan Rupprecht                ])
8899451b44SJordan Rupprecht
8999451b44SJordan Rupprecht        self.expect(
9099451b44SJordan Rupprecht            "frame variable --show-types lbd",
9199451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
9299451b44SJordan Rupprecht            substrs=[
9399451b44SJordan Rupprecht                '(char [3]) arr = "ab"',
9499451b44SJordan Rupprecht                '(int:32)  =',
9599451b44SJordan Rupprecht                '(unsigned int:20) a = 5',
9699451b44SJordan Rupprecht                ])
9799451b44SJordan Rupprecht
9899451b44SJordan Rupprecht        self.expect(
9999451b44SJordan Rupprecht            "frame variable --show-types clang_example",
10099451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
10199451b44SJordan Rupprecht            substrs=[
10299451b44SJordan Rupprecht                   '(int:22)  =',
10399451b44SJordan Rupprecht                   '(uint64_t:1) a = 1',
10499451b44SJordan Rupprecht                   '(uint64_t:1) b = 0',
10599451b44SJordan Rupprecht                   '(uint64_t:1) c = 1',
10699451b44SJordan Rupprecht                   '(uint64_t:1) d = 0',
10799451b44SJordan Rupprecht                   '(uint64_t:1) e = 1',
10899451b44SJordan Rupprecht                   '(uint64_t:1) f = 0',
10999451b44SJordan Rupprecht                   '(uint64_t:1) g = 1',
11099451b44SJordan Rupprecht                   '(uint64_t:1) h = 0',
11199451b44SJordan Rupprecht                   '(uint64_t:1) i = 1',
11299451b44SJordan Rupprecht                   '(uint64_t:1) j = 0',
11399451b44SJordan Rupprecht                   '(uint64_t:1) k = 1',
11499451b44SJordan Rupprecht                ])
11599451b44SJordan Rupprecht
11600c8120aSshafik        self.expect(
11700c8120aSshafik            "frame variable --show-types derived",
11800c8120aSshafik            VARIABLES_DISPLAYED_CORRECTLY,
11900c8120aSshafik            substrs=[
12000c8120aSshafik                '(uint32_t) b_a = 2',
12100c8120aSshafik                '(uint32_t:1) d_a = 1',
12200c8120aSshafik                ])
123*0bab7b26SAndy Yankovsky
124*0bab7b26SAndy Yankovsky        self.expect(
125*0bab7b26SAndy Yankovsky            "frame variable --show-types bb",
126*0bab7b26SAndy Yankovsky            VARIABLES_DISPLAYED_CORRECTLY,
127*0bab7b26SAndy Yankovsky            substrs=[
128*0bab7b26SAndy Yankovsky                '(bool:1) a = true',
129*0bab7b26SAndy Yankovsky                '(bool:1) b = false',
130*0bab7b26SAndy Yankovsky                '(bool:2) c = true',
131*0bab7b26SAndy Yankovsky                '(bool:2) d = true',
132*0bab7b26SAndy Yankovsky                ])
133*0bab7b26SAndy Yankovsky
134*0bab7b26SAndy Yankovsky        bb = self.frame().FindVariable('bb')
135*0bab7b26SAndy Yankovsky        self.assertTrue(bb.IsValid())
136*0bab7b26SAndy Yankovsky
137*0bab7b26SAndy Yankovsky        bb_a = bb.GetChildAtIndex(0)
138*0bab7b26SAndy Yankovsky        self.assertTrue(bb_a.IsValid())
139*0bab7b26SAndy Yankovsky        self.assertEqual(bb_a.GetValueAsUnsigned(), 1)
140*0bab7b26SAndy Yankovsky        self.assertEqual(bb_a.GetValueAsSigned(), 1)
141*0bab7b26SAndy Yankovsky
142*0bab7b26SAndy Yankovsky        bb_b = bb.GetChildAtIndex(1)
143*0bab7b26SAndy Yankovsky        self.assertTrue(bb_b.IsValid())
144*0bab7b26SAndy Yankovsky        self.assertEqual(bb_b.GetValueAsUnsigned(), 0)
145*0bab7b26SAndy Yankovsky        self.assertEqual(bb_b.GetValueAsSigned(), 0)
146*0bab7b26SAndy Yankovsky
147*0bab7b26SAndy Yankovsky        bb_c = bb.GetChildAtIndex(2)
148*0bab7b26SAndy Yankovsky        self.assertTrue(bb_c.IsValid())
149*0bab7b26SAndy Yankovsky        self.assertEqual(bb_c.GetValueAsUnsigned(), 1)
150*0bab7b26SAndy Yankovsky        self.assertEqual(bb_c.GetValueAsSigned(), 1)
151*0bab7b26SAndy Yankovsky
152*0bab7b26SAndy Yankovsky        bb_d = bb.GetChildAtIndex(3)
153*0bab7b26SAndy Yankovsky        self.assertTrue(bb_d.IsValid())
154*0bab7b26SAndy Yankovsky        self.assertEqual(bb_d.GetValueAsUnsigned(), 1)
155*0bab7b26SAndy Yankovsky        self.assertEqual(bb_d.GetValueAsSigned(), 1)
156