Author: jingham Date: Mon Mar 17 18:03:34 2014 New Revision: 204087 URL: http://llvm.org/viewvc/llvm-project?rev=204087&view=rev Log: Get "ThreadPlanShouldStopHere" to handle auto-stepping through line number 0 code.
Modified: lldb/trunk/source/Target/ThreadPlanShouldStopHere.cpp Modified: lldb/trunk/source/Target/ThreadPlanShouldStopHere.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ThreadPlanShouldStopHere.cpp?rev=204087&r1=204086&r2=204087&view=diff ============================================================================== --- lldb/trunk/source/Target/ThreadPlanShouldStopHere.cpp (original) +++ lldb/trunk/source/Target/ThreadPlanShouldStopHere.cpp Mon Mar 17 18:03:34 2014 @@ -76,6 +76,9 @@ ThreadPlanShouldStopHere::DefaultShouldS { bool should_stop_here = true; StackFrame *frame = current_plan->GetThread().GetStackFrameAtIndex(0).get(); + if (!frame) + return true; + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); if ((operation == eFrameCompareOlder && flags.Test(eStepOutAvoidNoDebug)) @@ -90,6 +93,17 @@ ThreadPlanShouldStopHere::DefaultShouldS } } + // Always avoid code with line number 0. + // FIXME: At present the ShouldStop and the StepFromHere calculate this independently. If this ever + // becomes expensive (this one isn't) we can try to have this set a state that the StepFromHere can use. + if (frame) + { + SymbolContext sc; + sc = frame->GetSymbolContext (eSymbolContextLineEntry); + if (sc.line_entry.line == 0) + should_stop_here = false; + } + return should_stop_here; } @@ -99,16 +113,35 @@ ThreadPlanShouldStopHere::DefaultStepFro FrameComparison operation, void *baton) { - const bool stop_others = false; - const size_t frame_index = 0; - ThreadPlanSP return_plan_sp = current_plan->GetThread().QueueThreadPlanForStepOutNoShouldStop (false, - NULL, - true, - stop_others, - eVoteNo, - eVoteNoOpinion, - frame_index); + const bool stop_others = false; + const size_t frame_index = 0; + ThreadPlanSP return_plan_sp; + // If we are stepping through code at line number 0, then we need to step over this range. Otherwise + // we will step out. + StackFrame *frame = current_plan->GetThread().GetStackFrameAtIndex(0).get(); + if (!frame) return return_plan_sp; + SymbolContext sc; + sc = frame->GetSymbolContext (eSymbolContextLineEntry); + if (sc.line_entry.line == 0) + { + AddressRange range = sc.line_entry.range; + return_plan_sp = current_plan->GetThread().QueueThreadPlanForStepOverRange(false, + range, + sc, + eOnlyDuringStepping, + eLazyBoolNo); + } + + if (!return_plan_sp) + return_plan_sp = current_plan->GetThread().QueueThreadPlanForStepOutNoShouldStop (false, + NULL, + true, + stop_others, + eVoteNo, + eVoteNoOpinion, + frame_index); + return return_plan_sp; } ThreadPlanSP _______________________________________________ lldb-commits mailing list lldb-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits