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