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
49*bae9aedbSshafik        self.expect("expr uwbf",
50*bae9aedbSshafik            substrs=['a = 255',
51*bae9aedbSshafik                    'b = 65535',
52*bae9aedbSshafik                    'c = 4294967295',
53*bae9aedbSshafik                    'x = 4294967295'] )
54*bae9aedbSshafik
55*bae9aedbSshafik        self.expect("expr uwubf",
56*bae9aedbSshafik            substrs=['a = 16777215',
57*bae9aedbSshafik                    'x = 4294967295'] )
58*bae9aedbSshafik
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