124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- BreakpointLocationList.h --------------------------------*- 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#ifndef liblldb_BreakpointLocationList_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_BreakpointLocationList_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map>
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Mutex.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class BreakpointLocationList BreakpointLocationList.h "lldb/Breakpoint/BreakpointLocationList.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief This class is used by Breakpoint to manage a list of breakpoint locations,
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  each breakpoint location in the list
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// has a unique ID, and is unique by Address as well.
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass BreakpointLocationList
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Only Breakpoints can make the location list, or add elements to it.
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This is not just some random collection of locations.  Rather, the act of adding the location
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// to this list sets its ID, and implicitly all the locations have the same breakpoint ID as
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// well.  If you need a generic container for breakpoint locations, use BreakpointLocationCollection.
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerfriend class Breakpoint;
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
41bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    virtual
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~BreakpointLocationList();
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Standard "Dump" method.  At present it does nothing.
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Dump (Stream *s) const;
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns a shared pointer to the breakpoint location at address
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// \a addr - const version.
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] addr
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The address to look for.
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A shared pointer to the breakpoint.  May contain a NULL
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     pointer if the breakpoint doesn't exist.
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const lldb::BreakpointLocationSP
6219a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg Clayton    FindByAddress (const Address &addr) const;
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns a shared pointer to the breakpoint location with id
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// \a breakID, const version.
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] breakID
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The breakpoint location ID to seek for.
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A shared pointer to the breakpoint.  May contain a NULL
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     pointer if the breakpoint doesn't exist.
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7519a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg Clayton    lldb::BreakpointLocationSP
7654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    FindByID (lldb::break_id_t breakID) const;
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns the breakpoint location id to the breakpoint location
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// at address \a addr.
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] addr
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The address to match.
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The ID of the breakpoint location, or LLDB_INVALID_BREAK_ID.
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    lldb::break_id_t
8919a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg Clayton    FindIDByAddress (const Address &addr);
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns a breakpoint location list of the breakpoint locations
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// in the module \a module.  This list is allocated, and owned by
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// the caller.
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] module
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The module to seek in.
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in]
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A breakpoint collection that gets any breakpoint locations
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     that match \a module appended to.
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The number of matches
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FindInModule (Module *module,
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                  BreakpointLocationCollection& bp_loc_list);
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns a shared pointer to the breakpoint location with
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// index \a i.
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] i
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The breakpoint location index to seek for.
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A shared pointer to the breakpoint.  May contain a NULL
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     pointer if the breakpoint doesn't exist.
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::BreakpointLocationSP
12236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    GetByIndex (size_t i);
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns a shared pointer to the breakpoint location with index
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// \a i, const version.
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] i
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The breakpoint location index to seek for.
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A shared pointer to the breakpoint.  May contain a NULL
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     pointer if the breakpoint doesn't exist.
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const lldb::BreakpointLocationSP
13636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    GetByIndex (size_t i) const;
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Removes all the locations in this list from their breakpoint site
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// owners list.
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ClearAllBreakpointSites ();
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Tells all the breakopint locations in this list to attempt to
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// resolve any possible breakpoint sites.
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ResolveAllBreakpointSites ();
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns the number of breakpoint locations in this list with
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// resolved breakpoints.
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Number of qualifying breakpoint locations.
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetNumResolvedLocations() const;
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
163c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    /// Returns the number hit count of all locations in this list.
164c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    ///
165c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    /// @result
166c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    ///     Hit count of all locations in this list.
167c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    //------------------------------------------------------------------
168c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    uint32_t
169c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    GetHitCount () const;
170c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton
171c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    //------------------------------------------------------------------
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Enquires of the breakpoint location in this list with ID \a
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// breakID whether we should stop.
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] context
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     This contains the information about this stop.
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] breakID
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     This break ID that we hit.
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b true if we should stop, \b false otherwise.
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ShouldStop (StoppointCallbackContext *context,
18654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                lldb::break_id_t breakID);
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns the number of elements in this breakpoint location list.
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The number of elements.
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSize() const
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_locations.size();
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Print a description of the breakpoint locations in this list to
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// the stream \a s.
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The stream to which to print the description.
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] level
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The description level that indicates the detail level to
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     provide.
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see lldb::DescriptionLevel
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetDescription (Stream *s,
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    lldb::DescriptionLevel level);
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// This is the standard constructor.
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// It creates an empty breakpoint location list. It is protected
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// here because only Breakpoints are allowed to create the
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// breakpoint location list.
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
22628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    BreakpointLocationList(Breakpoint &owner);
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Add the breakpoint \a bp_loc_sp to the list.
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] bp_sp
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Shared pointer to the breakpoint location that will get
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     added to the list.
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Returns breakpoint location id.
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
23819a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg Clayton    lldb::BreakpointLocationSP
23928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    Create (const Address &addr);
24028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
24128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    void
24228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    StartRecordingNewLocations(BreakpointLocationCollection &new_locations);
24328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
24428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    void
24528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    StopRecordingNewLocations();
24628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
24728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    lldb::BreakpointLocationSP
24828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    AddLocation (const Address &addr,
24928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                 bool *new_location = NULL);
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2513508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    bool
2523508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    RemoveLocation (const lldb::BreakpointLocationSP &bp_loc_sp);
2533508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::vector<lldb::BreakpointLocationSP> collection;
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::map<lldb_private::Address,
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     lldb::BreakpointLocationSP,
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     Address::ModulePointerAndOffsetLessThanFunctionObject> addr_map;
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    Breakpoint &m_owner;
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection m_locations;
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    addr_map m_address_to_location;
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mutable Mutex m_mutex;
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::break_id_t m_next_id;
26428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    BreakpointLocationCollection *m_new_location_recorder;
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_BreakpointLocationList_h_
270