130fdc8d8SChris Lattner //===-- ThreadPlanBase.cpp --------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 1030fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanBase.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner // C Includes 1330fdc8d8SChris Lattner // C++ Includes 1430fdc8d8SChris Lattner // Other libraries and framework includes 1530fdc8d8SChris Lattner // Project includes 1630fdc8d8SChris Lattner // 1730fdc8d8SChris Lattner #include "lldb/Breakpoint/StoppointCallbackContext.h" 1830fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointSite.h" 1930fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h" 2030fdc8d8SChris Lattner #include "lldb/Breakpoint/Breakpoint.h" 2130fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2230fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 2430fdc8d8SChris Lattner 2530fdc8d8SChris Lattner using namespace lldb; 2630fdc8d8SChris Lattner using namespace lldb_private; 2730fdc8d8SChris Lattner 2830fdc8d8SChris Lattner //---------------------------------------------------------------------- 2930fdc8d8SChris Lattner // ThreadPlanBase: This one always stops, and never has anything particular 3030fdc8d8SChris Lattner // to do. 3130fdc8d8SChris Lattner // FIXME: The "signal handling" policies should probably go here. 3230fdc8d8SChris Lattner //---------------------------------------------------------------------- 3330fdc8d8SChris Lattner 3430fdc8d8SChris Lattner ThreadPlanBase::ThreadPlanBase (Thread &thread) : 35*b01e742aSJim Ingham ThreadPlan(ThreadPlan::eKindBase, "base plan", thread, eVoteYes, eVoteNoOpinion) 3630fdc8d8SChris Lattner { 3730fdc8d8SChris Lattner 3830fdc8d8SChris Lattner } 3930fdc8d8SChris Lattner 4030fdc8d8SChris Lattner ThreadPlanBase::~ThreadPlanBase () 4130fdc8d8SChris Lattner { 4230fdc8d8SChris Lattner 4330fdc8d8SChris Lattner } 4430fdc8d8SChris Lattner 4530fdc8d8SChris Lattner void 4630fdc8d8SChris Lattner ThreadPlanBase::GetDescription (Stream *s, lldb::DescriptionLevel level) 4730fdc8d8SChris Lattner { 4830fdc8d8SChris Lattner s->Printf ("Base thread plan."); 4930fdc8d8SChris Lattner } 5030fdc8d8SChris Lattner 5130fdc8d8SChris Lattner bool 5230fdc8d8SChris Lattner ThreadPlanBase::ValidatePlan (Stream *error) 5330fdc8d8SChris Lattner { 5430fdc8d8SChris Lattner return true; 5530fdc8d8SChris Lattner } 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner bool 5830fdc8d8SChris Lattner ThreadPlanBase::PlanExplainsStop () 5930fdc8d8SChris Lattner { 6030fdc8d8SChris Lattner return true; 6130fdc8d8SChris Lattner } 6230fdc8d8SChris Lattner 6330fdc8d8SChris Lattner bool 6430fdc8d8SChris Lattner ThreadPlanBase::ShouldStop (Event *event_ptr) 6530fdc8d8SChris Lattner { 6630fdc8d8SChris Lattner m_stop_vote = eVoteYes; 6730fdc8d8SChris Lattner m_run_vote = eVoteYes; 6830fdc8d8SChris Lattner 6930fdc8d8SChris Lattner Thread::StopInfo stop_info; 7030fdc8d8SChris Lattner if (m_thread.GetStopInfo(&stop_info)) 7130fdc8d8SChris Lattner { 7230fdc8d8SChris Lattner StopReason reason = stop_info.GetStopReason(); 7330fdc8d8SChris Lattner switch (reason) 7430fdc8d8SChris Lattner { 7530fdc8d8SChris Lattner case eStopReasonInvalid: 7630fdc8d8SChris Lattner case eStopReasonNone: 7730fdc8d8SChris Lattner { 7830fdc8d8SChris Lattner m_run_vote = eVoteNo; 7930fdc8d8SChris Lattner m_stop_vote = eVoteNo; 8030fdc8d8SChris Lattner return false; 8130fdc8d8SChris Lattner } 8230fdc8d8SChris Lattner case eStopReasonBreakpoint: 8330fdc8d8SChris Lattner { 8430fdc8d8SChris Lattner // The base plan checks for breakpoint hits. 8530fdc8d8SChris Lattner 8630fdc8d8SChris Lattner BreakpointSiteSP bp_site_sp; 8730fdc8d8SChris Lattner //RegisterContext *reg_ctx = m_thread.GetRegisterContext(); 8830fdc8d8SChris Lattner //lldb::addr_t pc = reg_ctx->GetPC(); 8930fdc8d8SChris Lattner bp_site_sp = m_thread.GetProcess().GetBreakpointSiteList().FindByID (stop_info.GetBreakpointSiteID()); 9030fdc8d8SChris Lattner 9130fdc8d8SChris Lattner if (bp_site_sp && bp_site_sp->IsEnabled()) 9230fdc8d8SChris Lattner { 9330fdc8d8SChris Lattner // We want to step over the breakpoint and then continue. So push these two plans. 9430fdc8d8SChris Lattner 95*b01e742aSJim Ingham StoppointCallbackContext hit_context(event_ptr, &m_thread.GetProcess(), &m_thread, 96*b01e742aSJim Ingham m_thread.GetStackFrameAtIndex(0).get()); 97*b01e742aSJim Ingham bool should_stop = m_thread.GetProcess().GetBreakpointSiteList().ShouldStop(&hit_context, 98*b01e742aSJim Ingham bp_site_sp->GetID()); 9930fdc8d8SChris Lattner 10030fdc8d8SChris Lattner if (!should_stop) 10130fdc8d8SChris Lattner { 102*b01e742aSJim Ingham // If we aren't going to stop at this breakpoint, and it is internal, 103*b01e742aSJim Ingham // don't report this stop or the subsequent running event. 104*b01e742aSJim Ingham // Otherwise we will post the stopped & running, but the stopped event will get marked 10530fdc8d8SChris Lattner // with "restarted" so the UI will know to wait and expect the consequent "running". 10630fdc8d8SChris Lattner uint32_t i; 10730fdc8d8SChris Lattner bool is_wholly_internal = true; 10830fdc8d8SChris Lattner 10930fdc8d8SChris Lattner for (i = 0; i < bp_site_sp->GetNumberOfOwners(); i++) 11030fdc8d8SChris Lattner { 11130fdc8d8SChris Lattner if (!bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint().IsInternal()) 11230fdc8d8SChris Lattner { 11330fdc8d8SChris Lattner is_wholly_internal = false; 11430fdc8d8SChris Lattner break; 11530fdc8d8SChris Lattner } 11630fdc8d8SChris Lattner } 11730fdc8d8SChris Lattner if (is_wholly_internal) 11830fdc8d8SChris Lattner { 11930fdc8d8SChris Lattner m_stop_vote = eVoteNo; 12030fdc8d8SChris Lattner m_run_vote = eVoteNo; 12130fdc8d8SChris Lattner } 12230fdc8d8SChris Lattner else 12330fdc8d8SChris Lattner { 12430fdc8d8SChris Lattner m_stop_vote = eVoteYes; 12530fdc8d8SChris Lattner m_run_vote = eVoteYes; 12630fdc8d8SChris Lattner } 12730fdc8d8SChris Lattner 12830fdc8d8SChris Lattner } 12930fdc8d8SChris Lattner else 13030fdc8d8SChris Lattner { 13130fdc8d8SChris Lattner // If we are going to stop for a breakpoint, then unship the other plans 13230fdc8d8SChris Lattner // at this point. Don't force the discard, however, so Master plans can stay 13330fdc8d8SChris Lattner // in place if they want to. 13430fdc8d8SChris Lattner m_thread.DiscardThreadPlans(false); 13530fdc8d8SChris Lattner } 13630fdc8d8SChris Lattner 13730fdc8d8SChris Lattner return should_stop; 13830fdc8d8SChris Lattner } 13930fdc8d8SChris Lattner } 14030fdc8d8SChris Lattner case eStopReasonException: 14130fdc8d8SChris Lattner // If we crashed, discard thread plans and stop. Don't force the discard, however, 14230fdc8d8SChris Lattner // since on rerun the target may clean up this exception and continue normally from there. 14330fdc8d8SChris Lattner m_thread.DiscardThreadPlans(false); 14430fdc8d8SChris Lattner return true; 14530fdc8d8SChris Lattner case eStopReasonSignal: 14630fdc8d8SChris Lattner { 14730fdc8d8SChris Lattner // Check the signal handling, and if we are stopping for the signal, 14830fdc8d8SChris Lattner // discard the plans and stop. 14930fdc8d8SChris Lattner UnixSignals &signals = m_thread.GetProcess().GetUnixSignals(); 15030fdc8d8SChris Lattner uint32_t signo = stop_info.GetSignal(); 15130fdc8d8SChris Lattner if (signals.GetShouldStop(signo)) 15230fdc8d8SChris Lattner { 15330fdc8d8SChris Lattner m_thread.DiscardThreadPlans(false); 15430fdc8d8SChris Lattner return true; 15530fdc8d8SChris Lattner } 15630fdc8d8SChris Lattner else 15730fdc8d8SChris Lattner { 15830fdc8d8SChris Lattner // We're not going to stop, but while we are here, let's figure out 15930fdc8d8SChris Lattner // whether to report this. 16030fdc8d8SChris Lattner if (signals.GetShouldNotify(signo)) 16130fdc8d8SChris Lattner m_stop_vote = eVoteYes; 16230fdc8d8SChris Lattner else 16330fdc8d8SChris Lattner m_stop_vote = eVoteNo; 16430fdc8d8SChris Lattner 16530fdc8d8SChris Lattner return false; 16630fdc8d8SChris Lattner } 16730fdc8d8SChris Lattner } 16830fdc8d8SChris Lattner default: 16930fdc8d8SChris Lattner return true; 17030fdc8d8SChris Lattner } 17130fdc8d8SChris Lattner 17230fdc8d8SChris Lattner } 17330fdc8d8SChris Lattner 17430fdc8d8SChris Lattner // If there's no explicit reason to stop, then we will continue. 17530fdc8d8SChris Lattner return false; 17630fdc8d8SChris Lattner } 17730fdc8d8SChris Lattner 17830fdc8d8SChris Lattner bool 17930fdc8d8SChris Lattner ThreadPlanBase::StopOthers () 18030fdc8d8SChris Lattner { 18130fdc8d8SChris Lattner return false; 18230fdc8d8SChris Lattner } 18330fdc8d8SChris Lattner 18430fdc8d8SChris Lattner StateType 18530fdc8d8SChris Lattner ThreadPlanBase::RunState () 18630fdc8d8SChris Lattner { 18730fdc8d8SChris Lattner return eStateRunning; 18830fdc8d8SChris Lattner } 18930fdc8d8SChris Lattner 19030fdc8d8SChris Lattner bool 19130fdc8d8SChris Lattner ThreadPlanBase::WillStop () 19230fdc8d8SChris Lattner { 19330fdc8d8SChris Lattner return true; 19430fdc8d8SChris Lattner } 19530fdc8d8SChris Lattner 19630fdc8d8SChris Lattner // The base plan is never done. 19730fdc8d8SChris Lattner bool 19830fdc8d8SChris Lattner ThreadPlanBase::MischiefManaged () 19930fdc8d8SChris Lattner { 20030fdc8d8SChris Lattner // The base plan is never done. 20130fdc8d8SChris Lattner return false; 20230fdc8d8SChris Lattner } 20330fdc8d8SChris Lattner 204