1*30fdc8d8SChris Lattner //===-- ThreadPlanBase.cpp --------------------------------------*- C++ -*-===// 2*30fdc8d8SChris Lattner // 3*30fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 4*30fdc8d8SChris Lattner // 5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 7*30fdc8d8SChris Lattner // 8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 9*30fdc8d8SChris Lattner 10*30fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanBase.h" 11*30fdc8d8SChris Lattner 12*30fdc8d8SChris Lattner // C Includes 13*30fdc8d8SChris Lattner // C++ Includes 14*30fdc8d8SChris Lattner // Other libraries and framework includes 15*30fdc8d8SChris Lattner // Project includes 16*30fdc8d8SChris Lattner // 17*30fdc8d8SChris Lattner #include "lldb/Breakpoint/StoppointCallbackContext.h" 18*30fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointSite.h" 19*30fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h" 20*30fdc8d8SChris Lattner #include "lldb/Breakpoint/Breakpoint.h" 21*30fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 22*30fdc8d8SChris Lattner #include "lldb/Target/Process.h" 23*30fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 24*30fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanContinue.h" 25*30fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepOverBreakpoint.h" 26*30fdc8d8SChris Lattner 27*30fdc8d8SChris Lattner using namespace lldb; 28*30fdc8d8SChris Lattner using namespace lldb_private; 29*30fdc8d8SChris Lattner 30*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 31*30fdc8d8SChris Lattner // ThreadPlanBase: This one always stops, and never has anything particular 32*30fdc8d8SChris Lattner // to do. 33*30fdc8d8SChris Lattner // FIXME: The "signal handling" policies should probably go here. 34*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 35*30fdc8d8SChris Lattner 36*30fdc8d8SChris Lattner ThreadPlanBase::ThreadPlanBase (Thread &thread) : 37*30fdc8d8SChris Lattner ThreadPlan("base plan", thread, eVoteYes, eVoteNoOpinion) 38*30fdc8d8SChris Lattner { 39*30fdc8d8SChris Lattner 40*30fdc8d8SChris Lattner } 41*30fdc8d8SChris Lattner 42*30fdc8d8SChris Lattner ThreadPlanBase::~ThreadPlanBase () 43*30fdc8d8SChris Lattner { 44*30fdc8d8SChris Lattner 45*30fdc8d8SChris Lattner } 46*30fdc8d8SChris Lattner 47*30fdc8d8SChris Lattner void 48*30fdc8d8SChris Lattner ThreadPlanBase::GetDescription (Stream *s, lldb::DescriptionLevel level) 49*30fdc8d8SChris Lattner { 50*30fdc8d8SChris Lattner s->Printf ("Base thread plan."); 51*30fdc8d8SChris Lattner } 52*30fdc8d8SChris Lattner 53*30fdc8d8SChris Lattner bool 54*30fdc8d8SChris Lattner ThreadPlanBase::ValidatePlan (Stream *error) 55*30fdc8d8SChris Lattner { 56*30fdc8d8SChris Lattner return true; 57*30fdc8d8SChris Lattner } 58*30fdc8d8SChris Lattner 59*30fdc8d8SChris Lattner bool 60*30fdc8d8SChris Lattner ThreadPlanBase::PlanExplainsStop () 61*30fdc8d8SChris Lattner { 62*30fdc8d8SChris Lattner return true; 63*30fdc8d8SChris Lattner } 64*30fdc8d8SChris Lattner 65*30fdc8d8SChris Lattner bool 66*30fdc8d8SChris Lattner ThreadPlanBase::ShouldStop (Event *event_ptr) 67*30fdc8d8SChris Lattner { 68*30fdc8d8SChris Lattner m_stop_vote = eVoteYes; 69*30fdc8d8SChris Lattner m_run_vote = eVoteYes; 70*30fdc8d8SChris Lattner 71*30fdc8d8SChris Lattner Thread::StopInfo stop_info; 72*30fdc8d8SChris Lattner if (m_thread.GetStopInfo(&stop_info)) 73*30fdc8d8SChris Lattner { 74*30fdc8d8SChris Lattner StopReason reason = stop_info.GetStopReason(); 75*30fdc8d8SChris Lattner switch (reason) 76*30fdc8d8SChris Lattner { 77*30fdc8d8SChris Lattner case eStopReasonInvalid: 78*30fdc8d8SChris Lattner case eStopReasonNone: 79*30fdc8d8SChris Lattner { 80*30fdc8d8SChris Lattner m_run_vote = eVoteNo; 81*30fdc8d8SChris Lattner m_stop_vote = eVoteNo; 82*30fdc8d8SChris Lattner return false; 83*30fdc8d8SChris Lattner } 84*30fdc8d8SChris Lattner case eStopReasonBreakpoint: 85*30fdc8d8SChris Lattner { 86*30fdc8d8SChris Lattner // The base plan checks for breakpoint hits. 87*30fdc8d8SChris Lattner 88*30fdc8d8SChris Lattner BreakpointSiteSP bp_site_sp; 89*30fdc8d8SChris Lattner //RegisterContext *reg_ctx = m_thread.GetRegisterContext(); 90*30fdc8d8SChris Lattner //lldb::addr_t pc = reg_ctx->GetPC(); 91*30fdc8d8SChris Lattner bp_site_sp = m_thread.GetProcess().GetBreakpointSiteList().FindByID (stop_info.GetBreakpointSiteID()); 92*30fdc8d8SChris Lattner 93*30fdc8d8SChris Lattner if (bp_site_sp && bp_site_sp->IsEnabled()) 94*30fdc8d8SChris Lattner { 95*30fdc8d8SChris Lattner // We want to step over the breakpoint and then continue. So push these two plans. 96*30fdc8d8SChris Lattner 97*30fdc8d8SChris Lattner StoppointCallbackContext hit_context(event_ptr, &m_thread.GetProcess(), &m_thread, m_thread.GetStackFrameAtIndex(0).get()); 98*30fdc8d8SChris Lattner bool should_stop = m_thread.GetProcess().GetBreakpointSiteList().ShouldStop(&hit_context, bp_site_sp->GetID()); 99*30fdc8d8SChris Lattner 100*30fdc8d8SChris Lattner if (!should_stop) 101*30fdc8d8SChris Lattner { 102*30fdc8d8SChris Lattner // If we aren't going to stop at this breakpoint, and it is internal, don't report this stop or the subsequent 103*30fdc8d8SChris Lattner // running event. Otherwise we will post the stopped & running, but the stopped event will get marked 104*30fdc8d8SChris Lattner // with "restarted" so the UI will know to wait and expect the consequent "running". 105*30fdc8d8SChris Lattner uint32_t i; 106*30fdc8d8SChris Lattner bool is_wholly_internal = true; 107*30fdc8d8SChris Lattner 108*30fdc8d8SChris Lattner for (i = 0; i < bp_site_sp->GetNumberOfOwners(); i++) 109*30fdc8d8SChris Lattner { 110*30fdc8d8SChris Lattner if (!bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint().IsInternal()) 111*30fdc8d8SChris Lattner { 112*30fdc8d8SChris Lattner is_wholly_internal = false; 113*30fdc8d8SChris Lattner break; 114*30fdc8d8SChris Lattner } 115*30fdc8d8SChris Lattner } 116*30fdc8d8SChris Lattner if (is_wholly_internal) 117*30fdc8d8SChris Lattner { 118*30fdc8d8SChris Lattner m_stop_vote = eVoteNo; 119*30fdc8d8SChris Lattner m_run_vote = eVoteNo; 120*30fdc8d8SChris Lattner } 121*30fdc8d8SChris Lattner else 122*30fdc8d8SChris Lattner { 123*30fdc8d8SChris Lattner m_stop_vote = eVoteYes; 124*30fdc8d8SChris Lattner m_run_vote = eVoteYes; 125*30fdc8d8SChris Lattner } 126*30fdc8d8SChris Lattner 127*30fdc8d8SChris Lattner } 128*30fdc8d8SChris Lattner else 129*30fdc8d8SChris Lattner { 130*30fdc8d8SChris Lattner // If we are going to stop for a breakpoint, then unship the other plans 131*30fdc8d8SChris Lattner // at this point. Don't force the discard, however, so Master plans can stay 132*30fdc8d8SChris Lattner // in place if they want to. 133*30fdc8d8SChris Lattner m_thread.DiscardThreadPlans(false); 134*30fdc8d8SChris Lattner } 135*30fdc8d8SChris Lattner 136*30fdc8d8SChris Lattner return should_stop; 137*30fdc8d8SChris Lattner } 138*30fdc8d8SChris Lattner } 139*30fdc8d8SChris Lattner case eStopReasonException: 140*30fdc8d8SChris Lattner // If we crashed, discard thread plans and stop. Don't force the discard, however, 141*30fdc8d8SChris Lattner // since on rerun the target may clean up this exception and continue normally from there. 142*30fdc8d8SChris Lattner m_thread.DiscardThreadPlans(false); 143*30fdc8d8SChris Lattner return true; 144*30fdc8d8SChris Lattner case eStopReasonSignal: 145*30fdc8d8SChris Lattner { 146*30fdc8d8SChris Lattner // Check the signal handling, and if we are stopping for the signal, 147*30fdc8d8SChris Lattner // discard the plans and stop. 148*30fdc8d8SChris Lattner UnixSignals &signals = m_thread.GetProcess().GetUnixSignals(); 149*30fdc8d8SChris Lattner uint32_t signo = stop_info.GetSignal(); 150*30fdc8d8SChris Lattner if (signals.GetShouldStop(signo)) 151*30fdc8d8SChris Lattner { 152*30fdc8d8SChris Lattner m_thread.DiscardThreadPlans(false); 153*30fdc8d8SChris Lattner return true; 154*30fdc8d8SChris Lattner } 155*30fdc8d8SChris Lattner else 156*30fdc8d8SChris Lattner { 157*30fdc8d8SChris Lattner // We're not going to stop, but while we are here, let's figure out 158*30fdc8d8SChris Lattner // whether to report this. 159*30fdc8d8SChris Lattner if (signals.GetShouldNotify(signo)) 160*30fdc8d8SChris Lattner m_stop_vote = eVoteYes; 161*30fdc8d8SChris Lattner else 162*30fdc8d8SChris Lattner m_stop_vote = eVoteNo; 163*30fdc8d8SChris Lattner 164*30fdc8d8SChris Lattner return false; 165*30fdc8d8SChris Lattner } 166*30fdc8d8SChris Lattner } 167*30fdc8d8SChris Lattner default: 168*30fdc8d8SChris Lattner return true; 169*30fdc8d8SChris Lattner } 170*30fdc8d8SChris Lattner 171*30fdc8d8SChris Lattner } 172*30fdc8d8SChris Lattner 173*30fdc8d8SChris Lattner // If there's no explicit reason to stop, then we will continue. 174*30fdc8d8SChris Lattner return false; 175*30fdc8d8SChris Lattner } 176*30fdc8d8SChris Lattner 177*30fdc8d8SChris Lattner bool 178*30fdc8d8SChris Lattner ThreadPlanBase::StopOthers () 179*30fdc8d8SChris Lattner { 180*30fdc8d8SChris Lattner return false; 181*30fdc8d8SChris Lattner } 182*30fdc8d8SChris Lattner 183*30fdc8d8SChris Lattner StateType 184*30fdc8d8SChris Lattner ThreadPlanBase::RunState () 185*30fdc8d8SChris Lattner { 186*30fdc8d8SChris Lattner return eStateRunning; 187*30fdc8d8SChris Lattner } 188*30fdc8d8SChris Lattner 189*30fdc8d8SChris Lattner bool 190*30fdc8d8SChris Lattner ThreadPlanBase::WillStop () 191*30fdc8d8SChris Lattner { 192*30fdc8d8SChris Lattner return true; 193*30fdc8d8SChris Lattner } 194*30fdc8d8SChris Lattner 195*30fdc8d8SChris Lattner // The base plan is never done. 196*30fdc8d8SChris Lattner bool 197*30fdc8d8SChris Lattner ThreadPlanBase::MischiefManaged () 198*30fdc8d8SChris Lattner { 199*30fdc8d8SChris Lattner // The base plan is never done. 200*30fdc8d8SChris Lattner return false; 201*30fdc8d8SChris Lattner } 202*30fdc8d8SChris Lattner 203