124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ThreadPlanStepOverBreakpoint.cpp ------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepOverBreakpoint.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ThreadPlanStepOverBreakpoint: Single steps over a breakpoint bp_site_sp at the pc. 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOverBreakpoint::ThreadPlanStepOverBreakpoint (Thread &thread) : 305a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham ThreadPlan (ThreadPlan::eKindStepOverBreakpoint, "Step over breakpoint trap", 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread, 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eVoteNo, 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eVoteNoOpinion), // We need to report the run since this happens 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // first in the thread plan stack when stepping 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // over a breakpoint 365a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham m_breakpoint_addr (LLDB_INVALID_ADDRESS), 37863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton m_auto_continue(false), 38863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton m_reenabled_breakpoint_site (false) 395a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_addr = m_thread.GetRegisterContext()->GetPC(); 42f4124deeb9532044a38c0774ced872f2709347daGreg Clayton m_breakpoint_site_id = m_thread.GetProcess()->GetBreakpointSiteList().FindIDByAddress (m_breakpoint_addr); 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOverBreakpoint::~ThreadPlanStepOverBreakpoint () 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOverBreakpoint::GetDescription (Stream *s, lldb::DescriptionLevel level) 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 525f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf("Single stepping past breakpoint site %" PRIu64 " at 0x%" PRIx64, m_breakpoint_site_id, (uint64_t)m_breakpoint_addr); 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOverBreakpoint::ValidatePlan (Stream *error) 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 627c79a27b955432dfd3ad9439640f0af2eccf37b8Jim InghamThreadPlanStepOverBreakpoint::DoPlanExplainsStop (Event *event_ptr) 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6404cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham StopInfoSP stop_info_sp = GetPrivateStopInfo (); 65d14a0bddf3f71d531f5a757f102b30917e310512Jim Ingham if (stop_info_sp) 66d14a0bddf3f71d531f5a757f102b30917e310512Jim Ingham { 67d14a0bddf3f71d531f5a757f102b30917e310512Jim Ingham StopReason reason = stop_info_sp->GetStopReason(); 68d14a0bddf3f71d531f5a757f102b30917e310512Jim Ingham if (reason == eStopReasonTrace || reason == eStopReasonNone) 69d14a0bddf3f71d531f5a757f102b30917e310512Jim Ingham return true; 70d14a0bddf3f71d531f5a757f102b30917e310512Jim Ingham else 71d14a0bddf3f71d531f5a757f102b30917e310512Jim Ingham return false; 72d14a0bddf3f71d531f5a757f102b30917e310512Jim Ingham } 73d14a0bddf3f71d531f5a757f102b30917e310512Jim Ingham return false; 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOverBreakpoint::ShouldStop (Event *event_ptr) 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOverBreakpoint::StopOthers () 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 89745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanStepOverBreakpoint::GetPlanRunState () 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return eStateStepping; 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 957c79a27b955432dfd3ad9439640f0af2eccf37b8Jim InghamThreadPlanStepOverBreakpoint::DoWillResume (StateType resume_state, bool current_plan) 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (current_plan) 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 99f4124deeb9532044a38c0774ced872f2709347daGreg Clayton BreakpointSiteSP bp_site_sp (m_thread.GetProcess()->GetBreakpointSiteList().FindByAddress (m_breakpoint_addr)); 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp && bp_site_sp->IsEnabled()) 101efb4aeba2bd8411ac0aee9934f08959094d50711Jim Ingham m_thread.GetProcess()->DisableBreakpointSite (bp_site_sp.get()); 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOverBreakpoint::WillStop () 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 109863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton ReenableBreakpointSite (); 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOverBreakpoint::MischiefManaged () 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t pc_addr = m_thread.GetRegisterContext()->GetPC(); 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pc_addr == m_breakpoint_addr) 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we are still at the PC of our breakpoint, then for some reason we didn't 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // get a chance to run. 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 126952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Completed step over breakpoint plan."); 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Otherwise, re-enable the breakpoint we were stepping over, and we're done. 130863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton ReenableBreakpointSite (); 131863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton ThreadPlan::MischiefManaged (); 132863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton return true; 133863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton } 134863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton} 135863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton 136863aa28adf536c9c008e1590f25da662431d6f13Greg Claytonvoid 137863aa28adf536c9c008e1590f25da662431d6f13Greg ClaytonThreadPlanStepOverBreakpoint::ReenableBreakpointSite () 138863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton{ 139863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton if (!m_reenabled_breakpoint_site) 140863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton { 141863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton m_reenabled_breakpoint_site = true; 142f4124deeb9532044a38c0774ced872f2709347daGreg Clayton BreakpointSiteSP bp_site_sp (m_thread.GetProcess()->GetBreakpointSiteList().FindByAddress (m_breakpoint_addr)); 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 144863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton { 145efb4aeba2bd8411ac0aee9934f08959094d50711Jim Ingham m_thread.GetProcess()->EnableBreakpointSite (bp_site_sp.get()); 146863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton } 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 149863aa28adf536c9c008e1590f25da662431d6f13Greg Claytonvoid 150863aa28adf536c9c008e1590f25da662431d6f13Greg ClaytonThreadPlanStepOverBreakpoint::ThreadDestroyed () 151863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton{ 152863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton ReenableBreakpointSite (); 153863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton} 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1555a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Inghamvoid 1565a47e8bcc7277dc3683f2af2aeb9717184e8360cJim InghamThreadPlanStepOverBreakpoint::SetAutoContinue (bool do_it) 1575a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham{ 1585a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham m_auto_continue = do_it; 1595a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham} 1605a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham 1615a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Inghambool 1625a47e8bcc7277dc3683f2af2aeb9717184e8360cJim InghamThreadPlanStepOverBreakpoint::ShouldAutoContinue (Event *event_ptr) 1635a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham{ 1645a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham return m_auto_continue; 1655a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham} 166