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