blob: f71382f8a803a9942e1b1ff4c7a87cb7b526c156 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- BreakpointLocationList.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#include "lldb/Breakpoint/BreakpointLocationList.h"
16#include "lldb/Breakpoint/BreakpointLocation.h"
17#include "lldb/Core/ModuleList.h"
18#include "lldb/Target/Target.h"
19
20using namespace lldb;
21using namespace lldb_private;
22
23BreakpointLocationList::BreakpointLocationList() :
24 m_locations(),
25 m_address_to_location (),
Greg Claytonc0d34462011-02-05 00:38:04 +000026 m_mutex (Mutex::eMutexTypeRecursive)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000027{
28}
29
30BreakpointLocationList::~BreakpointLocationList()
31{
32}
33
Greg Claytonc0d34462011-02-05 00:38:04 +000034BreakpointLocationSP
35BreakpointLocationList::Create (Breakpoint &bp, const Address &addr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000036{
Greg Claytonc0d34462011-02-05 00:38:04 +000037 Mutex::Locker locker (m_mutex);
38 // The location ID is just the size of the location list + 1
39 lldb::break_id_t bp_loc_id = m_locations.size() + 1;
40 BreakpointLocationSP bp_loc_sp (new BreakpointLocation (bp_loc_id, bp, addr));
41 m_locations.push_back (bp_loc_sp);
42 m_address_to_location[addr] = bp_loc_sp;
43 return bp_loc_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000044}
45
46bool
Greg Claytonc982c762010-07-09 20:39:50 +000047BreakpointLocationList::ShouldStop (StoppointCallbackContext *context, lldb::break_id_t break_id)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000048{
49 BreakpointLocationSP bp = FindByID (break_id);
50 if (bp)
51 {
52 // Let the BreakpointLocation decide if it should stop here (could not have
53 // reached it's target hit count yet, or it could have a callback
54 // that decided it shouldn't stop (shared library loads/unloads).
55 return bp->ShouldStop (context);
56 }
57 // We should stop here since this BreakpointLocation isn't valid anymore or it
58 // doesn't exist.
59 return true;
60}
61
Greg Claytonc982c762010-07-09 20:39:50 +000062lldb::break_id_t
Greg Claytonc0d34462011-02-05 00:38:04 +000063BreakpointLocationList::FindIDByAddress (const Address &addr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000064{
65 BreakpointLocationSP bp_loc_sp = FindByAddress (addr);
66 if (bp_loc_sp)
67 {
68 return bp_loc_sp->GetID();
69 }
70 return LLDB_INVALID_BREAK_ID;
71}
72
Chris Lattner30fdc8d2010-06-08 16:52:24 +000073BreakpointLocationSP
Greg Claytonc982c762010-07-09 20:39:50 +000074BreakpointLocationList::FindByID (lldb::break_id_t break_id) const
Chris Lattner30fdc8d2010-06-08 16:52:24 +000075{
Greg Claytonc0d34462011-02-05 00:38:04 +000076 BreakpointLocationSP bp_loc_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000077 Mutex::Locker locker (m_mutex);
Greg Claytonc0d34462011-02-05 00:38:04 +000078 // We never remove a breakpoint locations, so the ID can be translated into
79 // the location index by subtracting 1
80 uint32_t idx = break_id - 1;
81 if (idx <= m_locations.size())
82 {
83 bp_loc_sp = m_locations[idx];
84 }
85 return bp_loc_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000086}
87
88size_t
89BreakpointLocationList::FindInModule (Module *module,
90 BreakpointLocationCollection& bp_loc_list)
91{
92 Mutex::Locker locker (m_mutex);
93 const size_t orig_size = bp_loc_list.GetSize();
94 collection::iterator pos, end = m_locations.end();
95
96 for (pos = m_locations.begin(); pos != end; ++pos)
97 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +000098 BreakpointLocationSP break_loc = (*pos);
99 const Section *section = break_loc->GetAddress().GetSection();
Johnny Chen0861be02011-08-11 21:43:13 +0000100 if (section && section->GetModule() == module)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000101 {
Johnny Chen0861be02011-08-11 21:43:13 +0000102 bp_loc_list.Add (break_loc);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000103 }
104 }
105 return bp_loc_list.GetSize() - orig_size;
106}
107
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000108const BreakpointLocationSP
Greg Claytonc0d34462011-02-05 00:38:04 +0000109BreakpointLocationList::FindByAddress (const Address &addr) const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000110{
111 Mutex::Locker locker (m_mutex);
Greg Claytonc0d34462011-02-05 00:38:04 +0000112 BreakpointLocationSP bp_loc_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000113 if (!m_locations.empty())
114 {
115 addr_map::const_iterator pos = m_address_to_location.find (addr);
116 if (pos != m_address_to_location.end())
Greg Claytonc0d34462011-02-05 00:38:04 +0000117 bp_loc_sp = pos->second;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000118 }
119
Greg Claytonc0d34462011-02-05 00:38:04 +0000120 return bp_loc_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000121}
122
123void
124BreakpointLocationList::Dump (Stream *s) const
125{
126 s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
Greg Claytonded470d2011-03-19 01:12:21 +0000127 //s->Indent();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000128 Mutex::Locker locker (m_mutex);
129 s->Printf("BreakpointLocationList with %zu BreakpointLocations:\n", m_locations.size());
130 s->IndentMore();
131 collection::const_iterator pos, end = m_locations.end();
132 for (pos = m_locations.begin(); pos != end; ++pos)
133 (*pos).get()->Dump(s);
134 s->IndentLess();
135}
136
137
138BreakpointLocationSP
139BreakpointLocationList::GetByIndex (uint32_t i)
140{
141 Mutex::Locker locker (m_mutex);
Greg Claytonc0d34462011-02-05 00:38:04 +0000142 BreakpointLocationSP bp_loc_sp;
Greg Claytonc982c762010-07-09 20:39:50 +0000143 if (i < m_locations.size())
Greg Claytonc0d34462011-02-05 00:38:04 +0000144 bp_loc_sp = m_locations[i];
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000145
Greg Claytonc0d34462011-02-05 00:38:04 +0000146 return bp_loc_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000147}
148
149const BreakpointLocationSP
150BreakpointLocationList::GetByIndex (uint32_t i) const
151{
152 Mutex::Locker locker (m_mutex);
Greg Claytonc0d34462011-02-05 00:38:04 +0000153 BreakpointLocationSP bp_loc_sp;
Greg Claytonc982c762010-07-09 20:39:50 +0000154 if (i < m_locations.size())
Greg Claytonc0d34462011-02-05 00:38:04 +0000155 bp_loc_sp = m_locations[i];
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000156
Greg Claytonc0d34462011-02-05 00:38:04 +0000157 return bp_loc_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000158}
159
160void
161BreakpointLocationList::ClearAllBreakpointSites ()
162{
163 Mutex::Locker locker (m_mutex);
164 collection::iterator pos, end = m_locations.end();
165 for (pos = m_locations.begin(); pos != end; ++pos)
166 (*pos)->ClearBreakpointSite();
167}
168
169void
170BreakpointLocationList::ResolveAllBreakpointSites ()
171{
172 Mutex::Locker locker (m_mutex);
173 collection::iterator pos, end = m_locations.end();
174
175 for (pos = m_locations.begin(); pos != end; ++pos)
Jim Inghamd4ce0a12010-10-20 03:36:33 +0000176 {
177 if ((*pos)->IsEnabled())
178 (*pos)->ResolveBreakpointSite();
179 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000180}
181
Greg Clayton9fed0d82010-07-23 23:33:17 +0000182uint32_t
183BreakpointLocationList::GetHitCount () const
184{
185 uint32_t hit_count = 0;
186 Mutex::Locker locker (m_mutex);
187 collection::const_iterator pos, end = m_locations.end();
188 for (pos = m_locations.begin(); pos != end; ++pos)
189 hit_count += (*pos)->GetHitCount();
190 return hit_count;
191}
192
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000193size_t
194BreakpointLocationList::GetNumResolvedLocations() const
195{
196 Mutex::Locker locker (m_mutex);
197 size_t resolve_count = 0;
198 collection::const_iterator pos, end = m_locations.end();
199 for (pos = m_locations.begin(); pos != end; ++pos)
200 {
201 if ((*pos)->IsResolved())
202 ++resolve_count;
203 }
204 return resolve_count;
205}
206
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000207void
208BreakpointLocationList::GetDescription (Stream *s, lldb::DescriptionLevel level)
209{
210 Mutex::Locker locker (m_mutex);
211 collection::iterator pos, end = m_locations.end();
212
213 for (pos = m_locations.begin(); pos != end; ++pos)
214 {
215 s->Printf(" ");
216 (*pos)->GetDescription(s, level);
217 }
218}
219