diff options
| author | Jim Ingham <jingham@apple.com> | 2012-03-01 00:50:50 +0000 |
|---|---|---|
| committer | Jim Ingham <jingham@apple.com> | 2012-03-01 00:50:50 +0000 |
| commit | b5c0d1ccbd7e42ea6f26767436d1dc33bee1989f (patch) | |
| tree | 023318a13237bc54ad058d61cad776e34ea39a66 /lldb/source/Target/ThreadPlanStepOverRange.cpp | |
| parent | 76e66c31a0481e72d1ff86c56028d850b6c33cff (diff) | |
| download | bcm5719-llvm-b5c0d1ccbd7e42ea6f26767436d1dc33bee1989f.tar.gz bcm5719-llvm-b5c0d1ccbd7e42ea6f26767436d1dc33bee1989f.zip | |
Convert the thread plans over from using the stack count to do their logic to using StackID's. This
should be more efficient.
llvm-svn: 151780
Diffstat (limited to 'lldb/source/Target/ThreadPlanStepOverRange.cpp')
| -rw-r--r-- | lldb/source/Target/ThreadPlanStepOverRange.cpp | 39 |
1 files changed, 29 insertions, 10 deletions
diff --git a/lldb/source/Target/ThreadPlanStepOverRange.cpp b/lldb/source/Target/ThreadPlanStepOverRange.cpp index 9687c65785b..8b4907f863f 100644 --- a/lldb/source/Target/ThreadPlanStepOverRange.cpp +++ b/lldb/source/Target/ThreadPlanStepOverRange.cpp @@ -114,8 +114,10 @@ ThreadPlanStepOverRange::ShouldStop (Event *event_ptr) stop_others = false; ThreadPlan* new_plan = NULL; - - if (FrameIsOlder()) + + FrameComparison frame_order = CompareCurrentFrameToStartFrame(); + + if (frame_order == eFrameCompareOlder) { // If we're in an older frame then we should stop. // @@ -129,15 +131,32 @@ ThreadPlanStepOverRange::ShouldStop (Event *event_ptr) if (new_plan != NULL && log) log->Printf("Thought I stepped out, but in fact arrived at a trampoline."); } - else if (FrameIsYounger()) + else if (frame_order == eFrameCompareYounger) { - new_plan = m_thread.QueueThreadPlanForStepOut (false, - NULL, - true, - stop_others, - eVoteNo, - eVoteNoOpinion, - 0); + // Make sure we really are in a new frame. Do that by unwinding and seeing if the + // start function really is our start function... + StackFrameSP older_frame_sp = m_thread.GetStackFrameAtIndex(1); + + // But if we can't even unwind one frame we should just get out of here & stop... + if (older_frame_sp) + { + const SymbolContext &older_context = older_frame_sp->GetSymbolContext(eSymbolContextEverything); + if (older_context == m_addr_context) + { + new_plan = m_thread.QueueThreadPlanForStepOut (false, + NULL, + true, + stop_others, + eVoteNo, + eVoteNoOpinion, + 0); + } + else + { + new_plan = m_thread.QueueThreadPlanForStepThrough (false, stop_others); + + } + } } else if (!InSymbol()) { |

