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 } 199