From 40d871fa245b288b7933c03df4c3605a418827a9 Mon Sep 17 00:00:00 2001 From: Jim Ingham Date: Tue, 26 Oct 2010 00:27:45 +0000 Subject: [PATCH] The call function thread plan should allow internal breakpoints to continue on. Also made stopping in mid-expression evaluation when we hit a breakpoint/signal work. llvm-svn: 117341 --- lldb/include/lldb/Target/StopInfo.h | 8 ++++ lldb/source/Target/ThreadPlanCallFunction.cpp | 43 ++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/lldb/include/lldb/Target/StopInfo.h b/lldb/include/lldb/Target/StopInfo.h index 080aaa370119..2eecb9edd214 100644 --- a/lldb/include/lldb/Target/StopInfo.h +++ b/lldb/include/lldb/Target/StopInfo.h @@ -46,6 +46,14 @@ public: return m_thread; } + // The value of the StopInfo depends on the StopReason. + // StopReason Meaning + // ---------------------------------------------- + // eStopReasonBreakpoint BreakpointSiteID + // eStopReasonSignal Signal number + // eStopReasonWatchpoint WatchpointSiteID + // eStopReasonPlanComplete No significance + uint64_t GetValue() const { diff --git a/lldb/source/Target/ThreadPlanCallFunction.cpp b/lldb/source/Target/ThreadPlanCallFunction.cpp index 6b606d4565a3..2f5f7cca1cd7 100644 --- a/lldb/source/Target/ThreadPlanCallFunction.cpp +++ b/lldb/source/Target/ThreadPlanCallFunction.cpp @@ -14,11 +14,14 @@ // Other libraries and framework includes // Project includes #include "lldb/lldb-private-log.h" +#include "lldb/Breakpoint/Breakpoint.h" +#include "lldb/Breakpoint/BreakpointLocation.h" #include "lldb/Core/Address.h" #include "lldb/Core/Log.h" #include "lldb/Core/Stream.h" #include "lldb/Target/Process.h" #include "lldb/Target/RegisterContext.h" +#include "lldb/Target/StopInfo.h" #include "lldb/Target/Target.h" #include "lldb/Target/Thread.h" #include "lldb/Target/ThreadPlanRunToAddress.h" @@ -171,9 +174,45 @@ ThreadPlanCallFunction::ValidatePlan (Stream *error) bool ThreadPlanCallFunction::PlanExplainsStop () { - // If the subplan is running, any crashes are attributable to us. + // If our subplan knows why we stopped, even if it's done (which would forward the question to us) + // we answer yes. + if(m_subplan_sp.get() != NULL && m_subplan_sp->PlanExplainsStop()) + return true; - return (m_subplan_sp.get() != NULL); + // If we don't want to discard this plan, than any stop we don't understand should be propagated up the stack. + if (!OkayToDiscard()) + return false; + + // Otherwise, check the case where we stopped for an internal breakpoint, in that case, continue on. + // If it is not an internal breakpoint, consult OkayToDiscard. + lldb::StopInfoSP stop_info_sp = GetPrivateStopReason(); + if (stop_info_sp && stop_info_sp->GetStopReason() == eStopReasonBreakpoint) + { + uint64_t break_site_id = stop_info_sp->GetValue(); + lldb::BreakpointSiteSP bp_site_sp = m_thread.GetProcess().GetBreakpointSiteList().FindByID(break_site_id); + if (bp_site_sp) + { + uint32_t num_owners = bp_site_sp->GetNumberOfOwners(); + bool is_internal = true; + for (uint32_t i = 0; i < num_owners; i++) + { + if (!bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint().IsInternal()) + { + is_internal = false; + break; + } + } + if (is_internal) + return false; + } + + return OkayToDiscard(); + } + else + { + // If the subplan is running, any crashes are attributable to us. + return (m_subplan_sp.get() != NULL); + } } bool