Skip to content

Commit

Permalink
Fix stepping away from the bottom-most frame of a virtual inlined cal…
Browse files Browse the repository at this point in the history
…l stack. (llvm#114337)

The computation of 'Thread::IsVirtualStep" was wrong - it called being
at the bottom of a virtual call stack a "virtual step" but that is
actually when you've gotten to concrete code and need to step for real.

I also added a test for this.
  • Loading branch information
jimingham authored Oct 31, 2024
1 parent e99c490 commit 3243e3d
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 3 deletions.
3 changes: 2 additions & 1 deletion lldb/source/Target/ThreadPlanStepInRange.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,9 @@ 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:
Expand Down Expand Up @@ -408,6 +410,14 @@ 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()

Expand All @@ -420,3 +430,9 @@ 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",
)
2 changes: 1 addition & 1 deletion lldb/test/API/functionalities/inline-stepping/calling.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down

0 comments on commit 3243e3d

Please sign in to comment.