]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/lldb/source/Breakpoint/BreakpointLocationCollection.cpp
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / lldb / source / Breakpoint / BreakpointLocationCollection.cpp
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 //----------------------------------------------------------------------
28 BreakpointLocationCollection::BreakpointLocationCollection() :
29     m_break_loc_collection()
30 {
31 }
32
33 //----------------------------------------------------------------------
34 // Destructor
35 //----------------------------------------------------------------------
36 BreakpointLocationCollection::~BreakpointLocationCollection()
37 {
38 }
39
40 void
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
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:
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
70     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
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
89 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
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
107 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
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
128 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
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 
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 
166 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
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 }