124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DNBBreakpoint.cpp ---------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Created by Greg Clayton on 6/29/07. 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DNBBreakpoint.h" 15ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton#include "MachProcess.h" 16ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton#include <assert.h> 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <algorithm> 1844eb9fb021023027159df55f91c3e95384088970Jason Molenda#include <inttypes.h> 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DNBLog.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark -- DNBBreakpoint 23ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg ClaytonDNBBreakpoint::DNBBreakpoint(nub_addr_t addr, nub_size_t byte_size, bool hardware) : 24ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton m_retain_count (1), 25ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton m_byte_size (byte_size), 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_opcode(), 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_addr(addr), 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_enabled(0), 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_hw_preferred(hardware), 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_is_watchpoint(0), 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_watch_read(0), 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_watch_write(0), 33ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton m_hw_index(INVALID_NUB_HW_INDEX) 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBBreakpoint::~DNBBreakpoint() 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBBreakpoint::Dump() const 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsBreakpoint()) 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 46ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton DNBLog ("DNBBreakpoint addr = 0x%llx state = %s type = %s breakpoint hw_index = %i", 470e8147bd867e4cdaae9400f56d02c7aacd40a9b3Greg Clayton (uint64_t)m_addr, 480e8147bd867e4cdaae9400f56d02c7aacd40a9b3Greg Clayton m_enabled ? "enabled " : "disabled", 490e8147bd867e4cdaae9400f56d02c7aacd40a9b3Greg Clayton IsHardware() ? "hardware" : "software", 50ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton GetHardwareIndex()); 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton DNBLog ("DNBBreakpoint addr = 0x%llx size = %llu state = %s type = %s watchpoint (%s%s) hw_index = %i", 550e8147bd867e4cdaae9400f56d02c7aacd40a9b3Greg Clayton (uint64_t)m_addr, 56851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton (uint64_t)m_byte_size, 570e8147bd867e4cdaae9400f56d02c7aacd40a9b3Greg Clayton m_enabled ? "enabled " : "disabled", 580e8147bd867e4cdaae9400f56d02c7aacd40a9b3Greg Clayton IsHardware() ? "hardware" : "software", 590e8147bd867e4cdaae9400f56d02c7aacd40a9b3Greg Clayton m_watch_read ? "r" : "", 600e8147bd867e4cdaae9400f56d02c7aacd40a9b3Greg Clayton m_watch_write ? "w" : "", 61ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton GetHardwareIndex()); 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark -- DNBBreakpointList 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBBreakpointList::DNBBreakpointList() 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBBreakpointList::~DNBBreakpointList() 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg ClaytonDNBBreakpoint * 77ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg ClaytonDNBBreakpointList::Add(nub_addr_t addr, nub_size_t length, bool hardware) 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 79ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton m_breakpoints.insert(std::make_pair(addr, DNBBreakpoint(addr, length, hardware))); 80ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton iterator pos = m_breakpoints.find (addr); 81ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton return &pos->second; 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 85ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg ClaytonDNBBreakpointList::Remove (nub_addr_t addr) 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 87ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton iterator pos = m_breakpoints.find(addr); 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != m_breakpoints.end()) 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoints.erase(pos); 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBBreakpoint * 97ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg ClaytonDNBBreakpointList::FindByAddress (nub_addr_t addr) 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 99ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton iterator pos = m_breakpoints.find(addr); 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != m_breakpoints.end()) 101ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton return &pos->second; 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DNBBreakpoint * 107ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg ClaytonDNBBreakpointList::FindByAddress (nub_addr_t addr) const 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 109ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton const_iterator pos = m_breakpoints.find(addr); 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != m_breakpoints.end()) 111ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton return &pos->second; 112ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton// Finds the next breakpoint at an address greater than or equal to "addr" 117ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Claytonsize_t 118ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg ClaytonDNBBreakpointList::FindBreakpointsThatOverlapRange (nub_addr_t addr, 119ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton nub_addr_t size, 120ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton std::vector<DNBBreakpoint *> &bps) 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 122ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton bps.clear(); 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner iterator end = m_breakpoints.end(); 124ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // Find the first breakpoint with an address >= to "addr" 125ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton iterator pos = m_breakpoints.lower_bound(addr); 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != end) 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 128ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (pos != m_breakpoints.begin()) 129ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton { 130ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // Watch out for a breakpoint at an address less than "addr" that might still overlap 131ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton iterator prev_pos = pos; 132ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton --prev_pos; 133ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (prev_pos->second.IntersectsRange (addr, size, NULL, NULL, NULL)) 134ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton bps.push_back (&pos->second); 135ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton 136ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton } 137ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton 138ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton while (pos != end) 139ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton { 140ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // When we hit a breakpoint whose start address is greater than "addr + size" we are done. 141ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // Do the math in a way that doesn't risk unsigned overflow with bad input. 142ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if ((pos->second.Address() - addr) >= size) 143ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton break; 144ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton 145ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // Check if this breakpoint overlaps, and if it does, add it to the list 146ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (pos->second.IntersectsRange (addr, size, NULL, NULL, NULL)) 147ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton { 148ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton bps.push_back (&pos->second); 149ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton ++pos; 150ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton } 151ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton } 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 153ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton return bps.size(); 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBBreakpointList::Dump() const 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const_iterator pos; 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const_iterator end = m_breakpoints.end(); 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_breakpoints.begin(); pos != end; ++pos) 162ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton pos->second.Dump(); 163ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton} 164ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton 165ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Claytonvoid 166ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg ClaytonDNBBreakpointList::DisableAll () 167ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton{ 168ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton iterator pos, end = m_breakpoints.end(); 169ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton for (pos = m_breakpoints.begin(); pos != end; ++pos) 170ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton pos->second.SetEnabled(false); 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 174ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Claytonvoid 175ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg ClaytonDNBBreakpointList::RemoveTrapsFromBuffer (nub_addr_t addr, nub_size_t size, void *p) const 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 177ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton uint8_t *buf = (uint8_t *)p; 178ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton const_iterator end = m_breakpoints.end(); 179ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton const_iterator pos = m_breakpoints.lower_bound(addr); 180ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton while (pos != end && (pos->first < (addr + size))) 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 182ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton nub_addr_t intersect_addr; 183ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton nub_size_t intersect_size; 184ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton nub_size_t opcode_offset; 185ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton const DNBBreakpoint &bp = pos->second; 186ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (bp.IntersectsRange(addr, size, &intersect_addr, &intersect_size, &opcode_offset)) 187ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton { 188ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton assert(addr <= intersect_addr && intersect_addr < addr + size); 189ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton assert(addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= addr + size); 190ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton assert(opcode_offset + intersect_size <= bp.ByteSize()); 191ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton nub_size_t buf_offset = intersect_addr - addr; 192ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton ::memcpy(buf + buf_offset, bp.SavedOpcodeBytes() + opcode_offset, intersect_size); 193ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton } 194ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton ++pos; 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1984d4ff9e8f7746ba1b1d597512b7cb711350c0206Greg Claytonvoid 199ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg ClaytonDNBBreakpointList::DisableAllBreakpoints(MachProcess *process) 2004d4ff9e8f7746ba1b1d597512b7cb711350c0206Greg Clayton{ 2014d4ff9e8f7746ba1b1d597512b7cb711350c0206Greg Clayton iterator pos, end = m_breakpoints.end(); 2024d4ff9e8f7746ba1b1d597512b7cb711350c0206Greg Clayton for (pos = m_breakpoints.begin(); pos != end; ++pos) 203ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton process->DisableBreakpoint(pos->second.Address(), false); 2044d4ff9e8f7746ba1b1d597512b7cb711350c0206Greg Clayton} 2054d4ff9e8f7746ba1b1d597512b7cb711350c0206Greg Clayton 206ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Claytonvoid 207ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg ClaytonDNBBreakpointList::DisableAllWatchpoints(MachProcess *process) 208ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton{ 209ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton iterator pos, end = m_breakpoints.end(); 210ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton for (pos = m_breakpoints.begin(); pos != end; ++pos) 211ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton process->DisableWatchpoint(pos->second.Address(), false); 212ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton} 2134d4ff9e8f7746ba1b1d597512b7cb711350c0206Greg Clayton 214ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Claytonvoid 215ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg ClaytonDNBBreakpointList::RemoveDisabled() 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 217ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton iterator pos = m_breakpoints.begin(); 218ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton while (pos != m_breakpoints.end()) 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 220ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (!pos->second.IsEnabled()) 221ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton pos = m_breakpoints.erase(pos); 222ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton else 223ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton ++pos; 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 226