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