blob: 32ad0998784fb9f750298fd3b50bc61c919503bf [file] [log] [blame]
//===-- WatchpointLocationList.h --------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef liblldb_WatchpointLocationList_h_
#define liblldb_WatchpointLocationList_h_
// C Includes
// C++ Includes
#include <vector>
#include <map>
// Other libraries and framework includes
// Project includes
#include "lldb/lldb-private.h"
#include "lldb/Core/Address.h"
#include "lldb/Host/Mutex.h"
#include "lldb/Breakpoint/WatchpointLocation.h"
namespace lldb_private {
//----------------------------------------------------------------------
/// @class WatchpointLocationList WatchpointLocationList.h "lldb/Breakpoint/WatchpointLocationList.h"
/// @brief This class is used by Watchpoint to manage a list of watchpoint locations,
// each watchpoint location in the list
/// has a unique ID, and is unique by Address as well.
//----------------------------------------------------------------------
class WatchpointLocationList
{
// Only Target can make the location list, or add elements to it.
// This is not just some random collection of locations. Rather, the act of adding the location
// to this list sets its ID.
friend class WatchpointLocation;
public:
//------------------------------------------------------------------
/// Default constructor makes an empty list.
//------------------------------------------------------------------
WatchpointLocationList();
//------------------------------------------------------------------
/// Destructor, currently does nothing.
//------------------------------------------------------------------
~WatchpointLocationList();
//------------------------------------------------------------------
/// Add a WatchpointLocation to the list.
///
/// @param[in] wp_loc_sp
/// A shared pointer to a watchpoint location being added to the list.
///
/// @return
/// The ID of the WatchpointLocation in the list.
//------------------------------------------------------------------
lldb::watch_id_t
Add (const lldb::WatchpointLocationSP& wp_loc_sp);
//------------------------------------------------------------------
/// Standard "Dump" method.
//------------------------------------------------------------------
void
Dump (Stream *s) const;
//------------------------------------------------------------------
/// Dump with lldb::DescriptionLevel.
//------------------------------------------------------------------
void
DumpWithLevel (Stream *s, lldb::DescriptionLevel description_level) const;
//------------------------------------------------------------------
/// Returns a shared pointer to the watchpoint location at address
/// \a addr - const version.
///
/// @param[in] addr
/// The address to look for.
///
/// @result
/// A shared pointer to the watchpoint. May contain a NULL
/// pointer if the watchpoint doesn't exist.
//------------------------------------------------------------------
const lldb::WatchpointLocationSP
FindByAddress (lldb::addr_t addr) const;
//------------------------------------------------------------------
/// Returns a shared pointer to the watchpoint location with id
/// \a breakID, const version.
///
/// @param[in] breakID
/// The watchpoint location ID to seek for.
///
/// @result
/// A shared pointer to the watchpoint. May contain a NULL
/// pointer if the watchpoint doesn't exist.
//------------------------------------------------------------------
lldb::WatchpointLocationSP
FindByID (lldb::watch_id_t watchID) const;
//------------------------------------------------------------------
/// Returns the watchpoint location id to the watchpoint location
/// at address \a addr.
///
/// @param[in] addr
/// The address to match.
///
/// @result
/// The ID of the watchpoint location, or LLDB_INVALID_WATCH_ID.
//------------------------------------------------------------------
lldb::watch_id_t
FindIDByAddress (lldb::addr_t addr);
//------------------------------------------------------------------
/// Returns a shared pointer to the watchpoint location with
/// index \a i.
///
/// @param[in] i
/// The watchpoint location index to seek for.
///
/// @result
/// A shared pointer to the watchpoint location. May contain a NULL
/// pointer if the watchpoint location doesn't exist.
//------------------------------------------------------------------
lldb::WatchpointLocationSP
GetByIndex (uint32_t i);
//------------------------------------------------------------------
/// Returns a shared pointer to the watchpoint location with index
/// \a i, const version.
///
/// @param[in] i
/// The watchpoint location index to seek for.
///
/// @result
/// A shared pointer to the watchpoint location. May contain a NULL
/// pointer if the watchpoint location doesn't exist.
//------------------------------------------------------------------
const lldb::WatchpointLocationSP
GetByIndex (uint32_t i) const;
//------------------------------------------------------------------
/// Removes the watchpoint location given by \b watchID from this list.
///
/// @param[in] watchID
/// The watchpoint location ID to remove.
///
/// @result
/// \b true if the watchpoint location \a watchID was in the list.
//------------------------------------------------------------------
bool
Remove (lldb::watch_id_t watchID);
//------------------------------------------------------------------
/// Returns the number hit count of all locations in this list.
///
/// @result
/// Hit count of all locations in this list.
//------------------------------------------------------------------
uint32_t
GetHitCount () const;
//------------------------------------------------------------------
/// Enquires of the watchpoint location in this list with ID \a
/// watchID whether we should stop.
///
/// @param[in] context
/// This contains the information about this stop.
///
/// @param[in] watchID
/// This watch ID that we hit.
///
/// @return
/// \b true if we should stop, \b false otherwise.
//------------------------------------------------------------------
bool
ShouldStop (StoppointCallbackContext *context,
lldb::watch_id_t watchID);
//------------------------------------------------------------------
/// Returns the number of elements in this watchpoint location list.
///
/// @result
/// The number of elements.
//------------------------------------------------------------------
size_t
GetSize() const
{
return m_address_to_location.size();
}
//------------------------------------------------------------------
/// Print a description of the watchpoint locations in this list to
/// the stream \a s.
///
/// @param[in] s
/// The stream to which to print the description.
///
/// @param[in] level
/// The description level that indicates the detail level to
/// provide.
///
/// @see lldb::DescriptionLevel
//------------------------------------------------------------------
void
GetDescription (Stream *s,
lldb::DescriptionLevel level);
void
SetEnabledAll (bool enabled);
void
RemoveAll ();
//------------------------------------------------------------------
/// Sets the passed in Locker to hold the Watchpoint Location List mutex.
///
/// @param[in] locker
/// The locker object that is set.
//------------------------------------------------------------------
void
GetListMutex (lldb_private::Mutex::Locker &locker);
protected:
typedef std::vector<lldb::WatchpointLocationSP> collection;
typedef std::map<lldb::addr_t, lldb::WatchpointLocationSP> addr_map;
addr_map::iterator
GetIDIterator(lldb::watch_id_t watchID);
addr_map::const_iterator
GetIDConstIterator(lldb::watch_id_t watchID) const;
collection m_locations;
addr_map m_address_to_location;
mutable Mutex m_mutex;
};
} // namespace lldb_private
#endif // liblldb_WatchpointLocationList_h_