124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Breakpoint.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
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/Breakpoint.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/BreakpointLocation.h"
19a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen#include "lldb/Breakpoint/BreakpointLocationCollection.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/BreakpointResolver.h"
21a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen#include "lldb/Breakpoint/BreakpointResolverFileLine.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ModuleList.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/SearchFilter.h"
2549ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Section.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h"
303c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham#include "lldb/Target/ThreadSpec.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h"
32a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen#include "llvm/Support/Casting.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
36a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chenusing namespace llvm;
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::GetEventIdentifier ()
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static ConstString g_identifier("event-identifier.breakpoint.changed");
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return g_identifier;
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Breakpoint constructor
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::Breakpoint(Target &target, SearchFilterSP &filter_sp, BreakpointResolverSP &resolver_sp) :
4928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    m_being_created(true),
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target (target),
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_filter_sp (filter_sp),
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_resolver_sp (resolver_sp),
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_options (),
5428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    m_locations (*this)
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    m_being_created = false;
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::~Breakpoint()
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::IsInternal () const
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return LLDB_BREAK_ID_IS_INTERNAL(m_bid);
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTarget&
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::GetTarget ()
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target;
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Target&
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::GetTarget () const
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target;
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointLocationSP
8719a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg ClaytonBreakpoint::AddLocation (const Address &addr, bool *new_location)
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    return m_locations.AddLocation (addr, new_location);
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointLocationSP
9319a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg ClaytonBreakpoint::FindLocationByAddress (const Address &addr)
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_locations.FindByAddress(addr);
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbreak_id_t
9919a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg ClaytonBreakpoint::FindLocationIDByAddress (const Address &addr)
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_locations.FindIDByAddress(addr);
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointLocationSP
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::FindLocationByID (break_id_t bp_loc_id)
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_locations.FindByID(bp_loc_id);
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointLocationSP
11136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonBreakpoint::GetLocationAtIndex (size_t index)
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_locations.GetByIndex(index);
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// For each of the overall options we need to decide how they propagate to
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the location options.  This will determine the precedence of options on
118736f0d66ffec1f5c58efd808bf57765798793b5cJohnny Chen// the breakpoint vs. its locations.
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable at the breakpoint level should override the location settings.
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// That way you can conveniently turn off a whole breakpoint without messing
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// up the individual settings.
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::SetEnabled (bool enable)
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    if (enable == m_options.IsEnabled())
12828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        return;
12928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_options.SetEnabled(enable);
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enable)
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_locations.ResolveAllBreakpointSites();
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_locations.ClearAllBreakpointSites();
13528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
13628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SendBreakpointChangedEvent (enable ? eBreakpointEventTypeEnabled : eBreakpointEventTypeDisabled);
13728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::IsEnabled ()
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_options.IsEnabled();
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
14754e7afa84d945f9137f9372ecde432f9e1a702fcGreg ClaytonBreakpoint::SetIgnoreCount (uint32_t n)
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    if (m_options.GetIgnoreCount() == n)
15028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        return;
15128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_options.SetIgnoreCount(n);
15328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SendBreakpointChangedEvent (eBreakpointEventTypeIgnoreChanged);
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
156fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Inghamvoid
157fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim InghamBreakpoint::DecrementIgnoreCount ()
158fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham{
159fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    uint32_t ignore = m_options.GetIgnoreCount();
160fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    if (ignore != 0)
161fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham        m_options.SetIgnoreCount(ignore - 1);
162fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham}
163fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham
16454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Claytonuint32_t
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::GetIgnoreCount () const
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_options.GetIgnoreCount();
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
170fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Inghambool
171fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim InghamBreakpoint::IgnoreCountShouldStop ()
172fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham{
173fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    uint32_t ignore = GetIgnoreCount();
174fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    if (ignore != 0)
175fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    {
176fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham        // When we get here we know the location that caused the stop doesn't have an ignore count,
177fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham        // since by contract we call it first...  So we don't have to find & decrement it, we only have
178fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham        // to decrement our own ignore count.
179fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham        DecrementIgnoreCount();
180fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham        return false;
181fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    }
182fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    else
183fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham        return true;
184fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham}
185fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham
186c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Claytonuint32_t
187c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg ClaytonBreakpoint::GetHitCount () const
188c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton{
189c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    return m_locations.GetHitCount();
190c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton}
191c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton
1922753a024a5a314232baa579c0ada87551aa86988Jim Inghambool
1932753a024a5a314232baa579c0ada87551aa86988Jim InghamBreakpoint::IsOneShot () const
1942753a024a5a314232baa579c0ada87551aa86988Jim Ingham{
1952753a024a5a314232baa579c0ada87551aa86988Jim Ingham    return m_options.IsOneShot();
1962753a024a5a314232baa579c0ada87551aa86988Jim Ingham}
1972753a024a5a314232baa579c0ada87551aa86988Jim Ingham
1982753a024a5a314232baa579c0ada87551aa86988Jim Inghamvoid
1992753a024a5a314232baa579c0ada87551aa86988Jim InghamBreakpoint::SetOneShot (bool one_shot)
2002753a024a5a314232baa579c0ada87551aa86988Jim Ingham{
2012753a024a5a314232baa579c0ada87551aa86988Jim Ingham    m_options.SetOneShot (one_shot);
2022753a024a5a314232baa579c0ada87551aa86988Jim Ingham}
2032753a024a5a314232baa579c0ada87551aa86988Jim Ingham
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::SetThreadID (lldb::tid_t thread_id)
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
20728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    if (m_options.GetThreadSpec()->GetTID() == thread_id)
20828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        return;
20928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
2103c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    m_options.GetThreadSpec()->SetTID(thread_id);
21128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SendBreakpointChangedEvent (eBreakpointEventTypeThreadChanged);
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::tid_t
21528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim InghamBreakpoint::GetThreadID () const
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    if (m_options.GetThreadSpecNoCreate() == NULL)
2183c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham        return LLDB_INVALID_THREAD_ID;
2193c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    else
22028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        return m_options.GetThreadSpecNoCreate()->GetTID();
22128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham}
22228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
22328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Inghamvoid
22428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim InghamBreakpoint::SetThreadIndex (uint32_t index)
22528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham{
22628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    if (m_options.GetThreadSpec()->GetIndex() == index)
22728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        return;
22828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
22928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    m_options.GetThreadSpec()->SetIndex(index);
23028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SendBreakpointChangedEvent (eBreakpointEventTypeThreadChanged);
23128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham}
23228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
23328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Inghamuint32_t
23428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim InghamBreakpoint::GetThreadIndex() const
23528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham{
23628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    if (m_options.GetThreadSpecNoCreate() == NULL)
23728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        return 0;
23828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    else
23928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        return m_options.GetThreadSpecNoCreate()->GetIndex();
24028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham}
24128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
24228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Inghamvoid
24328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim InghamBreakpoint::SetThreadName (const char *thread_name)
24428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham{
245f74de22f37e2addfc8123d7b935efc579acab947Jim Ingham    if (m_options.GetThreadSpec()->GetName() != NULL
246f74de22f37e2addfc8123d7b935efc579acab947Jim Ingham        && ::strcmp (m_options.GetThreadSpec()->GetName(), thread_name) == 0)
24728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        return;
24828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
24928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    m_options.GetThreadSpec()->SetName (thread_name);
25028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SendBreakpointChangedEvent (eBreakpointEventTypeThreadChanged);
25128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham}
25228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
25328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Inghamconst char *
25428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim InghamBreakpoint::GetThreadName () const
25528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham{
25628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    if (m_options.GetThreadSpecNoCreate() == NULL)
25728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        return NULL;
25828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    else
25928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        return m_options.GetThreadSpecNoCreate()->GetName();
26028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham}
26128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
26228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Inghamvoid
26328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim InghamBreakpoint::SetQueueName (const char *queue_name)
26428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham{
265f74de22f37e2addfc8123d7b935efc579acab947Jim Ingham    if (m_options.GetThreadSpec()->GetQueueName() != NULL
266f74de22f37e2addfc8123d7b935efc579acab947Jim Ingham        && ::strcmp (m_options.GetThreadSpec()->GetQueueName(), queue_name) == 0)
26728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        return;
26828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
26928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    m_options.GetThreadSpec()->SetQueueName (queue_name);
27028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SendBreakpointChangedEvent (eBreakpointEventTypeThreadChanged);
27128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham}
27228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
27328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Inghamconst char *
27428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim InghamBreakpoint::GetQueueName () const
27528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham{
27628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    if (m_options.GetThreadSpecNoCreate() == NULL)
27728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        return NULL;
27828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    else
27928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        return m_options.GetThreadSpecNoCreate()->GetQueueName();
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
282d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Inghamvoid
283d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim InghamBreakpoint::SetCondition (const char *condition)
284d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham{
285d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    m_options.SetCondition (condition);
28628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SendBreakpointChangedEvent (eBreakpointEventTypeConditionChanged);
287d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham}
288d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham
289d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Inghamconst char *
290ac35442b2b1a35ea3100c870214977e3bddb76f6Jim InghamBreakpoint::GetConditionText () const
291d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham{
292d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    return m_options.GetConditionText();
293d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham}
294d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This function is used when "baton" doesn't need to be freed
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::SetCallback (BreakpointHitCallback callback, void *baton, bool is_synchronous)
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The default "Baton" class will keep a copy of "baton" and won't free
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // or delete it when it goes goes out of scope.
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_options.SetCallback(callback, BatonSP (new Baton(baton)), is_synchronous);
30228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
30328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SendBreakpointChangedEvent (eBreakpointEventTypeCommandChanged);
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This function is used when a baton needs to be freed and therefore is
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// contained in a "Baton" subclass.
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::SetCallback (BreakpointHitCallback callback, const BatonSP &callback_baton_sp, bool is_synchronous)
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_options.SetCallback(callback, callback_baton_sp, is_synchronous);
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::ClearCallback ()
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_options.ClearCallback ();
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::InvokeCallback (StoppointCallbackContext *context, break_id_t bp_loc_id)
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_options.InvokeCallback (context, GetID(), bp_loc_id);
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointOptions *
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::GetOptions ()
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return &m_options;
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::ResolveBreakpoint ()
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_resolver_sp)
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_resolver_sp->ResolveBreakpoint(*m_filter_sp);
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::ResolveBreakpointInModules (ModuleList &module_list)
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_resolver_sp)
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_resolver_sp->ResolveBreakpointInModules(*m_filter_sp, module_list);
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::ClearAllBreakpointSites ()
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_locations.ClearAllBreakpointSites();
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ModulesChanged: Pass in a list of new modules, and
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
35703e5e512252fc7971430027d8ea05f64576bcbb3Jim InghamBreakpoint::ModulesChanged (ModuleList &module_list, bool load, bool delete_locations)
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3599336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham    Mutex::Locker modules_mutex(module_list.GetMutex());
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (load)
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // The logic for handling new modules is:
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // 1) If the filter rejects this module, then skip it.
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // 2) Run through the current location list and if there are any locations
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        //    for that module, we mark the module as "seen" and we don't try to re-resolve
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        //    breakpoint locations for that module.
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        //    However, we do add breakpoint sites to these locations if needed.
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // 3) If we don't see this module in our breakpoint location list, call ResolveInModules.
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ModuleList new_modules;  // We'll stuff the "unseen" modules in this list, and then resolve
37119a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg Clayton                                 // them after the locations pass.  Have to do it this way because
37219a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg Clayton                                 // resolving breakpoints will add new locations potentially.
37319a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg Clayton
37419a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg Clayton        const size_t num_locs = m_locations.GetSize();
3759336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham        size_t num_modules = module_list.GetSize();
3769336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham        for (size_t i = 0; i < num_modules; i++)
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bool seen = false;
3799336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham            ModuleSP module_sp (module_list.GetModuleAtIndexUnlocked (i));
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!m_filter_sp->ModulePasses (module_sp))
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                continue;
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38319a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg Clayton            for (size_t loc_idx = 0; loc_idx < num_locs; loc_idx++)
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3857b9fcc06843d624787a9115d14285a6d6a6cca53Greg Clayton                BreakpointLocationSP break_loc = m_locations.GetByIndex(loc_idx);
3861de036b8b9898acb4c4cb13ed915ac19c55222c7Jim Ingham                if (!break_loc->IsEnabled())
3871de036b8b9898acb4c4cb13ed915ac19c55222c7Jim Ingham                    continue;
3883508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                SectionSP section_sp (break_loc->GetAddress().GetSection());
3893508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                if (!section_sp || section_sp->GetModule() == module_sp)
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (!seen)
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        seen = true;
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (!break_loc->ResolveBreakpointSite())
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
396952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton                        Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (log)
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            log->Printf ("Warning: could not set breakpoint site for breakpoint location %d of breakpoint %d.\n",
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         break_loc->GetID(), GetID());
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!seen)
405ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton                new_modules.AppendIfNeeded (module_sp);
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
40828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (new_modules.GetSize() > 0)
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
41128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham            // If this is not an internal breakpoint, set up to record the new locations, then dispatch
41228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham            // an event with the new locations.
41328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham            if (!IsInternal())
41428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham            {
41528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                BreakpointEventData *new_locations_event = new BreakpointEventData (eBreakpointEventTypeLocationsAdded,
41628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                                                                                    shared_from_this());
41728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
41828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                m_locations.StartRecordingNewLocations(new_locations_event->GetBreakpointLocationCollection());
41928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
42028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                ResolveBreakpointInModules(new_modules);
42128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
42228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                m_locations.StopRecordingNewLocations();
42328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                if (new_locations_event->GetBreakpointLocationCollection().GetSize() != 0)
42428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                {
42528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                    SendBreakpointChangedEvent (new_locations_event);
42628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                }
42728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                else
42828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                    delete new_locations_event;
42928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham            }
43028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham            else
43128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                ResolveBreakpointInModules(new_modules);
43228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Go through the currently set locations and if any have breakpoints in
43803e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham        // the module list, then remove their breakpoint sites, and their locations if asked to.
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        BreakpointEventData *removed_locations_event;
44128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        if (!IsInternal())
44228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham            removed_locations_event = new BreakpointEventData (eBreakpointEventTypeLocationsRemoved,
44328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                                                               shared_from_this());
44428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        else
44528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham            removed_locations_event = NULL;
4469336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham
4479336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham        size_t num_modules = module_list.GetSize();
4489336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham        for (size_t i = 0; i < num_modules; i++)
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
4509336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham            ModuleSP module_sp (module_list.GetModuleAtIndexUnlocked (i));
4517b9fcc06843d624787a9115d14285a6d6a6cca53Greg Clayton            if (m_filter_sp->ModulePasses (module_sp))
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
4533508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                size_t loc_idx = 0;
45403e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham                size_t num_locations = m_locations.GetSize();
45503e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham                BreakpointLocationCollection locations_to_remove;
45603e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham                for (loc_idx = 0; loc_idx < num_locations; loc_idx++)
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
4583508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                    BreakpointLocationSP break_loc_sp (m_locations.GetByIndex(loc_idx));
4593508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                    SectionSP section_sp (break_loc_sp->GetAddress().GetSection());
4603508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                    if (section_sp && section_sp->GetModule() == module_sp)
4617b9fcc06843d624787a9115d14285a6d6a6cca53Greg Clayton                    {
4627b9fcc06843d624787a9115d14285a6d6a6cca53Greg Clayton                        // Remove this breakpoint since the shared library is
4637b9fcc06843d624787a9115d14285a6d6a6cca53Greg Clayton                        // unloaded, but keep the breakpoint location around
4647b9fcc06843d624787a9115d14285a6d6a6cca53Greg Clayton                        // so we always get complete hit count and breakpoint
4657b9fcc06843d624787a9115d14285a6d6a6cca53Greg Clayton                        // lifetime info
4663508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                        break_loc_sp->ClearBreakpointSite();
46728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                        if (removed_locations_event)
46828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                        {
4693508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                            removed_locations_event->GetBreakpointLocationCollection().Add(break_loc_sp);
47028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                        }
47103e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham                        if (delete_locations)
47203e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham                            locations_to_remove.Add (break_loc_sp);
47303e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham
4747b9fcc06843d624787a9115d14285a6d6a6cca53Greg Clayton                    }
47503e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham                }
47603e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham
47703e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham                if (delete_locations)
47803e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham                {
47903e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham                    size_t num_locations_to_remove = locations_to_remove.GetSize();
48003e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham                    for (loc_idx = 0; loc_idx < num_locations_to_remove; loc_idx++)
48103e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham                        m_locations.RemoveLocation  (locations_to_remove.GetByIndex(loc_idx));
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
48528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        SendBreakpointChangedEvent (removed_locations_event);
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
49003e5e512252fc7971430027d8ea05f64576bcbb3Jim InghamBreakpoint::ModuleReplaced (ModuleSP old_module_sp, ModuleSP new_module_sp)
49103e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham{
49203e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    ModuleList temp_list;
49303e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    temp_list.Append (new_module_sp);
49403e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    ModulesChanged (temp_list, true);
49503e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham
49603e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    // TO DO: For now I'm just adding locations for the new module and removing the
49703e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    // breakpoint locations that were in the old module.
49803e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    // We should really go find the ones that are in the new module & if we can determine that they are "equivalent"
49903e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    // carry over the options from the old location to the new.
50003e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham
50103e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    temp_list.Clear();
50203e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    temp_list.Append (old_module_sp);
50303e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    ModulesChanged (temp_list, false, true);
50403e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham}
50503e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham
50603e5e512252fc7971430027d8ea05f64576bcbb3Jim Inghamvoid
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::Dump (Stream *)
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::GetNumResolvedLocations() const
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Return the number of breakpoints that are actually resolved and set
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // down in the inferior process.
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_locations.GetNumResolvedLocations();
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::GetNumLocations() const
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_locations.GetSize();
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_locations)
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5284f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham    assert (s != NULL);
5294f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham
530090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    if (!m_kind_description.empty())
531090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    {
532090f83176695d86197b0e86b67dee4160ec5003dJim Ingham        if (eDescriptionLevelBrief)
533090f83176695d86197b0e86b67dee4160ec5003dJim Ingham        {
534090f83176695d86197b0e86b67dee4160ec5003dJim Ingham            s->PutCString (GetBreakpointKind());
535090f83176695d86197b0e86b67dee4160ec5003dJim Ingham            return;
536090f83176695d86197b0e86b67dee4160ec5003dJim Ingham        }
537090f83176695d86197b0e86b67dee4160ec5003dJim Ingham        else
538090f83176695d86197b0e86b67dee4160ec5003dJim Ingham            s->Printf("Kind: %s\n", GetBreakpointKind ());
539090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    }
540090f83176695d86197b0e86b67dee4160ec5003dJim Ingham
541090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    const size_t num_locations = GetNumLocations ();
542090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    const size_t num_resolved_locations = GetNumResolvedLocations ();
5434f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham
5444f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham    // They just made the breakpoint, they don't need to be told HOW they made it...
5454f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham    // Also, we'll print the breakpoint number differently depending on whether there is 1 or more locations.
5464f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham    if (level != eDescriptionLevelInitial)
5474f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham    {
5484f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham        s->Printf("%i: ", GetID());
5494f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham        GetResolverDescription (s);
5504f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham        GetFilterDescription (s);
5514f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham    }
5524f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (level)
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case lldb::eDescriptionLevelBrief:
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case lldb::eDescriptionLevelFull:
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (num_locations > 0)
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
5595f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            s->Printf(", locations = %" PRIu64, (uint64_t)num_locations);
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (num_resolved_locations > 0)
5615f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                s->Printf(", resolved = %" PRIu64, (uint64_t)num_resolved_locations);
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
5654722b10307668368bf0f12fa6b8691e4f4cb5488Jim Ingham            // Don't print the pending notification for exception resolvers since we don't generally
5664722b10307668368bf0f12fa6b8691e4f4cb5488Jim Ingham            // know how to set them until the target is run.
5674722b10307668368bf0f12fa6b8691e4f4cb5488Jim Ingham            if (m_resolver_sp->getResolverID() != BreakpointResolver::ExceptionResolver)
5684722b10307668368bf0f12fa6b8691e4f4cb5488Jim Ingham                s->Printf(", locations = 0 (pending)");
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
571649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham        GetOptions()->GetDescription(s, level);
572649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (level == lldb::eDescriptionLevelFull)
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
575649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham            s->IndentLess();
576649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham            s->EOL();
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
5794f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham
5804f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham    case lldb::eDescriptionLevelInitial:
5814f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham        s->Printf ("Breakpoint %i: ", GetID());
5824f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham        if (num_locations == 0)
5834f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham        {
5844f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham            s->Printf ("no locations (pending).");
5854f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham        }
5864f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham        else if (num_locations == 1)
5874f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham        {
5884f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham            // If there is one location only, we'll just print that location information.  But don't do this if
5894f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham            // show locations is true, then that will be handled below.
5904f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham            if (show_locations == false)
5914f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham            {
5924f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham                GetLocationAtIndex(0)->GetDescription(s, level);
5934f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham            }
5944f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham            else
5954f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham            {
5964f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham                s->Printf ("%zd locations.", num_locations);
5974f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham            }
5984f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham        }
5994f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham        else
6004f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham        {
6014f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham            s->Printf ("%zd locations.", num_locations);
6024f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham        }
6034f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham        s->EOL();
6044f61ba926fdcc03d71a1b5db88c18d1e94ed9fd8Jim Ingham        break;
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case lldb::eDescriptionLevelVerbose:
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Verbose mode does a debug dump of the breakpoint
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Dump (s);
608649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham        s->EOL ();
609b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            //s->Indent();
610649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham        GetOptions()->GetDescription(s, level);
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
61254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton
61354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    default:
61454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        break;
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6171cd466fc021b593f3aa2f675a4c6c23b8420f941Jim Ingham    // The brief description is just the location name (1.2 or whatever).  That's pointless to
6181cd466fc021b593f3aa2f675a4c6c23b8420f941Jim Ingham    // show in the breakpoint's description, so suppress it.
6191cd466fc021b593f3aa2f675a4c6c23b8420f941Jim Ingham    if (show_locations && level != lldb::eDescriptionLevelBrief)
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->IndentMore();
62254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        for (size_t i = 0; i < num_locations; ++i)
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            BreakpointLocation *loc = GetLocationAtIndex(i).get();
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            loc->GetDescription(s, level);
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            s->EOL();
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->IndentLess();
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6325f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Inghamvoid
6335f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim InghamBreakpoint::GetResolverDescription (Stream *s)
6345f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham{
6355f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham    if (m_resolver_sp)
6365f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham        m_resolver_sp->GetDescription (s);
6375f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham}
6385f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham
6395f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham
6405f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Inghambool
6415f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim InghamBreakpoint::GetMatchingFileLine (const ConstString &filename, uint32_t line_number, BreakpointLocationCollection &loc_coll)
6425f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham{
6435f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham    // TODO: To be correct, this method needs to fill the breakpoint location collection
6445f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham    //       with the location IDs which match the filename and line_number.
6455f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham    //
6465f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham
6475f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham    if (m_resolver_sp)
6485f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham    {
6495f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham        BreakpointResolverFileLine *resolverFileLine = dyn_cast<BreakpointResolverFileLine>(m_resolver_sp.get());
6505f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham        if (resolverFileLine &&
6515f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham            resolverFileLine->m_file_spec.GetFilename() == filename &&
6525f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham            resolverFileLine->m_line_number == line_number)
6535f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham        {
6545f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham            return true;
6555f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham        }
6565f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham    }
6575f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham    return false;
6585f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham}
6595f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham
6605f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Inghamvoid
6615f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim InghamBreakpoint::GetFilterDescription (Stream *s)
6625f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham{
6635f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham    m_filter_sp->GetDescription (s);
6645f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham}
6655f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham
6665f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Inghamvoid
6675f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim InghamBreakpoint::SendBreakpointChangedEvent (lldb::BreakpointEventType eventKind)
6685f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham{
6695f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham    if (!m_being_created
6705f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham        && !IsInternal()
6715f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham        && GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
6725f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham    {
6735f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham        BreakpointEventData *data = new Breakpoint::BreakpointEventData (eventKind, shared_from_this());
6745f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham
6755f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham        GetTarget().BroadcastEvent (Target::eBroadcastBitBreakpointChanged, data);
6765f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham    }
6775f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham}
6785f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham
6795f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Inghamvoid
6805f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim InghamBreakpoint::SendBreakpointChangedEvent (BreakpointEventData *data)
6815f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham{
6825f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham
6835f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham    if (data == NULL)
6845f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham        return;
6855f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham
6865f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham    if (!m_being_created
6875f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham        && !IsInternal()
6885f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham        && GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
6895f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham        GetTarget().BroadcastEvent (Target::eBroadcastBitBreakpointChanged, data);
6905f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham    else
6915f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham        delete data;
6925f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham}
6935f4f327f5675cd2a65c2afb8c8482bdec5404dd7Jim Ingham
694c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg ClaytonBreakpoint::BreakpointEventData::BreakpointEventData (BreakpointEventType sub_type,
69528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                                                      const BreakpointSP &new_breakpoint_sp) :
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    EventData (),
697c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    m_breakpoint_event (sub_type),
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_new_breakpoint_sp (new_breakpoint_sp)
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::BreakpointEventData::~BreakpointEventData ()
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::BreakpointEventData::GetFlavorString ()
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static ConstString g_flavor ("Breakpoint::BreakpointEventData");
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return g_flavor;
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::BreakpointEventData::GetFlavor () const
71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return BreakpointEventData::GetFlavorString ();
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointSP &
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::BreakpointEventData::GetBreakpoint ()
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_new_breakpoint_sp;
72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
726c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg ClaytonBreakpointEventType
727c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg ClaytonBreakpoint::BreakpointEventData::GetBreakpointEventType () const
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
729c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    return m_breakpoint_event;
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::BreakpointEventData::Dump (Stream *s) const
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Inghamconst Breakpoint::BreakpointEventData *
73828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim InghamBreakpoint::BreakpointEventData::GetEventDataFromEvent (const Event *event)
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    if (event)
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
74228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        const EventData *event_data = event->GetData();
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (event_data && event_data->GetFlavor() == BreakpointEventData::GetFlavorString())
74428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham            return static_cast <const BreakpointEventData *> (event->GetData());
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
749c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg ClaytonBreakpointEventType
750c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg ClaytonBreakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent (const EventSP &event_sp)
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
75228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    const BreakpointEventData *data = GetEventDataFromEvent (event_sp.get());
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data == NULL)
755c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        return eBreakpointEventTypeInvalidType;
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
757c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        return data->GetBreakpointEventType();
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointSP
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpoint::BreakpointEventData::GetBreakpointFromEvent (const EventSP &event_sp)
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
763c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    BreakpointSP bp_sp;
764c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton
76528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    const BreakpointEventData *data = GetEventDataFromEvent (event_sp.get());
766c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    if (data)
76728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        bp_sp = data->m_new_breakpoint_sp;
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
769c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    return bp_sp;
770c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton}
771c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton
77236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
77328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim InghamBreakpoint::BreakpointEventData::GetNumBreakpointLocationsFromEvent (const EventSP &event_sp)
77428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham{
77528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    const BreakpointEventData *data = GetEventDataFromEvent (event_sp.get());
77628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    if (data)
77728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        return data->m_locations.GetSize();
77828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
77928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    return 0;
78028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham}
78128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
782c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Claytonlldb::BreakpointLocationSP
783c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg ClaytonBreakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent (const lldb::EventSP &event_sp, uint32_t bp_loc_idx)
784c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton{
785c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    lldb::BreakpointLocationSP bp_loc_sp;
786c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton
78728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    const BreakpointEventData *data = GetEventDataFromEvent (event_sp.get());
788c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    if (data)
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
79028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        bp_loc_sp = data->m_locations.GetByIndex(bp_loc_idx);
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
792c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton
793c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    return bp_loc_sp;
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
795