199451b44SJordan Rupprecht"""Show local variables and check that they can be inspected.
299451b44SJordan Rupprecht
399451b44SJordan RupprechtThis test was added after we made a change in clang to normalize
499451b44SJordan RupprechtDW_OP_constu(X < 32) to DW_OP_litX which broke the debugger because
599451b44SJordan Rupprechtit didn't read the value as an unsigned.
699451b44SJordan Rupprecht"""
799451b44SJordan Rupprecht
899451b44SJordan Rupprecht
999451b44SJordan Rupprecht
1099451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
1199451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1299451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprechtclass LocalVariablesTestCase(TestBase):
1699451b44SJordan Rupprecht
1799451b44SJordan Rupprecht    def setUp(self):
1899451b44SJordan Rupprecht        # Call super's setUp().
1999451b44SJordan Rupprecht        TestBase.setUp(self)
2099451b44SJordan Rupprecht        # Find the line number to break inside main().
2199451b44SJordan Rupprecht        self.source = 'main.c'
2299451b44SJordan Rupprecht        self.line = line_number(
2399451b44SJordan Rupprecht            self.source, '// Set break point at this line.')
2499451b44SJordan Rupprecht
2599451b44SJordan Rupprecht    @skipIfWindows
2699451b44SJordan Rupprecht    def test_c_local_variables(self):
2799451b44SJordan Rupprecht        """Test local variable value."""
2899451b44SJordan Rupprecht        self.build()
2999451b44SJordan Rupprecht
3099451b44SJordan Rupprecht        # Create a target by the debugger.
3199451b44SJordan Rupprecht        target = self.dbg.CreateTarget(self.getBuildArtifact("a.out"))
3299451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
3399451b44SJordan Rupprecht
3499451b44SJordan Rupprecht        # Break inside the main.
3599451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
3699451b44SJordan Rupprecht            self, self.source, self.line, num_expected_locations=1, loc_exact=True)
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        # Now launch the process, and do not stop at entry point.
3999451b44SJordan Rupprecht        process = target.LaunchSimple(
4099451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
4199451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
4299451b44SJordan Rupprecht
4399451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
4499451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
4599451b44SJordan Rupprecht                    substrs=['stopped',
4699451b44SJordan Rupprecht                             'stop reason = breakpoint'])
4799451b44SJordan Rupprecht
4899451b44SJordan Rupprecht        # The breakpoint should have a hit count of 1.
49*9f0b5f9aSSYNOPSYS\georgiev        lldbutil.check_breakpoint(self, bpno = 1, expected_hit_count = 1)
5099451b44SJordan Rupprecht
5199451b44SJordan Rupprecht        self.expect("frame variable i", VARIABLES_DISPLAYED_CORRECTLY,
5299451b44SJordan Rupprecht                    substrs=['(unsigned int) i = 10'])
53