blob: c0ae1c56b246fbbd687021f2af822c26cef1146e [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- BreakpointLocation.cpp ----------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// C Includes
11// C++ Includes
12#include <string>
13
14// Other libraries and framework includes
15// Project includes
16#include "lldb/Breakpoint/BreakpointLocation.h"
17#include "lldb/Breakpoint/BreakpointID.h"
18#include "lldb/Breakpoint/StoppointCallbackContext.h"
Jim Inghame5ed8e92011-06-02 23:58:26 +000019#include "lldb/Core/Debugger.h"
Chris Lattner24943d22010-06-08 16:52:24 +000020#include "lldb/Core/Log.h"
21#include "lldb/Target/Target.h"
Jim Inghamd1686902010-10-14 23:45:03 +000022#include "lldb/Target/ThreadPlan.h"
Chris Lattner24943d22010-06-08 16:52:24 +000023#include "lldb/Target/Process.h"
24#include "lldb/Core/StreamString.h"
25#include "lldb/lldb-private-log.h"
26#include "lldb/Target/Thread.h"
Jim Ingham3c7b5b92010-06-16 02:00:15 +000027#include "lldb/Target/ThreadSpec.h"
Chris Lattner24943d22010-06-08 16:52:24 +000028
29using namespace lldb;
30using namespace lldb_private;
31
32BreakpointLocation::BreakpointLocation
33(
34 break_id_t loc_id,
35 Breakpoint &owner,
Greg Clayton19a1ab82011-02-05 00:38:04 +000036 const Address &addr,
Chris Lattner24943d22010-06-08 16:52:24 +000037 lldb::tid_t tid,
38 bool hardware
39) :
Greg Claytonc0fa5332011-05-22 22:46:53 +000040 StoppointLocation (loc_id, addr.GetOpcodeLoadAddress(&owner.GetTarget()), hardware),
Jim Ingham28e23862012-02-08 05:23:15 +000041 m_being_created(true),
Chris Lattner24943d22010-06-08 16:52:24 +000042 m_address (addr),
43 m_owner (owner),
44 m_options_ap (),
45 m_bp_site_sp ()
46{
Jim Ingham3c7b5b92010-06-16 02:00:15 +000047 SetThreadID (tid);
Jim Ingham28e23862012-02-08 05:23:15 +000048 m_being_created = false;
Chris Lattner24943d22010-06-08 16:52:24 +000049}
50
51BreakpointLocation::~BreakpointLocation()
52{
53 ClearBreakpointSite();
54}
55
56lldb::addr_t
Greg Clayton273a8e52010-06-14 04:18:27 +000057BreakpointLocation::GetLoadAddress () const
Chris Lattner24943d22010-06-08 16:52:24 +000058{
Greg Claytonc0fa5332011-05-22 22:46:53 +000059 return m_address.GetOpcodeLoadAddress (&m_owner.GetTarget());
Chris Lattner24943d22010-06-08 16:52:24 +000060}
61
62Address &
63BreakpointLocation::GetAddress ()
64{
65 return m_address;
66}
67
68Breakpoint &
69BreakpointLocation::GetBreakpoint ()
70{
71 return m_owner;
72}
73
74bool
Johnny Chenca4fe802012-02-01 19:05:20 +000075BreakpointLocation::IsEnabled () const
Chris Lattner24943d22010-06-08 16:52:24 +000076{
Johnny Chenfd60a602012-01-30 22:48:10 +000077 if (!m_owner.IsEnabled())
78 return false;
79 else if (m_options_ap.get() != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +000080 return m_options_ap->IsEnabled();
81 else
Johnny Chenfd60a602012-01-30 22:48:10 +000082 return true;
Chris Lattner24943d22010-06-08 16:52:24 +000083}
84
85void
86BreakpointLocation::SetEnabled (bool enabled)
87{
88 GetLocationOptions()->SetEnabled(enabled);
89 if (enabled)
90 {
91 ResolveBreakpointSite();
92 }
93 else
94 {
95 ClearBreakpointSite();
96 }
Jim Ingham28e23862012-02-08 05:23:15 +000097 SendBreakpointLocationChangedEvent (enabled ? eBreakpointEventTypeEnabled : eBreakpointEventTypeDisabled);
Chris Lattner24943d22010-06-08 16:52:24 +000098}
99
100void
101BreakpointLocation::SetThreadID (lldb::tid_t thread_id)
102{
Jim Ingham3c7b5b92010-06-16 02:00:15 +0000103 if (thread_id != LLDB_INVALID_THREAD_ID)
104 GetLocationOptions()->SetThreadID(thread_id);
105 else
106 {
107 // If we're resetting this to an invalid thread id, then
108 // don't make an options pointer just to do that.
109 if (m_options_ap.get() != NULL)
110 m_options_ap->SetThreadID (thread_id);
111 }
Jim Ingham28e23862012-02-08 05:23:15 +0000112 SendBreakpointLocationChangedEvent (eBreakpointEventTypeThreadChanged);
113}
114
115lldb::tid_t
116BreakpointLocation::GetThreadID ()
117{
118 if (GetOptionsNoCreate()->GetThreadSpecNoCreate())
119 return GetOptionsNoCreate()->GetThreadSpecNoCreate()->GetTID();
120 else
121 return LLDB_INVALID_THREAD_ID;
122}
123
124void
125BreakpointLocation::SetThreadIndex (uint32_t index)
126{
127 if (index != 0)
128 GetLocationOptions()->GetThreadSpec()->SetIndex(index);
129 else
130 {
131 // If we're resetting this to an invalid thread id, then
132 // don't make an options pointer just to do that.
133 if (m_options_ap.get() != NULL)
134 m_options_ap->GetThreadSpec()->SetIndex(index);
135 }
136 SendBreakpointLocationChangedEvent (eBreakpointEventTypeThreadChanged);
137
138}
139
140uint32_t
141BreakpointLocation::GetThreadIndex() const
142{
143 if (GetOptionsNoCreate()->GetThreadSpecNoCreate())
144 return GetOptionsNoCreate()->GetThreadSpecNoCreate()->GetIndex();
145 else
146 return 0;
147}
148
149void
150BreakpointLocation::SetThreadName (const char *thread_name)
151{
152 if (thread_name != NULL)
153 GetLocationOptions()->GetThreadSpec()->SetName(thread_name);
154 else
155 {
156 // If we're resetting this to an invalid thread id, then
157 // don't make an options pointer just to do that.
158 if (m_options_ap.get() != NULL)
159 m_options_ap->GetThreadSpec()->SetName(thread_name);
160 }
161 SendBreakpointLocationChangedEvent (eBreakpointEventTypeThreadChanged);
162}
163
164const char *
165BreakpointLocation::GetThreadName () const
166{
167 if (GetOptionsNoCreate()->GetThreadSpecNoCreate())
168 return GetOptionsNoCreate()->GetThreadSpecNoCreate()->GetName();
169 else
170 return NULL;
171}
172
173void
174BreakpointLocation::SetQueueName (const char *queue_name)
175{
176 if (queue_name != NULL)
177 GetLocationOptions()->GetThreadSpec()->SetQueueName(queue_name);
178 else
179 {
180 // If we're resetting this to an invalid thread id, then
181 // don't make an options pointer just to do that.
182 if (m_options_ap.get() != NULL)
183 m_options_ap->GetThreadSpec()->SetQueueName(queue_name);
184 }
185 SendBreakpointLocationChangedEvent (eBreakpointEventTypeThreadChanged);
186}
187
188const char *
189BreakpointLocation::GetQueueName () const
190{
191 if (GetOptionsNoCreate()->GetThreadSpecNoCreate())
192 return GetOptionsNoCreate()->GetThreadSpecNoCreate()->GetQueueName();
193 else
194 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000195}
196
197bool
198BreakpointLocation::InvokeCallback (StoppointCallbackContext *context)
199{
Jim Ingham649492b2010-06-18 01:00:58 +0000200 if (m_options_ap.get() != NULL && m_options_ap->HasCallback())
Chris Lattner24943d22010-06-08 16:52:24 +0000201 return m_options_ap->InvokeCallback (context, m_owner.GetID(), GetID());
Jim Ingham649492b2010-06-18 01:00:58 +0000202 else
203 return m_owner.InvokeCallback (context, GetID());
Chris Lattner24943d22010-06-08 16:52:24 +0000204}
205
206void
207BreakpointLocation::SetCallback (BreakpointHitCallback callback, void *baton,
208 bool is_synchronous)
209{
210 // The default "Baton" class will keep a copy of "baton" and won't free
211 // or delete it when it goes goes out of scope.
212 GetLocationOptions()->SetCallback(callback, BatonSP (new Baton(baton)), is_synchronous);
Jim Ingham28e23862012-02-08 05:23:15 +0000213 SendBreakpointLocationChangedEvent (eBreakpointEventTypeCommandChanged);
Chris Lattner24943d22010-06-08 16:52:24 +0000214}
215
216void
217BreakpointLocation::SetCallback (BreakpointHitCallback callback, const BatonSP &baton_sp,
218 bool is_synchronous)
219{
220 GetLocationOptions()->SetCallback (callback, baton_sp, is_synchronous);
Jim Ingham28e23862012-02-08 05:23:15 +0000221 SendBreakpointLocationChangedEvent (eBreakpointEventTypeCommandChanged);
Chris Lattner24943d22010-06-08 16:52:24 +0000222}
223
Jim Inghamd1686902010-10-14 23:45:03 +0000224
Chris Lattner24943d22010-06-08 16:52:24 +0000225void
226BreakpointLocation::ClearCallback ()
227{
228 GetLocationOptions()->ClearCallback();
229}
230
Jim Inghamd1686902010-10-14 23:45:03 +0000231void
232BreakpointLocation::SetCondition (const char *condition)
233{
234 GetLocationOptions()->SetCondition (condition);
Jim Ingham28e23862012-02-08 05:23:15 +0000235 SendBreakpointLocationChangedEvent (eBreakpointEventTypeConditionChanged);
Jim Inghamd1686902010-10-14 23:45:03 +0000236}
237
Jim Inghamd1686902010-10-14 23:45:03 +0000238const char *
Jim Inghamac354422011-06-15 21:16:00 +0000239BreakpointLocation::GetConditionText () const
Jim Inghamd1686902010-10-14 23:45:03 +0000240{
Jim Inghamac354422011-06-15 21:16:00 +0000241 return GetOptionsNoCreate()->GetConditionText();
Jim Inghamd1686902010-10-14 23:45:03 +0000242}
243
Greg Clayton54e7afa2010-07-09 20:39:50 +0000244uint32_t
Chris Lattner24943d22010-06-08 16:52:24 +0000245BreakpointLocation::GetIgnoreCount ()
246{
Jim Ingham9c6898b2010-06-22 21:12:54 +0000247 return GetOptionsNoCreate()->GetIgnoreCount();
Chris Lattner24943d22010-06-08 16:52:24 +0000248}
249
250void
Greg Clayton54e7afa2010-07-09 20:39:50 +0000251BreakpointLocation::SetIgnoreCount (uint32_t n)
Chris Lattner24943d22010-06-08 16:52:24 +0000252{
253 GetLocationOptions()->SetIgnoreCount(n);
Jim Ingham28e23862012-02-08 05:23:15 +0000254 SendBreakpointLocationChangedEvent (eBreakpointEventTypeIgnoreChanged);
Chris Lattner24943d22010-06-08 16:52:24 +0000255}
256
Jim Inghamfdbd10a2012-06-26 22:27:55 +0000257void
258BreakpointLocation::DecrementIgnoreCount()
259{
260 if (m_options_ap.get() != NULL)
261 {
262 uint32_t loc_ignore = m_options_ap->GetIgnoreCount();
263 if (loc_ignore != 0)
264 m_options_ap->SetIgnoreCount(loc_ignore - 1);
265 }
266}
267
268bool
269BreakpointLocation::IgnoreCountShouldStop()
270{
271 if (m_options_ap.get() != NULL)
272 {
273 uint32_t loc_ignore = m_options_ap->GetIgnoreCount();
274 if (loc_ignore != 0)
275 {
276 m_owner.DecrementIgnoreCount();
277 DecrementIgnoreCount(); // Have to decrement our owners' ignore count, since it won't get a
278 // chance to.
279 return false;
280 }
281 }
282 return true;
283}
284
Jim Ingham3c7b5b92010-06-16 02:00:15 +0000285const BreakpointOptions *
Jim Ingham9c6898b2010-06-22 21:12:54 +0000286BreakpointLocation::GetOptionsNoCreate () const
Chris Lattner24943d22010-06-08 16:52:24 +0000287{
288 if (m_options_ap.get() != NULL)
289 return m_options_ap.get();
290 else
291 return m_owner.GetOptions ();
292}
293
294BreakpointOptions *
295BreakpointLocation::GetLocationOptions ()
296{
Jim Ingham649492b2010-06-18 01:00:58 +0000297 // If we make the copy we don't copy the callbacks because that is potentially
298 // expensive and we don't want to do that for the simple case where someone is
299 // just disabling the location.
Chris Lattner24943d22010-06-08 16:52:24 +0000300 if (m_options_ap.get() == NULL)
Jim Ingham649492b2010-06-18 01:00:58 +0000301 m_options_ap.reset(BreakpointOptions::CopyOptionsNoCallback(*m_owner.GetOptions ()));
302
Chris Lattner24943d22010-06-08 16:52:24 +0000303 return m_options_ap.get();
304}
305
Jim Ingham3c7b5b92010-06-16 02:00:15 +0000306bool
307BreakpointLocation::ValidForThisThread (Thread *thread)
308{
Jim Ingham9c6898b2010-06-22 21:12:54 +0000309 return thread->MatchesSpec(GetOptionsNoCreate()->GetThreadSpecNoCreate());
Jim Ingham3c7b5b92010-06-16 02:00:15 +0000310}
311
Chris Lattner24943d22010-06-08 16:52:24 +0000312// RETURNS - true if we should stop at this breakpoint, false if we
Jim Ingham3c7b5b92010-06-16 02:00:15 +0000313// should continue. Note, we don't check the thread spec for the breakpoint
314// here, since if the breakpoint is not for this thread, then the event won't
315// even get reported, so the check is redundant.
Chris Lattner24943d22010-06-08 16:52:24 +0000316
317bool
318BreakpointLocation::ShouldStop (StoppointCallbackContext *context)
319{
320 bool should_stop = true;
Greg Claytone005f2c2010-11-06 01:53:30 +0000321 LogSP log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS);
Chris Lattner24943d22010-06-08 16:52:24 +0000322
Johnny Chen51b7c5f2012-01-23 23:03:59 +0000323 IncrementHitCount();
Chris Lattner24943d22010-06-08 16:52:24 +0000324
325 if (!IsEnabled())
326 return false;
327
Jim Inghamfdbd10a2012-06-26 22:27:55 +0000328 if (!IgnoreCountShouldStop())
329 return false;
330
331 if (!m_owner.IgnoreCountShouldStop())
Chris Lattner24943d22010-06-08 16:52:24 +0000332 return false;
333
Jim Inghamd1686902010-10-14 23:45:03 +0000334 // We only run synchronous callbacks in ShouldStop:
Chris Lattner24943d22010-06-08 16:52:24 +0000335 context->is_synchronous = true;
336 should_stop = InvokeCallback (context);
Jim Inghamd1686902010-10-14 23:45:03 +0000337
Jim Inghame5ed8e92011-06-02 23:58:26 +0000338 if (log)
Jim Inghamd1686902010-10-14 23:45:03 +0000339 {
Jim Inghame5ed8e92011-06-02 23:58:26 +0000340 StreamString s;
341 GetDescription (&s, lldb::eDescriptionLevelVerbose);
342 log->Printf ("Hit breakpoint location: %s, %s.\n", s.GetData(), should_stop ? "stopping" : "continuing");
Chris Lattner24943d22010-06-08 16:52:24 +0000343 }
Jim Inghame5ed8e92011-06-02 23:58:26 +0000344
Chris Lattner24943d22010-06-08 16:52:24 +0000345 return should_stop;
346}
347
348bool
349BreakpointLocation::IsResolved () const
350{
351 return m_bp_site_sp.get() != NULL;
352}
353
Jim Inghamd1686902010-10-14 23:45:03 +0000354lldb::BreakpointSiteSP
355BreakpointLocation::GetBreakpointSite() const
356{
357 return m_bp_site_sp;
358}
359
Chris Lattner24943d22010-06-08 16:52:24 +0000360bool
361BreakpointLocation::ResolveBreakpointSite ()
362{
363 if (m_bp_site_sp)
364 return true;
365
Greg Claytoneea26402010-09-14 23:36:40 +0000366 Process *process = m_owner.GetTarget().GetProcessSP().get();
Chris Lattner24943d22010-06-08 16:52:24 +0000367 if (process == NULL)
368 return false;
369
Greg Claytoneea26402010-09-14 23:36:40 +0000370 if (m_owner.GetTarget().GetSectionLoadList().IsEmpty())
371 return false;
372
Greg Clayton13d24fb2012-01-29 20:56:30 +0000373 lldb::break_id_t new_id = process->CreateBreakpointSite (shared_from_this(), false);
Chris Lattner24943d22010-06-08 16:52:24 +0000374
Stephen Wilson3fd1f362010-07-17 00:56:13 +0000375 if (new_id == LLDB_INVALID_BREAK_ID)
Chris Lattner24943d22010-06-08 16:52:24 +0000376 {
Greg Claytone005f2c2010-11-06 01:53:30 +0000377 LogSP log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS);
Chris Lattner24943d22010-06-08 16:52:24 +0000378 if (log)
379 log->Warning ("Tried to add breakpoint site at 0x%llx but it was already present.\n",
Greg Claytonc0fa5332011-05-22 22:46:53 +0000380 m_address.GetOpcodeLoadAddress (&m_owner.GetTarget()));
Chris Lattner24943d22010-06-08 16:52:24 +0000381 return false;
382 }
383
384 return true;
385}
386
387bool
388BreakpointLocation::SetBreakpointSite (BreakpointSiteSP& bp_site_sp)
389{
390 m_bp_site_sp = bp_site_sp;
391 return true;
392}
393
394bool
395BreakpointLocation::ClearBreakpointSite ()
396{
397 if (m_bp_site_sp.get())
398 {
Jim Ingham649492b2010-06-18 01:00:58 +0000399 m_owner.GetTarget().GetProcessSP()->RemoveOwnerFromBreakpointSite (GetBreakpoint().GetID(),
400 GetID(), m_bp_site_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000401 m_bp_site_sp.reset();
402 return true;
403 }
404 return false;
405}
406
407void
408BreakpointLocation::GetDescription (Stream *s, lldb::DescriptionLevel level)
409{
410 SymbolContext sc;
411 s->Indent();
412 BreakpointID::GetCanonicalReference(s, m_owner.GetID(), GetID());
413
414 if (level == lldb::eDescriptionLevelBrief)
415 return;
416
417 s->PutCString(": ");
418
419 if (level == lldb::eDescriptionLevelVerbose)
420 s->IndentMore();
421
422 if (m_address.IsSectionOffset())
423 {
424 m_address.CalculateSymbolContext(&sc);
425
426 if (level == lldb::eDescriptionLevelFull)
427 {
428 s->PutCString("where = ");
Greg Clayton5205f0b2010-09-03 17:10:42 +0000429 sc.DumpStopContext (s, m_owner.GetTarget().GetProcessSP().get(), m_address, false, true, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000430 }
431 else
432 {
433 if (sc.module_sp)
434 {
435 s->EOL();
436 s->Indent("module = ");
437 sc.module_sp->GetFileSpec().Dump (s);
438 }
439
440 if (sc.comp_unit != NULL)
441 {
442 s->EOL();
443 s->Indent("compile unit = ");
Jim Ingham7ea35232010-10-27 22:58:34 +0000444 static_cast<FileSpec*>(sc.comp_unit)->GetFilename().Dump (s);
Chris Lattner24943d22010-06-08 16:52:24 +0000445
446 if (sc.function != NULL)
447 {
448 s->EOL();
449 s->Indent("function = ");
450 s->PutCString (sc.function->GetMangled().GetName().AsCString("<unknown>"));
451 }
452
453 if (sc.line_entry.line > 0)
454 {
455 s->EOL();
456 s->Indent("location = ");
Greg Clayton72b71582010-09-02 21:44:10 +0000457 sc.line_entry.DumpStopContext (s, true);
Chris Lattner24943d22010-06-08 16:52:24 +0000458 }
459
460 }
461 else
462 {
463 // If we don't have a comp unit, see if we have a symbol we can print.
464 if (sc.symbol)
465 {
466 s->EOL();
467 s->Indent("symbol = ");
468 s->PutCString(sc.symbol->GetMangled().GetName().AsCString("<unknown>"));
469 }
470 }
471 }
472 }
473
474 if (level == lldb::eDescriptionLevelVerbose)
475 {
476 s->EOL();
477 s->Indent();
478 }
479 s->Printf ("%saddress = ", (level == lldb::eDescriptionLevelFull && m_address.IsSectionOffset()) ? ", " : "");
480 ExecutionContextScope *exe_scope = NULL;
481 Target *target = &m_owner.GetTarget();
482 if (target)
483 exe_scope = target->GetProcessSP().get();
484 if (exe_scope == NULL)
485 exe_scope = target;
486
487 m_address.Dump(s, exe_scope, Address::DumpStyleLoadAddress, Address::DumpStyleModuleWithFileAddress);
488
489 if (level == lldb::eDescriptionLevelVerbose)
490 {
491 s->EOL();
492 s->Indent();
493 s->Printf("resolved = %s\n", IsResolved() ? "true" : "false");
494
495 s->Indent();
Chris Lattner24943d22010-06-08 16:52:24 +0000496 s->Printf ("hit count = %-4u\n", GetHitCount());
497
498 if (m_options_ap.get())
499 {
Jim Ingham649492b2010-06-18 01:00:58 +0000500 s->Indent();
501 m_options_ap->GetDescription (s, level);
502 s->EOL();
Chris Lattner24943d22010-06-08 16:52:24 +0000503 }
504 s->IndentLess();
505 }
506 else
507 {
Jim Ingham649492b2010-06-18 01:00:58 +0000508 s->Printf(", %sresolved, hit count = %u ",
Chris Lattner24943d22010-06-08 16:52:24 +0000509 (IsResolved() ? "" : "un"),
Chris Lattner24943d22010-06-08 16:52:24 +0000510 GetHitCount());
Jim Ingham649492b2010-06-18 01:00:58 +0000511 if (m_options_ap.get())
512 {
513 m_options_ap->GetDescription (s, level);
514 }
Chris Lattner24943d22010-06-08 16:52:24 +0000515 }
516}
517
518void
519BreakpointLocation::Dump(Stream *s) const
520{
521 if (s == NULL)
522 return;
523
Greg Claytond9919d32011-12-01 23:28:38 +0000524 s->Printf("BreakpointLocation %u: tid = %4.4llx load addr = 0x%8.8llx state = %s type = %s breakpoint "
Jim Ingham649492b2010-06-18 01:00:58 +0000525 "hw_index = %i hit_count = %-4u ignore_count = %-4u",
Johnny Chenf8c0fc52012-01-26 00:08:14 +0000526 GetID(),
527 GetOptionsNoCreate()->GetThreadSpecNoCreate()->GetTID(),
528 (uint64_t) m_address.GetOpcodeLoadAddress (&m_owner.GetTarget()),
Johnny Chenfd60a602012-01-30 22:48:10 +0000529 (m_options_ap.get() ? m_options_ap->IsEnabled() : m_owner.IsEnabled()) ? "enabled " : "disabled",
Johnny Chenf8c0fc52012-01-26 00:08:14 +0000530 IsHardware() ? "hardware" : "software",
531 GetHardwareIndex(),
532 GetHitCount(),
533 GetOptionsNoCreate()->GetIgnoreCount());
Chris Lattner24943d22010-06-08 16:52:24 +0000534}
Jim Ingham28e23862012-02-08 05:23:15 +0000535
536void
537BreakpointLocation::SendBreakpointLocationChangedEvent (lldb::BreakpointEventType eventKind)
538{
539 if (!m_being_created
540 && !m_owner.IsInternal()
541 && m_owner.GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
542 {
543 Breakpoint::BreakpointEventData *data = new Breakpoint::BreakpointEventData (eventKind,
544 m_owner.shared_from_this());
545 data->GetBreakpointLocationCollection().Add (shared_from_this());
546 m_owner.GetTarget().BroadcastEvent (Target::eBroadcastBitBreakpointChanged, data);
547 }
548}
549