124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ThreadPlanRunToAddress.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/ThreadPlanRunToAddress.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/Target.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ThreadPlanRunToAddress: Continue plan
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanRunToAddress::ThreadPlanRunToAddress
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Thread &thread,
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Address &address,
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool stop_others
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) :
3717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    ThreadPlan (ThreadPlan::eKindRunToAddress, "Run to address plan", thread, eVoteNoOpinion, eVoteNoOpinion),
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_stop_others (stop_others),
3917454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    m_addresses (),
4017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    m_break_ids ()
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
42f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    m_addresses.push_back (address.GetOpcodeLoadAddress (m_thread.CalculateTarget().get()));
4317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    SetInitialBreakpoints();
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanRunToAddress::ThreadPlanRunToAddress
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Thread &thread,
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::addr_t address,
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool stop_others
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) :
5217454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    ThreadPlan (ThreadPlan::eKindRunToAddress, "Run to address plan", thread, eVoteNoOpinion, eVoteNoOpinion),
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_stop_others (stop_others),
5417454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    m_addresses (),
5517454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    m_break_ids ()
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
57f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    m_addresses.push_back(m_thread.CalculateTarget()->GetOpcodeLoadAddress(address));
5817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    SetInitialBreakpoints();
5917454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham}
6017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham
6117454cfc6a757305a7d9d4c31313c38981b57b01Jim InghamThreadPlanRunToAddress::ThreadPlanRunToAddress
6217454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham(
6317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    Thread &thread,
64c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    const std::vector<lldb::addr_t> &addresses,
6517454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    bool stop_others
6617454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham) :
6717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    ThreadPlan (ThreadPlan::eKindRunToAddress, "Run to address plan", thread, eVoteNoOpinion, eVoteNoOpinion),
6817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    m_stop_others (stop_others),
6917454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    m_addresses (addresses),
7017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    m_break_ids ()
7117454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham{
72c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    // Convert all addressses into opcode addresses to make sure we set
73c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    // breakpoints at the correct address.
74f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    Target &target = thread.GetProcess()->GetTarget();
75c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    std::vector<lldb::addr_t>::iterator pos, end = m_addresses.end();
76c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    for (pos = m_addresses.begin(); pos != end; ++pos)
77c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        *pos = target.GetOpcodeLoadAddress (*pos);
78c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
7917454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    SetInitialBreakpoints();
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
8317454cfc6a757305a7d9d4c31313c38981b57b01Jim InghamThreadPlanRunToAddress::SetInitialBreakpoints ()
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8517454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    size_t num_addresses = m_addresses.size();
8617454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    m_break_ids.resize(num_addresses);
8717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham
8817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    for (size_t i = 0; i < num_addresses; i++)
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        Breakpoint *breakpoint;
91f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        breakpoint = m_thread.CalculateTarget()->CreateBreakpoint (m_addresses[i], true).get();
9217454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        if (breakpoint != NULL)
9317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        {
9417454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            m_break_ids[i] = breakpoint->GetID();
9517454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            breakpoint->SetThreadID(m_thread.GetID());
96090f83176695d86197b0e86b67dee4160ec5003dJim Ingham            breakpoint->SetBreakpointKind("run-to-address");
9717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        }
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanRunToAddress::~ThreadPlanRunToAddress ()
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    size_t num_break_ids = m_break_ids.size();
10417454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    for (size_t i = 0; i <  num_break_ids; i++)
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
106f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        m_thread.CalculateTarget()->RemoveBreakpointByID (m_break_ids[i]);
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanRunToAddress::GetDescription (Stream *s, lldb::DescriptionLevel level)
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    size_t num_addresses = m_addresses.size();
11417454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (level == lldb::eDescriptionLevelBrief)
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        if (num_addresses == 0)
11817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        {
11917454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            s->Printf ("run to address with no addresses given.");
12017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            return;
12117454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        }
12217454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        else if (num_addresses == 1)
12317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            s->Printf ("run to address: ");
12417454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        else
12517454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            s->Printf ("run to addresses: ");
12617454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham
12717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        for (size_t i = 0; i < num_addresses; i++)
12817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        {
12917454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            s->Address (m_addresses[i], sizeof (addr_t));
13017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            s->Printf(" ");
13117454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        }
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13517454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        if (num_addresses == 0)
13617454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        {
13717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            s->Printf ("run to address with no addresses given.");
13817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            return;
13917454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        }
14017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        else if (num_addresses == 1)
14117454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            s->Printf ("Run to address: ");
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
14317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        {
14417454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            s->Printf ("Run to addresses: ");
14517454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        }
14617454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham
14717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        for (size_t i = 0; i < num_addresses; i++)
14817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        {
14917454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            if (num_addresses > 1)
15017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            {
15117454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham                s->Printf("\n");
15217454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham                s->Indent();
15317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            }
15417454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham
15517454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            s->Address(m_addresses[i], sizeof (addr_t));
1566db3594f1ce91d8268ef60bf5d07635d778ea786Jim Ingham            s->Printf (" using breakpoint: %d - ", m_break_ids[i]);
157f4124deeb9532044a38c0774ced872f2709347daGreg Clayton            Breakpoint *breakpoint = m_thread.CalculateTarget()->GetBreakpointByID (m_break_ids[i]).get();
15817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            if (breakpoint)
15917454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham                breakpoint->Dump (s);
16017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            else
16117454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham                s->Printf ("but the breakpoint has been deleted.");
16217454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        }
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanRunToAddress::ValidatePlan (Stream *error)
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If we couldn't set the breakpoint for some reason, then this won't
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // work.
17117454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    bool all_bps_good = true;
17217454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    size_t num_break_ids = m_break_ids.size();
17317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham
17417454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    for (size_t i = 0; i < num_break_ids; i++)
17517454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    {
17617454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        if (m_break_ids[i] == LLDB_INVALID_BREAK_ID)
17717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        {
17817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            all_bps_good = false;
179360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            if (error)
180360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            {
181360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                error->Printf ("Could not set breakpoint for address: ");
182360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                error->Address (m_addresses[i], sizeof (addr_t));
183360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                error->Printf ("\n");
184360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            }
18517454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        }
18617454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    }
18717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    return all_bps_good;
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1917c79a27b955432dfd3ad9439640f0af2eccf37b8Jim InghamThreadPlanRunToAddress::DoPlanExplainsStop (Event *event_ptr)
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return AtOurAddress();
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanRunToAddress::ShouldStop (Event *event_ptr)
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanRunToAddress::StopOthers ()
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_stop_others;
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanRunToAddress::SetStopOthers (bool new_value)
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_stop_others = new_value;
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
215745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanRunToAddress::GetPlanRunState ()
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return eStateRunning;
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanRunToAddress::WillStop ()
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanRunToAddress::MischiefManaged ()
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
229952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (AtOurAddress())
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Remove the breakpoint
23417454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        size_t num_break_ids = m_break_ids.size();
23517454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham
23617454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        for (size_t i = 0; i < num_break_ids; i++)
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
23817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            if (m_break_ids[i] != LLDB_INVALID_BREAK_ID)
23917454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            {
240f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                m_thread.CalculateTarget()->RemoveBreakpointByID (m_break_ids[i]);
24117454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham                m_break_ids[i] = LLDB_INVALID_BREAK_ID;
24217454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            }
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (log)
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf("Completed run to address plan.");
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ThreadPlan::MischiefManaged ();
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanRunToAddress::AtOurAddress ()
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::addr_t current_address = m_thread.GetRegisterContext()->GetPC();
25717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    bool found_it = false;
25833ee8922de655a11598f87d69bf5352695b18c15Jim Ingham    size_t num_addresses = m_addresses.size();
25933ee8922de655a11598f87d69bf5352695b18c15Jim Ingham    for (size_t i = 0; i < num_addresses; i++)
26017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    {
26117454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        if (m_addresses[i] == current_address)
26217454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        {
26317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            found_it = true;
26417454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            break;
26517454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        }
26617454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    }
26717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    return found_it;
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
269