| """Test that inlined argument variables have their correct location in debuginfo""" |
| |
| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| |
| class TestRedefinitionsInInlines(TestBase): |
| # https://github.com/llvm/llvm-project/issues/28219 |
| @skipIf(compiler="clang", compiler_version=["<", "3.5"]) |
| def test(self): |
| self.source = "main.c" |
| self.build() |
| (target, process, thread, bp1) = lldbutil.run_to_source_breakpoint( |
| self, "first breakpoint", lldb.SBFileSpec(self.source, False) |
| ) |
| |
| bp2 = target.BreakpointCreateBySourceRegex( |
| "second breakpoint", lldb.SBFileSpec(self.source, False) |
| ) |
| bp3 = target.BreakpointCreateBySourceRegex( |
| "third breakpoint", lldb.SBFileSpec(self.source, False) |
| ) |
| |
| # When called from main(), test2 is passed in the value of 42 in 'b' |
| self.expect("expression b", DATA_TYPES_DISPLAYED_CORRECTLY, substrs=["42"]) |
| |
| process.Continue() |
| |
| self.assertState(process.GetState(), lldb.eStateStopped) |
| thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint) |
| self.assertIsNotNone(thread) |
| bp_id = thread.GetStopReasonDataAtIndex(0) |
| self.assertEqual(bp_id, bp2.GetID()) |
| |
| self.expect("expression b", DATA_TYPES_DISPLAYED_CORRECTLY, substrs=["42"]) |
| self.expect("expression c", DATA_TYPES_DISPLAYED_CORRECTLY, substrs=["84"]) |
| |
| process.Continue() |
| |
| # Now we're in test1(), and the first thing it does is call test2(24). "Step in" |
| # and check that we have the value 24 as the argument. |
| self.assertState(process.GetState(), lldb.eStateStopped) |
| thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint) |
| self.assertIsNotNone(thread) |
| bp_id = thread.GetStopReasonDataAtIndex(0) |
| self.assertEqual(bp_id, bp3.GetID()) |
| |
| frame = thread.GetFrameAtIndex(0) |
| self.assertTrue(frame.IsInlined()) |
| self.assertEqual(frame.GetFunctionName(), "test1") |
| |
| thread.StepInto() |
| |
| frame = thread.GetFrameAtIndex(0) |
| self.assertTrue(frame.IsInlined()) |
| self.assertEqual(frame.GetFunctionName(), "test2") |
| |
| self.expect("expression b", DATA_TYPES_DISPLAYED_CORRECTLY, substrs=["24"]) |