124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- BreakpointSiteList.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_BreakpointSiteList_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_BreakpointSiteList_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/BreakpointSite.h"
19ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton#include "lldb/Host/Mutex.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class BreakpointSiteList BreakpointSiteList.h "lldb/Breakpoint/BreakpointSiteList.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief Class that manages lists of BreakpointSite shared pointers.
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass BreakpointSiteList
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// At present Process directly accesses the map of BreakpointSites so it can
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// do quick lookups into the map (using GetMap).
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: Find a better interface for this.
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerfriend class Process;
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Default constructor makes an empty list.
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSiteList();
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Destructor, currently does nothing.
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~BreakpointSiteList();
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Add a BreakpointSite to the list.
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] bp_site_sp
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    A shared pointer to a breakpoint site being added to the list.
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The ID of the BreakpointSite in the list.
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    lldb::break_id_t
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Add (const lldb::BreakpointSiteSP& bp_site_sp);
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Standard Dump routine, doesn't do anything at present.
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Stream into which to dump the description.
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Dump (Stream *s) const;
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns a shared pointer to the breakpoint site at address
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// \a addr.
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] addr
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The address to look for.
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A shared pointer to the breakpoint site. May contain a NULL
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     pointer if no breakpoint site exists with a matching address.
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::BreakpointSiteSP
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FindByAddress (lldb::addr_t addr);
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns a shared pointer to the breakpoint site with id \a breakID.
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] breakID
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   The breakpoint site ID to seek for.
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   A shared pointer to the breakpoint site.  May contain a NULL pointer if the
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   breakpoint doesn't exist.
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::BreakpointSiteSP
9054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    FindByID (lldb::break_id_t breakID);
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns a shared pointer to the breakpoint site with id \a breakID - const version.
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] breakID
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   The breakpoint site ID to seek for.
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   A shared pointer to the breakpoint site.  May contain a NULL pointer if the
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   breakpoint doesn't exist.
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const lldb::BreakpointSiteSP
10354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    FindByID (lldb::break_id_t breakID) const;
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns the breakpoint site id to the breakpoint site at address \a addr.
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] addr
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   The address to match.
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   The ID of the breakpoint site, or LLDB_INVALID_BREAK_ID.
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
11454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    lldb::break_id_t
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FindIDByAddress (lldb::addr_t addr);
116b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham
117b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham    //------------------------------------------------------------------
118b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham    /// Returns whether the breakpoint site \a bp_site_id has \a bp_id
119b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham    //  as one of its owners.
120b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham    ///
121b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham    /// @param[in] bp_site_id
122b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham    ///   The breakpoint site id to query.
123b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham    ///
124b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham    /// @param[in] bp_id
125b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham    ///   The breakpoint id to look for in \a bp_site_id.
126b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham    ///
127b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham    /// @result
128b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham    ///   True if \a bp_site_id exists in the site list AND \a bp_id is one of the
129b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham    ///   owners of that site.
130b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham    //------------------------------------------------------------------
131b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham    bool
132b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham    BreakpointSiteContainsBreakpoint (lldb::break_id_t bp_site_id, lldb::break_id_t bp_id);
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
134ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    void
135ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    ForEach (std::function <void(BreakpointSite *)> const &callback);
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Removes the breakpoint site given by \b breakID from this list.
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] breakID
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   The breakpoint site index to remove.
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   \b true if the breakpoint site \a breakID was in the list.
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
14754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    Remove (lldb::break_id_t breakID);
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Removes the breakpoint site at address \a addr from this list.
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] addr
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   The address from which to remove a breakpoint site.
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   \b true if \a addr had a breakpoint site to remove from the list.
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RemoveByAddress (lldb::addr_t addr);
16082820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham
16182820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham    bool
16282820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham    FindInRange (lldb::addr_t lower_bound, lldb::addr_t upper_bound, BreakpointSiteList &bp_site_list) const;
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef void (*BreakpointSiteSPMapFunc) (lldb::BreakpointSiteSP &bp, void *baton);
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Enquires of the breakpoint site on in this list with ID \a breakID whether
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// we should stop for the breakpoint or not.
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] context
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    This contains the information about this stop.
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] breakID
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    This break ID that we hit.
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we should stop, \b false otherwise.
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
18054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    ShouldStop (StoppointCallbackContext *context, lldb::break_id_t breakID);
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns the number of elements in the list.
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @result
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///   The number of elements.
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
189ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    GetSize() const
190ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    {
191ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton        Mutex::Locker locker(m_mutex);
192ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton        return m_bp_site_list.size();
193ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    }
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
195ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    bool
196ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    IsEmpty() const
197ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    {
198ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton        Mutex::Locker locker(m_mutex);
199ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton        return m_bp_site_list.empty();
200ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    }
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::map<lldb::addr_t, lldb::BreakpointSiteSP> collection;
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection::iterator
20554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    GetIDIterator(lldb::break_id_t breakID);
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection::const_iterator
20854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    GetIDConstIterator(lldb::break_id_t breakID) const;
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
210ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton    mutable Mutex m_mutex;
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection m_bp_site_list;  // The breakpoint site list.
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_BreakpointSiteList_h_
217