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 71*221d51cfSJim Ingham ThreadPlanBase::DoPlanExplainsStop (Event *event_ptr) 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 81*221d51cfSJim Ingham Vote 82*221d51cfSJim Ingham ThreadPlanBase::ShouldReportStop(Event *event_ptr) 83*221d51cfSJim Ingham { 84*221d51cfSJim Ingham StopInfoSP stop_info_sp = m_thread.GetStopInfo (); 85*221d51cfSJim Ingham if (stop_info_sp) 86*221d51cfSJim Ingham { 87*221d51cfSJim Ingham bool should_notify = stop_info_sp->ShouldNotify(event_ptr); 88*221d51cfSJim Ingham if (should_notify) 89*221d51cfSJim Ingham return eVoteYes; 90*221d51cfSJim Ingham else 91*221d51cfSJim Ingham return eVoteNoOpinion; 92*221d51cfSJim Ingham } 93*221d51cfSJim Ingham else 94*221d51cfSJim Ingham return eVoteNoOpinion; 95*221d51cfSJim Ingham } 96*221d51cfSJim Ingham 9730fdc8d8SChris Lattner bool 9830fdc8d8SChris Lattner ThreadPlanBase::ShouldStop (Event *event_ptr) 9930fdc8d8SChris Lattner { 10030fdc8d8SChris Lattner m_stop_vote = eVoteYes; 10130fdc8d8SChris Lattner m_run_vote = eVoteYes; 10230fdc8d8SChris Lattner 1035160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 1040f16e73aSJim Ingham 105b15bfc75SJim Ingham StopInfoSP stop_info_sp = GetPrivateStopReason(); 106b15bfc75SJim Ingham if (stop_info_sp) 10730fdc8d8SChris Lattner { 108b15bfc75SJim Ingham StopReason reason = stop_info_sp->GetStopReason(); 10930fdc8d8SChris Lattner switch (reason) 11030fdc8d8SChris Lattner { 11130fdc8d8SChris Lattner case eStopReasonInvalid: 11230fdc8d8SChris Lattner case eStopReasonNone: 113444586b5SJim Ingham // This 114444586b5SJim Ingham m_run_vote = eVoteNoOpinion; 11530fdc8d8SChris Lattner m_stop_vote = eVoteNo; 11630fdc8d8SChris Lattner return false; 117f4b47e15SGreg Clayton 11830fdc8d8SChris Lattner case eStopReasonBreakpoint: 119fd158f41SJohnny Chen case eStopReasonWatchpoint: 1209b620f34SJim Ingham if (stop_info_sp->ShouldStopSynchronous(event_ptr)) 12130fdc8d8SChris Lattner { 12230fdc8d8SChris Lattner // If we are going to stop for a breakpoint, then unship the other plans 12330fdc8d8SChris Lattner // at this point. Don't force the discard, however, so Master plans can stay 12430fdc8d8SChris Lattner // in place if they want to. 1250f16e73aSJim Ingham if (log) 126d01b2953SDaniel Malea log->Printf("Base plan discarding thread plans for thread tid = 0x%4.4" PRIx64 " (breakpoint hit.)", m_thread.GetID()); 12730fdc8d8SChris Lattner m_thread.DiscardThreadPlans(false); 128f4b47e15SGreg Clayton return true; 12930fdc8d8SChris Lattner } 130f4b47e15SGreg Clayton // If we aren't going to stop at this breakpoint, and it is internal, 131f4b47e15SGreg Clayton // don't report this stop or the subsequent running event. 132f4b47e15SGreg Clayton // Otherwise we will post the stopped & running, but the stopped event will get marked 133f4b47e15SGreg Clayton // with "restarted" so the UI will know to wait and expect the consequent "running". 134b15bfc75SJim Ingham if (stop_info_sp->ShouldNotify (event_ptr)) 135f4b47e15SGreg Clayton { 136f4b47e15SGreg Clayton m_stop_vote = eVoteYes; 137f4b47e15SGreg Clayton m_run_vote = eVoteYes; 138f4b47e15SGreg Clayton } 139f4b47e15SGreg Clayton else 140f4b47e15SGreg Clayton { 141f4b47e15SGreg Clayton m_stop_vote = eVoteNo; 142f4b47e15SGreg Clayton m_run_vote = eVoteNo; 143f4b47e15SGreg Clayton } 144f4b47e15SGreg Clayton return false; 14530fdc8d8SChris Lattner 146f4b47e15SGreg Clayton // TODO: the break below was missing, was this intentional??? If so 147f4b47e15SGreg Clayton // please mention it 148f4b47e15SGreg Clayton break; 149f4b47e15SGreg Clayton 15030fdc8d8SChris Lattner case eStopReasonException: 15130fdc8d8SChris Lattner // If we crashed, discard thread plans and stop. Don't force the discard, however, 15230fdc8d8SChris Lattner // since on rerun the target may clean up this exception and continue normally from there. 1530f16e73aSJim Ingham if (log) 154d01b2953SDaniel Malea log->Printf("Base plan discarding thread plans for thread tid = 0x%4.4" PRIx64 " (exception.)", m_thread.GetID()); 15530fdc8d8SChris Lattner m_thread.DiscardThreadPlans(false); 15630fdc8d8SChris Lattner return true; 157f4b47e15SGreg Clayton 15890ba8115SGreg Clayton case eStopReasonExec: 15990ba8115SGreg Clayton // If we crashed, discard thread plans and stop. Don't force the discard, however, 16090ba8115SGreg Clayton // since on rerun the target may clean up this exception and continue normally from there. 16190ba8115SGreg Clayton if (log) 16290ba8115SGreg Clayton log->Printf("Base plan discarding thread plans for thread tid = 0x%4.4" PRIx64 " (exec.)", m_thread.GetID()); 16390ba8115SGreg Clayton m_thread.DiscardThreadPlans(false); 16490ba8115SGreg Clayton return true; 16590ba8115SGreg Clayton 166f85defaeSAndrew Kaylor case eStopReasonThreadExiting: 16730fdc8d8SChris Lattner case eStopReasonSignal: 168b15bfc75SJim Ingham if (stop_info_sp->ShouldStop(event_ptr)) 16930fdc8d8SChris Lattner { 1700f16e73aSJim Ingham if (log) 171d01b2953SDaniel Malea log->Printf("Base plan discarding thread plans for thread tid = 0x%4.4" PRIx64 " (signal.)", m_thread.GetID()); 17230fdc8d8SChris Lattner m_thread.DiscardThreadPlans(false); 17330fdc8d8SChris Lattner return true; 17430fdc8d8SChris Lattner } 17530fdc8d8SChris Lattner else 17630fdc8d8SChris Lattner { 17730fdc8d8SChris Lattner // We're not going to stop, but while we are here, let's figure out 17830fdc8d8SChris Lattner // whether to report this. 179b15bfc75SJim Ingham if (stop_info_sp->ShouldNotify(event_ptr)) 18030fdc8d8SChris Lattner m_stop_vote = eVoteYes; 18130fdc8d8SChris Lattner else 18230fdc8d8SChris Lattner m_stop_vote = eVoteNo; 183f4b47e15SGreg Clayton } 18430fdc8d8SChris Lattner return false; 185f4b47e15SGreg Clayton 18630fdc8d8SChris Lattner default: 18730fdc8d8SChris Lattner return true; 18830fdc8d8SChris Lattner } 18930fdc8d8SChris Lattner 19030fdc8d8SChris Lattner } 191f4b47e15SGreg Clayton else 192f4b47e15SGreg Clayton { 193444586b5SJim Ingham m_run_vote = eVoteNoOpinion; 194f4b47e15SGreg Clayton m_stop_vote = eVoteNo; 195f4b47e15SGreg Clayton } 19630fdc8d8SChris Lattner 19730fdc8d8SChris Lattner // If there's no explicit reason to stop, then we will continue. 19830fdc8d8SChris Lattner return false; 19930fdc8d8SChris Lattner } 20030fdc8d8SChris Lattner 20130fdc8d8SChris Lattner bool 20230fdc8d8SChris Lattner ThreadPlanBase::StopOthers () 20330fdc8d8SChris Lattner { 20430fdc8d8SChris Lattner return false; 20530fdc8d8SChris Lattner } 20630fdc8d8SChris Lattner 20730fdc8d8SChris Lattner StateType 20806e827ccSJim Ingham ThreadPlanBase::GetPlanRunState () 20930fdc8d8SChris Lattner { 21030fdc8d8SChris Lattner return eStateRunning; 21130fdc8d8SChris Lattner } 21230fdc8d8SChris Lattner 21330fdc8d8SChris Lattner bool 21430fdc8d8SChris Lattner ThreadPlanBase::WillStop () 21530fdc8d8SChris Lattner { 21630fdc8d8SChris Lattner return true; 21730fdc8d8SChris Lattner } 21830fdc8d8SChris Lattner 219444586b5SJim Ingham bool 220*221d51cfSJim Ingham ThreadPlanBase::DoWillResume (lldb::StateType resume_state, bool current_plan) 221444586b5SJim Ingham { 222444586b5SJim Ingham // Reset these to the default values so we don't set them wrong, then not get asked 223444586b5SJim Ingham // for a while, then return the wrong answer. 224444586b5SJim Ingham m_run_vote = eVoteNoOpinion; 225444586b5SJim Ingham m_stop_vote = eVoteNo; 226444586b5SJim Ingham return true; 227444586b5SJim Ingham } 228444586b5SJim Ingham 229444586b5SJim Ingham 23030fdc8d8SChris Lattner // The base plan is never done. 23130fdc8d8SChris Lattner bool 23230fdc8d8SChris Lattner ThreadPlanBase::MischiefManaged () 23330fdc8d8SChris Lattner { 23430fdc8d8SChris Lattner // The base plan is never done. 23530fdc8d8SChris Lattner return false; 23630fdc8d8SChris Lattner } 23730fdc8d8SChris Lattner 238