• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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