1 //===-- BreakpointLocationCollection.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/BreakpointLocationCollection.h"
16 #include "lldb/Core/ModuleList.h"
17 #include "lldb/Breakpoint/Breakpoint.h"
18 #include "lldb/Breakpoint/BreakpointLocation.h"
19 #include "lldb/Target/Thread.h"
20 #include "lldb/Target/ThreadSpec.h"
21
22 using namespace lldb;
23 using namespace lldb_private;
24
25 //----------------------------------------------------------------------
26 // BreakpointLocationCollection constructor
27 //----------------------------------------------------------------------
BreakpointLocationCollection()28 BreakpointLocationCollection::BreakpointLocationCollection() :
29 m_break_loc_collection()
30 {
31 }
32
33 //----------------------------------------------------------------------
34 // Destructor
35 //----------------------------------------------------------------------
~BreakpointLocationCollection()36 BreakpointLocationCollection::~BreakpointLocationCollection()
37 {
38 }
39
40 void
Add(const BreakpointLocationSP & bp_loc)41 BreakpointLocationCollection::Add(const BreakpointLocationSP &bp_loc)
42 {
43 BreakpointLocationSP old_bp_loc = FindByIDPair (bp_loc->GetBreakpoint().GetID(), bp_loc->GetID());
44 if (!old_bp_loc.get())
45 m_break_loc_collection.push_back(bp_loc);
46 }
47
48 bool
Remove(lldb::break_id_t bp_id,lldb::break_id_t bp_loc_id)49 BreakpointLocationCollection::Remove (lldb::break_id_t bp_id, lldb::break_id_t bp_loc_id)
50 {
51 collection::iterator pos = GetIDPairIterator(bp_id, bp_loc_id); // Predicate
52 if (pos != m_break_loc_collection.end())
53 {
54 m_break_loc_collection.erase(pos);
55 return true;
56 }
57 return false;
58
59 }
60
61 class BreakpointIDPairMatches
62 {
63 public:
BreakpointIDPairMatches(lldb::break_id_t break_id,lldb::break_id_t break_loc_id)64 BreakpointIDPairMatches (lldb::break_id_t break_id, lldb::break_id_t break_loc_id) :
65 m_break_id(break_id),
66 m_break_loc_id (break_loc_id)
67 {
68 }
69
operator ()(const BreakpointLocationSP & bp_loc) const70 bool operator() (const BreakpointLocationSP &bp_loc) const
71 {
72 return m_break_id == bp_loc->GetBreakpoint().GetID()
73 && m_break_loc_id == bp_loc->GetID();
74 }
75
76 private:
77 const lldb::break_id_t m_break_id;
78 const lldb::break_id_t m_break_loc_id;
79 };
80
81 BreakpointLocationCollection::collection::iterator
GetIDPairIterator(lldb::break_id_t break_id,lldb::break_id_t break_loc_id)82 BreakpointLocationCollection::GetIDPairIterator (lldb::break_id_t break_id, lldb::break_id_t break_loc_id)
83 {
84 return std::find_if(m_break_loc_collection.begin(), m_break_loc_collection.end(), // Search full range
85 BreakpointIDPairMatches(break_id, break_loc_id)); // Predicate
86 }
87
88 BreakpointLocationCollection::collection::const_iterator
GetIDPairConstIterator(lldb::break_id_t break_id,lldb::break_id_t break_loc_id) const89 BreakpointLocationCollection::GetIDPairConstIterator (lldb::break_id_t break_id, lldb::break_id_t break_loc_id) const
90 {
91 return std::find_if(m_break_loc_collection.begin(), m_break_loc_collection.end(), // Search full range
92 BreakpointIDPairMatches(break_id, break_loc_id)); // Predicate
93 }
94
95 BreakpointLocationSP
FindByIDPair(lldb::break_id_t break_id,lldb::break_id_t break_loc_id)96 BreakpointLocationCollection::FindByIDPair (lldb::break_id_t break_id, lldb::break_id_t break_loc_id)
97 {
98 BreakpointLocationSP stop_sp;
99 collection::iterator pos = GetIDPairIterator(break_id, break_loc_id);
100 if (pos != m_break_loc_collection.end())
101 stop_sp = *pos;
102
103 return stop_sp;
104 }
105
106 const BreakpointLocationSP
FindByIDPair(lldb::break_id_t break_id,lldb::break_id_t break_loc_id) const107 BreakpointLocationCollection::FindByIDPair (lldb::break_id_t break_id, lldb::break_id_t break_loc_id) const
108 {
109 BreakpointLocationSP stop_sp;
110 collection::const_iterator pos = GetIDPairConstIterator(break_id, break_loc_id);
111 if (pos != m_break_loc_collection.end())
112 stop_sp = *pos;
113
114 return stop_sp;
115 }
116
117 BreakpointLocationSP
GetByIndex(size_t i)118 BreakpointLocationCollection::GetByIndex (size_t i)
119 {
120 BreakpointLocationSP stop_sp;
121 if (i < m_break_loc_collection.size())
122 stop_sp = m_break_loc_collection[i];
123
124 return stop_sp;
125 }
126
127 const BreakpointLocationSP
GetByIndex(size_t i) const128 BreakpointLocationCollection::GetByIndex (size_t i) const
129 {
130 BreakpointLocationSP stop_sp;
131 if (i < m_break_loc_collection.size())
132 stop_sp = m_break_loc_collection[i];
133
134 return stop_sp;
135 }
136
137 bool
ShouldStop(StoppointCallbackContext * context)138 BreakpointLocationCollection::ShouldStop (StoppointCallbackContext *context)
139 {
140 bool shouldStop = false;
141 const size_t count = GetSize();
142 for (size_t i = 0; i < count; i++)
143 {
144 if (GetByIndex(i)->ShouldStop(context))
145 shouldStop = true;
146 }
147 return shouldStop;
148 }
149
150 bool
ValidForThisThread(Thread * thread)151 BreakpointLocationCollection::ValidForThisThread (Thread *thread)
152 {
153 collection::iterator pos,
154 begin = m_break_loc_collection.begin(),
155 end = m_break_loc_collection.end();
156
157 for (pos = begin; pos != end; ++pos)
158 {
159 if ((*pos)->ValidForThisThread (thread))
160 return true;
161 }
162 return false;
163 }
164
165 bool
IsInternal() const166 BreakpointLocationCollection::IsInternal () const
167 {
168 collection::const_iterator pos,
169 begin = m_break_loc_collection.begin(),
170 end = m_break_loc_collection.end();
171
172 bool is_internal = true;
173
174 for (pos = begin; pos != end; ++pos)
175 {
176 if (!(*pos)->GetBreakpoint().IsInternal ())
177 {
178 is_internal = false;
179 break;
180 }
181 }
182 return is_internal;
183 }
184
185 void
GetDescription(Stream * s,lldb::DescriptionLevel level)186 BreakpointLocationCollection::GetDescription (Stream *s, lldb::DescriptionLevel level)
187 {
188 collection::iterator pos,
189 begin = m_break_loc_collection.begin(),
190 end = m_break_loc_collection.end();
191
192 for (pos = begin; pos != end; ++pos)
193 {
194 if (pos != begin)
195 s->PutChar(' ');
196 (*pos)->GetDescription(s, level);
197 }
198 }
199