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" 210f16e73aSJim Ingham #include "lldb/Core/Log.h" 2230fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2330fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2430fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 25f4b47e15SGreg Clayton #include "lldb/Target/StopInfo.h" 2630fdc8d8SChris Lattner 2730fdc8d8SChris Lattner using namespace lldb; 2830fdc8d8SChris Lattner using namespace lldb_private; 2930fdc8d8SChris Lattner 3030fdc8d8SChris Lattner //---------------------------------------------------------------------- 3130fdc8d8SChris Lattner // ThreadPlanBase: This one always stops, and never has anything particular 3230fdc8d8SChris Lattner // to do. 3330fdc8d8SChris Lattner // FIXME: The "signal handling" policies should probably go here. 3430fdc8d8SChris Lattner //---------------------------------------------------------------------- 3530fdc8d8SChris Lattner 3630fdc8d8SChris Lattner ThreadPlanBase::ThreadPlanBase (Thread &thread) : 37b01e742aSJim Ingham ThreadPlan(ThreadPlan::eKindBase, "base plan", thread, eVoteYes, eVoteNoOpinion) 3830fdc8d8SChris Lattner { 3906e827ccSJim Ingham // Set the tracer to a default tracer. 40773d981cSJim Ingham // FIXME: need to add a thread settings variable to pix various tracers... 41773d981cSJim Ingham #define THREAD_PLAN_USE_ASSEMBLY_TRACER 1 42773d981cSJim Ingham 43773d981cSJim Ingham #ifdef THREAD_PLAN_USE_ASSEMBLY_TRACER 44773d981cSJim Ingham ThreadPlanTracerSP new_tracer_sp (new ThreadPlanAssemblyTracer (m_thread)); 45773d981cSJim Ingham #else 4606e827ccSJim Ingham ThreadPlanTracerSP new_tracer_sp (new ThreadPlanTracer (m_thread)); 47773d981cSJim Ingham #endif 4806e827ccSJim Ingham new_tracer_sp->EnableTracing (m_thread.GetTraceEnabledState()); 4906e827ccSJim Ingham SetThreadPlanTracer(new_tracer_sp); 50cf274f91SJim Ingham SetIsMasterPlan (true); 5130fdc8d8SChris Lattner } 5230fdc8d8SChris Lattner 5330fdc8d8SChris Lattner ThreadPlanBase::~ThreadPlanBase () 5430fdc8d8SChris Lattner { 5530fdc8d8SChris Lattner 5630fdc8d8SChris Lattner } 5730fdc8d8SChris Lattner 5830fdc8d8SChris Lattner void 5930fdc8d8SChris Lattner ThreadPlanBase::GetDescription (Stream *s, lldb::DescriptionLevel level) 6030fdc8d8SChris Lattner { 6130fdc8d8SChris Lattner s->Printf ("Base thread plan."); 6230fdc8d8SChris Lattner } 6330fdc8d8SChris Lattner 6430fdc8d8SChris Lattner bool 6530fdc8d8SChris Lattner ThreadPlanBase::ValidatePlan (Stream *error) 6630fdc8d8SChris Lattner { 6730fdc8d8SChris Lattner return true; 6830fdc8d8SChris Lattner } 6930fdc8d8SChris Lattner 7030fdc8d8SChris Lattner bool 7130fdc8d8SChris Lattner ThreadPlanBase::PlanExplainsStop () 7230fdc8d8SChris Lattner { 7306e827ccSJim Ingham // The base plan should defer to its tracer, since by default it 7406e827ccSJim Ingham // always handles the stop. 7506e827ccSJim Ingham if (TracerExplainsStop()) 7606e827ccSJim Ingham return false; 7706e827ccSJim Ingham else 7830fdc8d8SChris Lattner return true; 7930fdc8d8SChris Lattner } 8030fdc8d8SChris Lattner 8130fdc8d8SChris Lattner bool 8230fdc8d8SChris Lattner ThreadPlanBase::ShouldStop (Event *event_ptr) 8330fdc8d8SChris Lattner { 8430fdc8d8SChris Lattner m_stop_vote = eVoteYes; 8530fdc8d8SChris Lattner m_run_vote = eVoteYes; 8630fdc8d8SChris Lattner 870f16e73aSJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 880f16e73aSJim Ingham 89b15bfc75SJim Ingham StopInfoSP stop_info_sp = GetPrivateStopReason(); 90b15bfc75SJim Ingham if (stop_info_sp) 9130fdc8d8SChris Lattner { 92b15bfc75SJim Ingham StopReason reason = stop_info_sp->GetStopReason(); 9330fdc8d8SChris Lattner switch (reason) 9430fdc8d8SChris Lattner { 9530fdc8d8SChris Lattner case eStopReasonInvalid: 9630fdc8d8SChris Lattner case eStopReasonNone: 97444586b5SJim Ingham // This 98444586b5SJim Ingham m_run_vote = eVoteNoOpinion; 9930fdc8d8SChris Lattner m_stop_vote = eVoteNo; 10030fdc8d8SChris Lattner return false; 101f4b47e15SGreg Clayton 10230fdc8d8SChris Lattner case eStopReasonBreakpoint: 103fd158f41SJohnny Chen case eStopReasonWatchpoint: 104b15bfc75SJim Ingham if (stop_info_sp->ShouldStop(event_ptr)) 10530fdc8d8SChris Lattner { 10630fdc8d8SChris Lattner // If we are going to stop for a breakpoint, then unship the other plans 10730fdc8d8SChris Lattner // at this point. Don't force the discard, however, so Master plans can stay 10830fdc8d8SChris Lattner // in place if they want to. 1090f16e73aSJim Ingham if (log) 110d01b2953SDaniel Malea log->Printf("Base plan discarding thread plans for thread tid = 0x%4.4" PRIx64 " (breakpoint hit.)", m_thread.GetID()); 11130fdc8d8SChris Lattner m_thread.DiscardThreadPlans(false); 112f4b47e15SGreg Clayton return true; 11330fdc8d8SChris Lattner } 114f4b47e15SGreg Clayton // If we aren't going to stop at this breakpoint, and it is internal, 115f4b47e15SGreg Clayton // don't report this stop or the subsequent running event. 116f4b47e15SGreg Clayton // Otherwise we will post the stopped & running, but the stopped event will get marked 117f4b47e15SGreg Clayton // with "restarted" so the UI will know to wait and expect the consequent "running". 118b15bfc75SJim Ingham if (stop_info_sp->ShouldNotify (event_ptr)) 119f4b47e15SGreg Clayton { 120f4b47e15SGreg Clayton m_stop_vote = eVoteYes; 121f4b47e15SGreg Clayton m_run_vote = eVoteYes; 122f4b47e15SGreg Clayton } 123f4b47e15SGreg Clayton else 124f4b47e15SGreg Clayton { 125f4b47e15SGreg Clayton m_stop_vote = eVoteNo; 126f4b47e15SGreg Clayton m_run_vote = eVoteNo; 127f4b47e15SGreg Clayton } 128f4b47e15SGreg Clayton return false; 12930fdc8d8SChris Lattner 130f4b47e15SGreg Clayton // TODO: the break below was missing, was this intentional??? If so 131f4b47e15SGreg Clayton // please mention it 132f4b47e15SGreg Clayton break; 133f4b47e15SGreg Clayton 13430fdc8d8SChris Lattner case eStopReasonException: 13530fdc8d8SChris Lattner // If we crashed, discard thread plans and stop. Don't force the discard, however, 13630fdc8d8SChris Lattner // since on rerun the target may clean up this exception and continue normally from there. 1370f16e73aSJim Ingham if (log) 138d01b2953SDaniel Malea log->Printf("Base plan discarding thread plans for thread tid = 0x%4.4" PRIx64 " (exception.)", m_thread.GetID()); 13930fdc8d8SChris Lattner m_thread.DiscardThreadPlans(false); 14030fdc8d8SChris Lattner return true; 141f4b47e15SGreg Clayton 14290ba8115SGreg Clayton case eStopReasonExec: 14390ba8115SGreg Clayton // If we crashed, discard thread plans and stop. Don't force the discard, however, 14490ba8115SGreg Clayton // since on rerun the target may clean up this exception and continue normally from there. 14590ba8115SGreg Clayton if (log) 14690ba8115SGreg Clayton log->Printf("Base plan discarding thread plans for thread tid = 0x%4.4" PRIx64 " (exec.)", m_thread.GetID()); 14790ba8115SGreg Clayton m_thread.DiscardThreadPlans(false); 14890ba8115SGreg Clayton return true; 14990ba8115SGreg Clayton 150*f85defaeSAndrew Kaylor case eStopReasonThreadExiting: 15130fdc8d8SChris Lattner case eStopReasonSignal: 152b15bfc75SJim Ingham if (stop_info_sp->ShouldStop(event_ptr)) 15330fdc8d8SChris Lattner { 1540f16e73aSJim Ingham if (log) 155d01b2953SDaniel Malea log->Printf("Base plan discarding thread plans for thread tid = 0x%4.4" PRIx64 " (signal.)", m_thread.GetID()); 15630fdc8d8SChris Lattner m_thread.DiscardThreadPlans(false); 15730fdc8d8SChris Lattner return true; 15830fdc8d8SChris Lattner } 15930fdc8d8SChris Lattner else 16030fdc8d8SChris Lattner { 16130fdc8d8SChris Lattner // We're not going to stop, but while we are here, let's figure out 16230fdc8d8SChris Lattner // whether to report this. 163b15bfc75SJim Ingham if (stop_info_sp->ShouldNotify(event_ptr)) 16430fdc8d8SChris Lattner m_stop_vote = eVoteYes; 16530fdc8d8SChris Lattner else 16630fdc8d8SChris Lattner m_stop_vote = eVoteNo; 167f4b47e15SGreg Clayton } 16830fdc8d8SChris Lattner return false; 169f4b47e15SGreg Clayton 17030fdc8d8SChris Lattner default: 17130fdc8d8SChris Lattner return true; 17230fdc8d8SChris Lattner } 17330fdc8d8SChris Lattner 17430fdc8d8SChris Lattner } 175f4b47e15SGreg Clayton else 176f4b47e15SGreg Clayton { 177444586b5SJim Ingham m_run_vote = eVoteNoOpinion; 178f4b47e15SGreg Clayton m_stop_vote = eVoteNo; 179f4b47e15SGreg Clayton } 18030fdc8d8SChris Lattner 18130fdc8d8SChris Lattner // If there's no explicit reason to stop, then we will continue. 18230fdc8d8SChris Lattner return false; 18330fdc8d8SChris Lattner } 18430fdc8d8SChris Lattner 18530fdc8d8SChris Lattner bool 18630fdc8d8SChris Lattner ThreadPlanBase::StopOthers () 18730fdc8d8SChris Lattner { 18830fdc8d8SChris Lattner return false; 18930fdc8d8SChris Lattner } 19030fdc8d8SChris Lattner 19130fdc8d8SChris Lattner StateType 19206e827ccSJim Ingham ThreadPlanBase::GetPlanRunState () 19330fdc8d8SChris Lattner { 19430fdc8d8SChris Lattner return eStateRunning; 19530fdc8d8SChris Lattner } 19630fdc8d8SChris Lattner 19730fdc8d8SChris Lattner bool 19830fdc8d8SChris Lattner ThreadPlanBase::WillStop () 19930fdc8d8SChris Lattner { 20030fdc8d8SChris Lattner return true; 20130fdc8d8SChris Lattner } 20230fdc8d8SChris Lattner 203444586b5SJim Ingham bool 204444586b5SJim Ingham ThreadPlanBase::WillResume (lldb::StateType resume_state, bool current_plan) 205444586b5SJim Ingham { 206444586b5SJim Ingham // Reset these to the default values so we don't set them wrong, then not get asked 207444586b5SJim Ingham // for a while, then return the wrong answer. 208444586b5SJim Ingham m_run_vote = eVoteNoOpinion; 209444586b5SJim Ingham m_stop_vote = eVoteNo; 210444586b5SJim Ingham return true; 211444586b5SJim Ingham } 212444586b5SJim Ingham 213444586b5SJim Ingham 21430fdc8d8SChris Lattner // The base plan is never done. 21530fdc8d8SChris Lattner bool 21630fdc8d8SChris Lattner ThreadPlanBase::MischiefManaged () 21730fdc8d8SChris Lattner { 21830fdc8d8SChris Lattner // The base plan is never done. 21930fdc8d8SChris Lattner return false; 22030fdc8d8SChris Lattner } 22130fdc8d8SChris Lattner 222