blob: 7a897661e76ddf38678e5ff4cdcb024476159c8f [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- Breakpoint.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
11// C Includes
12// C++ Includes
13// Other libraries and framework includes
14// Project includes
15
16#include "lldb/Core/Address.h"
17#include "lldb/Breakpoint/Breakpoint.h"
18#include "lldb/Breakpoint/BreakpointLocation.h"
Johnny Chena62ad7c2010-10-28 17:27:46 +000019#include "lldb/Breakpoint/BreakpointLocationCollection.h"
Chris Lattner24943d22010-06-08 16:52:24 +000020#include "lldb/Breakpoint/BreakpointResolver.h"
Johnny Chena62ad7c2010-10-28 17:27:46 +000021#include "lldb/Breakpoint/BreakpointResolverFileLine.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Core/Log.h"
23#include "lldb/Core/ModuleList.h"
24#include "lldb/Core/SearchFilter.h"
25#include "lldb/Core/Stream.h"
26#include "lldb/Core/StreamString.h"
27#include "lldb/Symbol/SymbolContext.h"
28#include "lldb/Target/Target.h"
Jim Ingham3c7b5b92010-06-16 02:00:15 +000029#include "lldb/Target/ThreadSpec.h"
Chris Lattner24943d22010-06-08 16:52:24 +000030#include "lldb/lldb-private-log.h"
Johnny Chena62ad7c2010-10-28 17:27:46 +000031#include "llvm/Support/Casting.h"
Chris Lattner24943d22010-06-08 16:52:24 +000032
33using namespace lldb;
34using namespace lldb_private;
Johnny Chena62ad7c2010-10-28 17:27:46 +000035using namespace llvm;
Chris Lattner24943d22010-06-08 16:52:24 +000036
37const ConstString &
38Breakpoint::GetEventIdentifier ()
39{
40 static ConstString g_identifier("event-identifier.breakpoint.changed");
41 return g_identifier;
42}
43
44//----------------------------------------------------------------------
45// Breakpoint constructor
46//----------------------------------------------------------------------
47Breakpoint::Breakpoint(Target &target, SearchFilterSP &filter_sp, BreakpointResolverSP &resolver_sp) :
Jim Ingham28e23862012-02-08 05:23:15 +000048 m_being_created(true),
Chris Lattner24943d22010-06-08 16:52:24 +000049 m_target (target),
50 m_filter_sp (filter_sp),
51 m_resolver_sp (resolver_sp),
52 m_options (),
Jim Ingham28e23862012-02-08 05:23:15 +000053 m_locations (*this)
Chris Lattner24943d22010-06-08 16:52:24 +000054{
Jim Ingham28e23862012-02-08 05:23:15 +000055 m_being_created = false;
Chris Lattner24943d22010-06-08 16:52:24 +000056}
57
58//----------------------------------------------------------------------
59// Destructor
60//----------------------------------------------------------------------
61Breakpoint::~Breakpoint()
62{
63}
64
65bool
66Breakpoint::IsInternal () const
67{
68 return LLDB_BREAK_ID_IS_INTERNAL(m_bid);
69}
70
71
72
73Target&
74Breakpoint::GetTarget ()
75{
76 return m_target;
77}
78
79const Target&
80Breakpoint::GetTarget () const
81{
82 return m_target;
83}
84
85BreakpointLocationSP
Greg Clayton19a1ab82011-02-05 00:38:04 +000086Breakpoint::AddLocation (const Address &addr, bool *new_location)
Chris Lattner24943d22010-06-08 16:52:24 +000087{
Jim Ingham28e23862012-02-08 05:23:15 +000088 return m_locations.AddLocation (addr, new_location);
Chris Lattner24943d22010-06-08 16:52:24 +000089}
90
91BreakpointLocationSP
Greg Clayton19a1ab82011-02-05 00:38:04 +000092Breakpoint::FindLocationByAddress (const Address &addr)
Chris Lattner24943d22010-06-08 16:52:24 +000093{
94 return m_locations.FindByAddress(addr);
95}
96
97break_id_t
Greg Clayton19a1ab82011-02-05 00:38:04 +000098Breakpoint::FindLocationIDByAddress (const Address &addr)
Chris Lattner24943d22010-06-08 16:52:24 +000099{
100 return m_locations.FindIDByAddress(addr);
101}
102
103BreakpointLocationSP
104Breakpoint::FindLocationByID (break_id_t bp_loc_id)
105{
106 return m_locations.FindByID(bp_loc_id);
107}
108
109BreakpointLocationSP
110Breakpoint::GetLocationAtIndex (uint32_t index)
111{
112 return m_locations.GetByIndex(index);
113}
114
Chris Lattner24943d22010-06-08 16:52:24 +0000115// For each of the overall options we need to decide how they propagate to
116// the location options. This will determine the precedence of options on
Johnny Chen736f0d62012-01-25 23:08:23 +0000117// the breakpoint vs. its locations.
Chris Lattner24943d22010-06-08 16:52:24 +0000118
119// Disable at the breakpoint level should override the location settings.
120// That way you can conveniently turn off a whole breakpoint without messing
121// up the individual settings.
122
123void
124Breakpoint::SetEnabled (bool enable)
125{
Jim Ingham28e23862012-02-08 05:23:15 +0000126 if (enable == m_options.IsEnabled())
127 return;
128
Chris Lattner24943d22010-06-08 16:52:24 +0000129 m_options.SetEnabled(enable);
130 if (enable)
131 m_locations.ResolveAllBreakpointSites();
132 else
133 m_locations.ClearAllBreakpointSites();
Jim Ingham28e23862012-02-08 05:23:15 +0000134
135 SendBreakpointChangedEvent (enable ? eBreakpointEventTypeEnabled : eBreakpointEventTypeDisabled);
136
Chris Lattner24943d22010-06-08 16:52:24 +0000137}
138
139bool
140Breakpoint::IsEnabled ()
141{
142 return m_options.IsEnabled();
143}
144
145void
Greg Clayton54e7afa2010-07-09 20:39:50 +0000146Breakpoint::SetIgnoreCount (uint32_t n)
Chris Lattner24943d22010-06-08 16:52:24 +0000147{
Jim Ingham28e23862012-02-08 05:23:15 +0000148 if (m_options.GetIgnoreCount() == n)
149 return;
150
Chris Lattner24943d22010-06-08 16:52:24 +0000151 m_options.SetIgnoreCount(n);
Jim Ingham28e23862012-02-08 05:23:15 +0000152 SendBreakpointChangedEvent (eBreakpointEventTypeIgnoreChanged);
Chris Lattner24943d22010-06-08 16:52:24 +0000153}
154
Greg Clayton54e7afa2010-07-09 20:39:50 +0000155uint32_t
Chris Lattner24943d22010-06-08 16:52:24 +0000156Breakpoint::GetIgnoreCount () const
157{
158 return m_options.GetIgnoreCount();
159}
160
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000161uint32_t
162Breakpoint::GetHitCount () const
163{
164 return m_locations.GetHitCount();
165}
166
Chris Lattner24943d22010-06-08 16:52:24 +0000167void
168Breakpoint::SetThreadID (lldb::tid_t thread_id)
169{
Jim Ingham28e23862012-02-08 05:23:15 +0000170 if (m_options.GetThreadSpec()->GetTID() == thread_id)
171 return;
172
Jim Ingham3c7b5b92010-06-16 02:00:15 +0000173 m_options.GetThreadSpec()->SetTID(thread_id);
Jim Ingham28e23862012-02-08 05:23:15 +0000174 SendBreakpointChangedEvent (eBreakpointEventTypeThreadChanged);
Chris Lattner24943d22010-06-08 16:52:24 +0000175}
176
177lldb::tid_t
Jim Ingham28e23862012-02-08 05:23:15 +0000178Breakpoint::GetThreadID () const
Chris Lattner24943d22010-06-08 16:52:24 +0000179{
Jim Ingham28e23862012-02-08 05:23:15 +0000180 if (m_options.GetThreadSpecNoCreate() == NULL)
Jim Ingham3c7b5b92010-06-16 02:00:15 +0000181 return LLDB_INVALID_THREAD_ID;
182 else
Jim Ingham28e23862012-02-08 05:23:15 +0000183 return m_options.GetThreadSpecNoCreate()->GetTID();
184}
185
186void
187Breakpoint::SetThreadIndex (uint32_t index)
188{
189 if (m_options.GetThreadSpec()->GetIndex() == index)
190 return;
191
192 m_options.GetThreadSpec()->SetIndex(index);
193 SendBreakpointChangedEvent (eBreakpointEventTypeThreadChanged);
194}
195
196uint32_t
197Breakpoint::GetThreadIndex() const
198{
199 if (m_options.GetThreadSpecNoCreate() == NULL)
200 return 0;
201 else
202 return m_options.GetThreadSpecNoCreate()->GetIndex();
203}
204
205void
206Breakpoint::SetThreadName (const char *thread_name)
207{
208 if (::strcmp (m_options.GetThreadSpec()->GetName(), thread_name) == 0)
209 return;
210
211 m_options.GetThreadSpec()->SetName (thread_name);
212 SendBreakpointChangedEvent (eBreakpointEventTypeThreadChanged);
213}
214
215const char *
216Breakpoint::GetThreadName () const
217{
218 if (m_options.GetThreadSpecNoCreate() == NULL)
219 return NULL;
220 else
221 return m_options.GetThreadSpecNoCreate()->GetName();
222}
223
224void
225Breakpoint::SetQueueName (const char *queue_name)
226{
227 if (::strcmp (m_options.GetThreadSpec()->GetQueueName(), queue_name) == 0)
228 return;
229
230 m_options.GetThreadSpec()->SetQueueName (queue_name);
231 SendBreakpointChangedEvent (eBreakpointEventTypeThreadChanged);
232}
233
234const char *
235Breakpoint::GetQueueName () const
236{
237 if (m_options.GetThreadSpecNoCreate() == NULL)
238 return NULL;
239 else
240 return m_options.GetThreadSpecNoCreate()->GetQueueName();
Chris Lattner24943d22010-06-08 16:52:24 +0000241}
242
Jim Inghamd1686902010-10-14 23:45:03 +0000243void
244Breakpoint::SetCondition (const char *condition)
245{
246 m_options.SetCondition (condition);
Jim Ingham28e23862012-02-08 05:23:15 +0000247 SendBreakpointChangedEvent (eBreakpointEventTypeConditionChanged);
Jim Inghamd1686902010-10-14 23:45:03 +0000248}
249
250ThreadPlan *
251Breakpoint::GetThreadPlanToTestCondition (ExecutionContext &exe_ctx, lldb::BreakpointLocationSP loc_sp, Stream &error)
252{
253 return m_options.GetThreadPlanToTestCondition (exe_ctx, loc_sp, error);
254}
255
256const char *
Jim Inghamac354422011-06-15 21:16:00 +0000257Breakpoint::GetConditionText () const
Jim Inghamd1686902010-10-14 23:45:03 +0000258{
259 return m_options.GetConditionText();
260}
261
Chris Lattner24943d22010-06-08 16:52:24 +0000262// This function is used when "baton" doesn't need to be freed
263void
264Breakpoint::SetCallback (BreakpointHitCallback callback, void *baton, bool is_synchronous)
265{
266 // The default "Baton" class will keep a copy of "baton" and won't free
267 // or delete it when it goes goes out of scope.
268 m_options.SetCallback(callback, BatonSP (new Baton(baton)), is_synchronous);
Jim Ingham28e23862012-02-08 05:23:15 +0000269
270 SendBreakpointChangedEvent (eBreakpointEventTypeCommandChanged);
Chris Lattner24943d22010-06-08 16:52:24 +0000271}
272
273// This function is used when a baton needs to be freed and therefore is
274// contained in a "Baton" subclass.
275void
276Breakpoint::SetCallback (BreakpointHitCallback callback, const BatonSP &callback_baton_sp, bool is_synchronous)
277{
278 m_options.SetCallback(callback, callback_baton_sp, is_synchronous);
279}
280
281void
282Breakpoint::ClearCallback ()
283{
284 m_options.ClearCallback ();
285}
286
287bool
288Breakpoint::InvokeCallback (StoppointCallbackContext *context, break_id_t bp_loc_id)
289{
290 return m_options.InvokeCallback (context, GetID(), bp_loc_id);
291}
292
293BreakpointOptions *
294Breakpoint::GetOptions ()
295{
296 return &m_options;
297}
298
299void
300Breakpoint::ResolveBreakpoint ()
301{
302 if (m_resolver_sp)
303 m_resolver_sp->ResolveBreakpoint(*m_filter_sp);
304}
305
306void
307Breakpoint::ResolveBreakpointInModules (ModuleList &module_list)
308{
309 if (m_resolver_sp)
310 m_resolver_sp->ResolveBreakpointInModules(*m_filter_sp, module_list);
311}
312
313void
314Breakpoint::ClearAllBreakpointSites ()
315{
316 m_locations.ClearAllBreakpointSites();
317}
318
319//----------------------------------------------------------------------
320// ModulesChanged: Pass in a list of new modules, and
321//----------------------------------------------------------------------
322
323void
324Breakpoint::ModulesChanged (ModuleList &module_list, bool load)
325{
326 if (load)
327 {
328 // The logic for handling new modules is:
329 // 1) If the filter rejects this module, then skip it.
330 // 2) Run through the current location list and if there are any locations
331 // for that module, we mark the module as "seen" and we don't try to re-resolve
332 // breakpoint locations for that module.
333 // However, we do add breakpoint sites to these locations if needed.
334 // 3) If we don't see this module in our breakpoint location list, call ResolveInModules.
335
336 ModuleList new_modules; // We'll stuff the "unseen" modules in this list, and then resolve
Greg Clayton19a1ab82011-02-05 00:38:04 +0000337 // them after the locations pass. Have to do it this way because
338 // resolving breakpoints will add new locations potentially.
339
340 const size_t num_locs = m_locations.GetSize();
Chris Lattner24943d22010-06-08 16:52:24 +0000341
Greg Clayton54e7afa2010-07-09 20:39:50 +0000342 for (size_t i = 0; i < module_list.GetSize(); i++)
Chris Lattner24943d22010-06-08 16:52:24 +0000343 {
344 bool seen = false;
345 ModuleSP module_sp (module_list.GetModuleAtIndex (i));
Chris Lattner24943d22010-06-08 16:52:24 +0000346 if (!m_filter_sp->ModulePasses (module_sp))
347 continue;
348
Greg Clayton19a1ab82011-02-05 00:38:04 +0000349 for (size_t loc_idx = 0; loc_idx < num_locs; loc_idx++)
Chris Lattner24943d22010-06-08 16:52:24 +0000350 {
Greg Clayton7b9fcc02010-12-06 23:51:26 +0000351 BreakpointLocationSP break_loc = m_locations.GetByIndex(loc_idx);
Jim Ingham1de036b2010-10-20 03:36:33 +0000352 if (!break_loc->IsEnabled())
353 continue;
Greg Clayton3508c382012-02-24 01:59:29 +0000354 SectionSP section_sp (break_loc->GetAddress().GetSection());
355 if (!section_sp || section_sp->GetModule() == module_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000356 {
357 if (!seen)
358 seen = true;
359
360 if (!break_loc->ResolveBreakpointSite())
361 {
Greg Claytone005f2c2010-11-06 01:53:30 +0000362 LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner24943d22010-06-08 16:52:24 +0000363 if (log)
364 log->Printf ("Warning: could not set breakpoint site for breakpoint location %d of breakpoint %d.\n",
365 break_loc->GetID(), GetID());
366 }
367 }
368 }
369
370 if (!seen)
Greg Claytonab429022010-12-12 21:03:32 +0000371 new_modules.AppendIfNeeded (module_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000372
373 }
Jim Ingham28e23862012-02-08 05:23:15 +0000374
Chris Lattner24943d22010-06-08 16:52:24 +0000375 if (new_modules.GetSize() > 0)
376 {
Jim Ingham28e23862012-02-08 05:23:15 +0000377 // If this is not an internal breakpoint, set up to record the new locations, then dispatch
378 // an event with the new locations.
379 if (!IsInternal())
380 {
381 BreakpointEventData *new_locations_event = new BreakpointEventData (eBreakpointEventTypeLocationsAdded,
382 shared_from_this());
383
384 m_locations.StartRecordingNewLocations(new_locations_event->GetBreakpointLocationCollection());
385
386 ResolveBreakpointInModules(new_modules);
387
388 m_locations.StopRecordingNewLocations();
389 if (new_locations_event->GetBreakpointLocationCollection().GetSize() != 0)
390 {
391 SendBreakpointChangedEvent (new_locations_event);
392 }
393 else
394 delete new_locations_event;
395 }
396 else
397 ResolveBreakpointInModules(new_modules);
398
Chris Lattner24943d22010-06-08 16:52:24 +0000399 }
400 }
401 else
402 {
403 // Go through the currently set locations and if any have breakpoints in
404 // the module list, then remove their breakpoint sites.
405 // FIXME: Think about this... Maybe it's better to delete the locations?
406 // Are we sure that on load-unload-reload the module pointer will remain
407 // the same? Or do we need to do an equality on modules that is an
408 // "equivalence"???
409
Jim Ingham28e23862012-02-08 05:23:15 +0000410 BreakpointEventData *removed_locations_event;
411 if (!IsInternal())
412 removed_locations_event = new BreakpointEventData (eBreakpointEventTypeLocationsRemoved,
413 shared_from_this());
414 else
415 removed_locations_event = NULL;
416
Greg Clayton54e7afa2010-07-09 20:39:50 +0000417 for (size_t i = 0; i < module_list.GetSize(); i++)
Chris Lattner24943d22010-06-08 16:52:24 +0000418 {
419 ModuleSP module_sp (module_list.GetModuleAtIndex (i));
Greg Clayton7b9fcc02010-12-06 23:51:26 +0000420 if (m_filter_sp->ModulePasses (module_sp))
Chris Lattner24943d22010-06-08 16:52:24 +0000421 {
Greg Clayton3508c382012-02-24 01:59:29 +0000422 size_t loc_idx = 0;
423 while (loc_idx < m_locations.GetSize())
Chris Lattner24943d22010-06-08 16:52:24 +0000424 {
Greg Clayton3508c382012-02-24 01:59:29 +0000425 BreakpointLocationSP break_loc_sp (m_locations.GetByIndex(loc_idx));
426 SectionSP section_sp (break_loc_sp->GetAddress().GetSection());
427 if (section_sp && section_sp->GetModule() == module_sp)
Greg Clayton7b9fcc02010-12-06 23:51:26 +0000428 {
429 // Remove this breakpoint since the shared library is
430 // unloaded, but keep the breakpoint location around
431 // so we always get complete hit count and breakpoint
432 // lifetime info
Greg Clayton3508c382012-02-24 01:59:29 +0000433 break_loc_sp->ClearBreakpointSite();
Jim Ingham28e23862012-02-08 05:23:15 +0000434 if (removed_locations_event)
435 {
Greg Clayton3508c382012-02-24 01:59:29 +0000436 removed_locations_event->GetBreakpointLocationCollection().Add(break_loc_sp);
Jim Ingham28e23862012-02-08 05:23:15 +0000437 }
Greg Clayton3508c382012-02-24 01:59:29 +0000438 //m_locations.RemoveLocation (break_loc_sp);
Greg Clayton7b9fcc02010-12-06 23:51:26 +0000439 }
Greg Clayton3508c382012-02-24 01:59:29 +0000440 ++loc_idx;
Chris Lattner24943d22010-06-08 16:52:24 +0000441 }
Chris Lattner24943d22010-06-08 16:52:24 +0000442 }
443 }
Jim Ingham28e23862012-02-08 05:23:15 +0000444 SendBreakpointChangedEvent (removed_locations_event);
Chris Lattner24943d22010-06-08 16:52:24 +0000445 }
446}
447
448void
449Breakpoint::Dump (Stream *)
450{
451}
452
453size_t
454Breakpoint::GetNumResolvedLocations() const
455{
456 // Return the number of breakpoints that are actually resolved and set
457 // down in the inferior process.
458 return m_locations.GetNumResolvedLocations();
459}
460
461size_t
462Breakpoint::GetNumLocations() const
463{
464 return m_locations.GetSize();
465}
466
467void
468Breakpoint::GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_locations)
469{
470 assert (s != NULL);
Greg Clayton12bec712010-06-28 21:30:43 +0000471 s->Printf("%i: ", GetID());
Chris Lattner24943d22010-06-08 16:52:24 +0000472 GetResolverDescription (s);
Greg Clayton12bec712010-06-28 21:30:43 +0000473 GetFilterDescription (s);
Chris Lattner24943d22010-06-08 16:52:24 +0000474
Greg Clayton54e7afa2010-07-09 20:39:50 +0000475 const size_t num_locations = GetNumLocations ();
476 const size_t num_resolved_locations = GetNumResolvedLocations ();
Chris Lattner24943d22010-06-08 16:52:24 +0000477
478 switch (level)
479 {
480 case lldb::eDescriptionLevelBrief:
481 case lldb::eDescriptionLevelFull:
482 if (num_locations > 0)
483 {
Greg Clayton54e7afa2010-07-09 20:39:50 +0000484 s->Printf(", locations = %zu", num_locations);
Chris Lattner24943d22010-06-08 16:52:24 +0000485 if (num_resolved_locations > 0)
Greg Clayton54e7afa2010-07-09 20:39:50 +0000486 s->Printf(", resolved = %zu", num_resolved_locations);
Chris Lattner24943d22010-06-08 16:52:24 +0000487 }
488 else
489 {
Jim Ingham4722b102012-03-06 00:37:27 +0000490 // Don't print the pending notification for exception resolvers since we don't generally
491 // know how to set them until the target is run.
492 if (m_resolver_sp->getResolverID() != BreakpointResolver::ExceptionResolver)
493 s->Printf(", locations = 0 (pending)");
Chris Lattner24943d22010-06-08 16:52:24 +0000494 }
495
Jim Ingham649492b2010-06-18 01:00:58 +0000496 GetOptions()->GetDescription(s, level);
497
Chris Lattner24943d22010-06-08 16:52:24 +0000498 if (level == lldb::eDescriptionLevelFull)
499 {
Jim Ingham649492b2010-06-18 01:00:58 +0000500 s->IndentLess();
501 s->EOL();
Chris Lattner24943d22010-06-08 16:52:24 +0000502 }
503 break;
504
505 case lldb::eDescriptionLevelVerbose:
506 // Verbose mode does a debug dump of the breakpoint
507 Dump (s);
Jim Ingham649492b2010-06-18 01:00:58 +0000508 s->EOL ();
Greg Claytonb1888f22011-03-19 01:12:21 +0000509 //s->Indent();
Jim Ingham649492b2010-06-18 01:00:58 +0000510 GetOptions()->GetDescription(s, level);
Chris Lattner24943d22010-06-08 16:52:24 +0000511 break;
Greg Clayton54e7afa2010-07-09 20:39:50 +0000512
513 default:
514 break;
Chris Lattner24943d22010-06-08 16:52:24 +0000515 }
516
Jim Ingham1cd466f2011-05-14 01:11:02 +0000517 // The brief description is just the location name (1.2 or whatever). That's pointless to
518 // show in the breakpoint's description, so suppress it.
519 if (show_locations && level != lldb::eDescriptionLevelBrief)
Chris Lattner24943d22010-06-08 16:52:24 +0000520 {
Chris Lattner24943d22010-06-08 16:52:24 +0000521 s->IndentMore();
Greg Clayton54e7afa2010-07-09 20:39:50 +0000522 for (size_t i = 0; i < num_locations; ++i)
Chris Lattner24943d22010-06-08 16:52:24 +0000523 {
524 BreakpointLocation *loc = GetLocationAtIndex(i).get();
525 loc->GetDescription(s, level);
526 s->EOL();
527 }
528 s->IndentLess();
Chris Lattner24943d22010-06-08 16:52:24 +0000529 }
530}
531
Jim Ingham5f4f3272012-02-09 01:49:26 +0000532void
533Breakpoint::GetResolverDescription (Stream *s)
534{
535 if (m_resolver_sp)
536 m_resolver_sp->GetDescription (s);
537}
538
539
540bool
541Breakpoint::GetMatchingFileLine (const ConstString &filename, uint32_t line_number, BreakpointLocationCollection &loc_coll)
542{
543 // TODO: To be correct, this method needs to fill the breakpoint location collection
544 // with the location IDs which match the filename and line_number.
545 //
546
547 if (m_resolver_sp)
548 {
549 BreakpointResolverFileLine *resolverFileLine = dyn_cast<BreakpointResolverFileLine>(m_resolver_sp.get());
550 if (resolverFileLine &&
551 resolverFileLine->m_file_spec.GetFilename() == filename &&
552 resolverFileLine->m_line_number == line_number)
553 {
554 return true;
555 }
556 }
557 return false;
558}
559
560void
561Breakpoint::GetFilterDescription (Stream *s)
562{
563 m_filter_sp->GetDescription (s);
564}
565
566void
567Breakpoint::SendBreakpointChangedEvent (lldb::BreakpointEventType eventKind)
568{
569 if (!m_being_created
570 && !IsInternal()
571 && GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
572 {
573 BreakpointEventData *data = new Breakpoint::BreakpointEventData (eventKind, shared_from_this());
574
575 GetTarget().BroadcastEvent (Target::eBroadcastBitBreakpointChanged, data);
576 }
577}
578
579void
580Breakpoint::SendBreakpointChangedEvent (BreakpointEventData *data)
581{
582
583 if (data == NULL)
584 return;
585
586 if (!m_being_created
587 && !IsInternal()
588 && GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
589 GetTarget().BroadcastEvent (Target::eBroadcastBitBreakpointChanged, data);
590 else
591 delete data;
592}
593
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000594Breakpoint::BreakpointEventData::BreakpointEventData (BreakpointEventType sub_type,
Jim Ingham28e23862012-02-08 05:23:15 +0000595 const BreakpointSP &new_breakpoint_sp) :
Chris Lattner24943d22010-06-08 16:52:24 +0000596 EventData (),
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000597 m_breakpoint_event (sub_type),
Chris Lattner24943d22010-06-08 16:52:24 +0000598 m_new_breakpoint_sp (new_breakpoint_sp)
599{
600}
601
602Breakpoint::BreakpointEventData::~BreakpointEventData ()
603{
604}
605
606const ConstString &
607Breakpoint::BreakpointEventData::GetFlavorString ()
608{
609 static ConstString g_flavor ("Breakpoint::BreakpointEventData");
610 return g_flavor;
611}
612
613const ConstString &
614Breakpoint::BreakpointEventData::GetFlavor () const
615{
616 return BreakpointEventData::GetFlavorString ();
617}
618
619
620BreakpointSP &
621Breakpoint::BreakpointEventData::GetBreakpoint ()
622{
623 return m_new_breakpoint_sp;
624}
625
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000626BreakpointEventType
627Breakpoint::BreakpointEventData::GetBreakpointEventType () const
Chris Lattner24943d22010-06-08 16:52:24 +0000628{
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000629 return m_breakpoint_event;
Chris Lattner24943d22010-06-08 16:52:24 +0000630}
631
632void
633Breakpoint::BreakpointEventData::Dump (Stream *s) const
634{
635}
636
Jim Ingham28e23862012-02-08 05:23:15 +0000637const Breakpoint::BreakpointEventData *
638Breakpoint::BreakpointEventData::GetEventDataFromEvent (const Event *event)
Chris Lattner24943d22010-06-08 16:52:24 +0000639{
Jim Ingham28e23862012-02-08 05:23:15 +0000640 if (event)
Chris Lattner24943d22010-06-08 16:52:24 +0000641 {
Jim Ingham28e23862012-02-08 05:23:15 +0000642 const EventData *event_data = event->GetData();
Chris Lattner24943d22010-06-08 16:52:24 +0000643 if (event_data && event_data->GetFlavor() == BreakpointEventData::GetFlavorString())
Jim Ingham28e23862012-02-08 05:23:15 +0000644 return static_cast <const BreakpointEventData *> (event->GetData());
Chris Lattner24943d22010-06-08 16:52:24 +0000645 }
646 return NULL;
647}
648
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000649BreakpointEventType
650Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent (const EventSP &event_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000651{
Jim Ingham28e23862012-02-08 05:23:15 +0000652 const BreakpointEventData *data = GetEventDataFromEvent (event_sp.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000653
654 if (data == NULL)
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000655 return eBreakpointEventTypeInvalidType;
Chris Lattner24943d22010-06-08 16:52:24 +0000656 else
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000657 return data->GetBreakpointEventType();
Chris Lattner24943d22010-06-08 16:52:24 +0000658}
659
660BreakpointSP
661Breakpoint::BreakpointEventData::GetBreakpointFromEvent (const EventSP &event_sp)
662{
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000663 BreakpointSP bp_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000664
Jim Ingham28e23862012-02-08 05:23:15 +0000665 const BreakpointEventData *data = GetEventDataFromEvent (event_sp.get());
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000666 if (data)
Jim Ingham28e23862012-02-08 05:23:15 +0000667 bp_sp = data->m_new_breakpoint_sp;
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000668
669 return bp_sp;
670}
671
Jim Ingham28e23862012-02-08 05:23:15 +0000672uint32_t
673Breakpoint::BreakpointEventData::GetNumBreakpointLocationsFromEvent (const EventSP &event_sp)
674{
675 const BreakpointEventData *data = GetEventDataFromEvent (event_sp.get());
676 if (data)
677 return data->m_locations.GetSize();
678
679 return 0;
680}
681
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000682lldb::BreakpointLocationSP
683Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent (const lldb::EventSP &event_sp, uint32_t bp_loc_idx)
684{
685 lldb::BreakpointLocationSP bp_loc_sp;
686
Jim Ingham28e23862012-02-08 05:23:15 +0000687 const BreakpointEventData *data = GetEventDataFromEvent (event_sp.get());
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000688 if (data)
Chris Lattner24943d22010-06-08 16:52:24 +0000689 {
Jim Ingham28e23862012-02-08 05:23:15 +0000690 bp_loc_sp = data->m_locations.GetByIndex(bp_loc_idx);
Chris Lattner24943d22010-06-08 16:52:24 +0000691 }
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000692
693 return bp_loc_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000694}