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