diff --git a/lldb/source/Target/ThreadPlanStepInRange.cpp b/lldb/source/Target/ThreadPlanStepInRange.cpp index 325a70619908b..224a17d896ccf 100644 --- a/lldb/source/Target/ThreadPlanStepInRange.cpp +++ b/lldb/source/Target/ThreadPlanStepInRange.cpp @@ -489,7 +489,8 @@ bool ThreadPlanStepInRange::DoWillResume(lldb::StateType resume_state, bool ThreadPlanStepInRange::IsVirtualStep() { if (m_virtual_step == eLazyBoolCalculate) { Thread &thread = GetThread(); - if (thread.GetCurrentInlinedDepth() == UINT32_MAX) + uint32_t cur_inline_depth = thread.GetCurrentInlinedDepth(); + if (cur_inline_depth == UINT32_MAX || cur_inline_depth == 0) m_virtual_step = eLazyBoolNo; else m_virtual_step = eLazyBoolYes; diff --git a/lldb/test/API/functionalities/inline-stepping/TestInlineStepping.py b/lldb/test/API/functionalities/inline-stepping/TestInlineStepping.py index f52e0f0fd5bcf..5997ffd38a2d0 100644 --- a/lldb/test/API/functionalities/inline-stepping/TestInlineStepping.py +++ b/lldb/test/API/functionalities/inline-stepping/TestInlineStepping.py @@ -14,6 +14,8 @@ class TestInlineStepping(TestBase): compiler="icc", bugnumber="# Not really a bug. ICC combines two inlined functions.", ) + + @skipIf(oslist=["ubuntu"], archs=["arm"]) # Fails for 32 bit arm def test_with_python_api(self): """Test stepping over and into inlined functions.""" self.build() @@ -364,7 +366,7 @@ def step_in_template(self): step_sequence = [["// In max_value specialized", "into"]] self.run_step_sequence(step_sequence) - def run_to_call_site_and_step(self, source_regex, func_name, start_pos): + def run_to_call_site_and_step(self, source_regex, func_name, start_pos, one_more_step_loc = None): main_spec = lldb.SBFileSpec("calling.cpp") # Set the breakpoint by file and line, not sourced regex because # we want to make sure we can set breakpoints on call sites: @@ -408,6 +410,11 @@ def run_to_call_site_and_step(self, source_regex, func_name, start_pos): # stepping for this function... break + if one_more_step_loc: + thread.StepInto() + frame_0 = thread.frame[0] + self.assertEqual(frame_0.line_entry.line, line_number(self.main_source, one_more_step_loc), + "Was able to step one more time") process.Kill() target.Clear() @@ -420,3 +427,7 @@ def virtual_inline_stepping(self): self.run_to_call_site_and_step( "In caller_trivial_inline_2", "caller_trivial_inline_2", 3 ) + self.run_to_call_site_and_step( + "In caller_trivial_inline_3", "caller_trivial_inline_3", 4, "After caller_trivial_inline_3" + ) + diff --git a/lldb/test/API/functionalities/inline-stepping/calling.cpp b/lldb/test/API/functionalities/inline-stepping/calling.cpp index d7ee56b3c0790..7ed88a872c4eb 100644 --- a/lldb/test/API/functionalities/inline-stepping/calling.cpp +++ b/lldb/test/API/functionalities/inline-stepping/calling.cpp @@ -95,7 +95,7 @@ void caller_trivial_inline_1() { void caller_trivial_inline_2() { caller_trivial_inline_3(); // In caller_trivial_inline_2. - inline_value += 1; + inline_value += 1; // After caller_trivial_inline_3 } void caller_trivial_inline_3() {