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" 24f4b47e15SGreg Clayton #include "lldb/Target/StopInfo.h" 2530fdc8d8SChris Lattner 2630fdc8d8SChris Lattner using namespace lldb; 2730fdc8d8SChris Lattner using namespace lldb_private; 2830fdc8d8SChris Lattner 2930fdc8d8SChris Lattner //---------------------------------------------------------------------- 3030fdc8d8SChris Lattner // ThreadPlanBase: This one always stops, and never has anything particular 3130fdc8d8SChris Lattner // to do. 3230fdc8d8SChris Lattner // FIXME: The "signal handling" policies should probably go here. 3330fdc8d8SChris Lattner //---------------------------------------------------------------------- 3430fdc8d8SChris Lattner 3530fdc8d8SChris Lattner ThreadPlanBase::ThreadPlanBase (Thread &thread) : 36b01e742aSJim Ingham ThreadPlan(ThreadPlan::eKindBase, "base plan", thread, eVoteYes, eVoteNoOpinion) 3730fdc8d8SChris Lattner { 38*06e827ccSJim Ingham // Set the tracer to a default tracer. 39*06e827ccSJim Ingham ThreadPlanTracerSP new_tracer_sp (new ThreadPlanTracer (m_thread)); 40*06e827ccSJim Ingham new_tracer_sp->EnableTracing (m_thread.GetTraceEnabledState()); 41*06e827ccSJim Ingham SetThreadPlanTracer(new_tracer_sp); 4230fdc8d8SChris Lattner } 4330fdc8d8SChris Lattner 4430fdc8d8SChris Lattner ThreadPlanBase::~ThreadPlanBase () 4530fdc8d8SChris Lattner { 4630fdc8d8SChris Lattner 4730fdc8d8SChris Lattner } 4830fdc8d8SChris Lattner 4930fdc8d8SChris Lattner void 5030fdc8d8SChris Lattner ThreadPlanBase::GetDescription (Stream *s, lldb::DescriptionLevel level) 5130fdc8d8SChris Lattner { 5230fdc8d8SChris Lattner s->Printf ("Base thread plan."); 5330fdc8d8SChris Lattner } 5430fdc8d8SChris Lattner 5530fdc8d8SChris Lattner bool 5630fdc8d8SChris Lattner ThreadPlanBase::ValidatePlan (Stream *error) 5730fdc8d8SChris Lattner { 5830fdc8d8SChris Lattner return true; 5930fdc8d8SChris Lattner } 6030fdc8d8SChris Lattner 6130fdc8d8SChris Lattner bool 6230fdc8d8SChris Lattner ThreadPlanBase::PlanExplainsStop () 6330fdc8d8SChris Lattner { 64*06e827ccSJim Ingham // The base plan should defer to its tracer, since by default it 65*06e827ccSJim Ingham // always handles the stop. 66*06e827ccSJim Ingham if (TracerExplainsStop()) 67*06e827ccSJim Ingham return false; 68*06e827ccSJim Ingham else 6930fdc8d8SChris Lattner return true; 7030fdc8d8SChris Lattner } 7130fdc8d8SChris Lattner 7230fdc8d8SChris Lattner bool 7330fdc8d8SChris Lattner ThreadPlanBase::ShouldStop (Event *event_ptr) 7430fdc8d8SChris Lattner { 7530fdc8d8SChris Lattner m_stop_vote = eVoteYes; 7630fdc8d8SChris Lattner m_run_vote = eVoteYes; 7730fdc8d8SChris Lattner 78b15bfc75SJim Ingham StopInfoSP stop_info_sp = GetPrivateStopReason(); 79b15bfc75SJim Ingham if (stop_info_sp) 8030fdc8d8SChris Lattner { 81b15bfc75SJim Ingham StopReason reason = stop_info_sp->GetStopReason(); 8230fdc8d8SChris Lattner switch (reason) 8330fdc8d8SChris Lattner { 8430fdc8d8SChris Lattner case eStopReasonInvalid: 8530fdc8d8SChris Lattner case eStopReasonNone: 8630fdc8d8SChris Lattner m_run_vote = eVoteNo; 8730fdc8d8SChris Lattner m_stop_vote = eVoteNo; 8830fdc8d8SChris Lattner return false; 89f4b47e15SGreg Clayton 9030fdc8d8SChris Lattner case eStopReasonBreakpoint: 91b15bfc75SJim Ingham if (stop_info_sp->ShouldStop(event_ptr)) 9230fdc8d8SChris Lattner { 9330fdc8d8SChris Lattner // If we are going to stop for a breakpoint, then unship the other plans 9430fdc8d8SChris Lattner // at this point. Don't force the discard, however, so Master plans can stay 9530fdc8d8SChris Lattner // in place if they want to. 9630fdc8d8SChris Lattner m_thread.DiscardThreadPlans(false); 97f4b47e15SGreg Clayton return true; 9830fdc8d8SChris Lattner } 99f4b47e15SGreg Clayton // If we aren't going to stop at this breakpoint, and it is internal, 100f4b47e15SGreg Clayton // don't report this stop or the subsequent running event. 101f4b47e15SGreg Clayton // Otherwise we will post the stopped & running, but the stopped event will get marked 102f4b47e15SGreg Clayton // with "restarted" so the UI will know to wait and expect the consequent "running". 103b15bfc75SJim Ingham if (stop_info_sp->ShouldNotify (event_ptr)) 104f4b47e15SGreg Clayton { 105f4b47e15SGreg Clayton m_stop_vote = eVoteYes; 106f4b47e15SGreg Clayton m_run_vote = eVoteYes; 107f4b47e15SGreg Clayton } 108f4b47e15SGreg Clayton else 109f4b47e15SGreg Clayton { 110f4b47e15SGreg Clayton m_stop_vote = eVoteNo; 111f4b47e15SGreg Clayton m_run_vote = eVoteNo; 112f4b47e15SGreg Clayton } 113f4b47e15SGreg Clayton return false; 11430fdc8d8SChris Lattner 115f4b47e15SGreg Clayton // TODO: the break below was missing, was this intentional??? If so 116f4b47e15SGreg Clayton // please mention it 117f4b47e15SGreg Clayton break; 118f4b47e15SGreg Clayton 11930fdc8d8SChris Lattner case eStopReasonException: 12030fdc8d8SChris Lattner // If we crashed, discard thread plans and stop. Don't force the discard, however, 12130fdc8d8SChris Lattner // since on rerun the target may clean up this exception and continue normally from there. 12230fdc8d8SChris Lattner m_thread.DiscardThreadPlans(false); 12330fdc8d8SChris Lattner return true; 124f4b47e15SGreg Clayton 12530fdc8d8SChris Lattner case eStopReasonSignal: 126b15bfc75SJim Ingham if (stop_info_sp->ShouldStop(event_ptr)) 12730fdc8d8SChris Lattner { 12830fdc8d8SChris Lattner m_thread.DiscardThreadPlans(false); 12930fdc8d8SChris Lattner return true; 13030fdc8d8SChris Lattner } 13130fdc8d8SChris Lattner else 13230fdc8d8SChris Lattner { 13330fdc8d8SChris Lattner // We're not going to stop, but while we are here, let's figure out 13430fdc8d8SChris Lattner // whether to report this. 135b15bfc75SJim Ingham if (stop_info_sp->ShouldNotify(event_ptr)) 13630fdc8d8SChris Lattner m_stop_vote = eVoteYes; 13730fdc8d8SChris Lattner else 13830fdc8d8SChris Lattner m_stop_vote = eVoteNo; 139f4b47e15SGreg Clayton } 14030fdc8d8SChris Lattner return false; 141f4b47e15SGreg Clayton 14230fdc8d8SChris Lattner default: 14330fdc8d8SChris Lattner return true; 14430fdc8d8SChris Lattner } 14530fdc8d8SChris Lattner 14630fdc8d8SChris Lattner } 147f4b47e15SGreg Clayton else 148f4b47e15SGreg Clayton { 149f4b47e15SGreg Clayton m_run_vote = eVoteNo; 150f4b47e15SGreg Clayton m_stop_vote = eVoteNo; 151f4b47e15SGreg Clayton } 15230fdc8d8SChris Lattner 15330fdc8d8SChris Lattner // If there's no explicit reason to stop, then we will continue. 15430fdc8d8SChris Lattner return false; 15530fdc8d8SChris Lattner } 15630fdc8d8SChris Lattner 15730fdc8d8SChris Lattner bool 15830fdc8d8SChris Lattner ThreadPlanBase::StopOthers () 15930fdc8d8SChris Lattner { 16030fdc8d8SChris Lattner return false; 16130fdc8d8SChris Lattner } 16230fdc8d8SChris Lattner 16330fdc8d8SChris Lattner StateType 164*06e827ccSJim Ingham ThreadPlanBase::GetPlanRunState () 16530fdc8d8SChris Lattner { 16630fdc8d8SChris Lattner return eStateRunning; 16730fdc8d8SChris Lattner } 16830fdc8d8SChris Lattner 16930fdc8d8SChris Lattner bool 17030fdc8d8SChris Lattner ThreadPlanBase::WillStop () 17130fdc8d8SChris Lattner { 17230fdc8d8SChris Lattner return true; 17330fdc8d8SChris Lattner } 17430fdc8d8SChris Lattner 17530fdc8d8SChris Lattner // The base plan is never done. 17630fdc8d8SChris Lattner bool 17730fdc8d8SChris Lattner ThreadPlanBase::MischiefManaged () 17830fdc8d8SChris Lattner { 17930fdc8d8SChris Lattner // The base plan is never done. 18030fdc8d8SChris Lattner return false; 18130fdc8d8SChris Lattner } 18230fdc8d8SChris Lattner 183