clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
216 lines
6.4 KiB
C++
216 lines
6.4 KiB
C++
//===-- WatchpointList.h ----------------------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLDB_BREAKPOINT_WATCHPOINTLIST_H
|
|
#define LLDB_BREAKPOINT_WATCHPOINTLIST_H
|
|
|
|
#include <list>
|
|
#include <mutex>
|
|
#include <vector>
|
|
|
|
#include "lldb/Core/Address.h"
|
|
#include "lldb/Utility/Iterable.h"
|
|
#include "lldb/lldb-private.h"
|
|
|
|
namespace lldb_private {
|
|
|
|
/// \class WatchpointList WatchpointList.h "lldb/Breakpoint/WatchpointList.h"
|
|
/// This class is used by Watchpoint to manage a list of watchpoints,
|
|
// each watchpoint in the list has a unique ID, and is unique by Address as
|
|
// well.
|
|
|
|
class WatchpointList {
|
|
// Only Target can make the watchpoint list, or add elements to it. This is
|
|
// not just some random collection of watchpoints. Rather, the act of adding
|
|
// the watchpoint to this list sets its ID.
|
|
friend class Watchpoint;
|
|
friend class Target;
|
|
|
|
public:
|
|
/// Default constructor makes an empty list.
|
|
WatchpointList();
|
|
|
|
/// Destructor, currently does nothing.
|
|
~WatchpointList();
|
|
|
|
typedef std::list<lldb::WatchpointSP> wp_collection;
|
|
typedef LockingAdaptedIterable<wp_collection, lldb::WatchpointSP,
|
|
vector_adapter, std::recursive_mutex>
|
|
WatchpointIterable;
|
|
|
|
/// Add a Watchpoint to the list.
|
|
///
|
|
/// \param[in] wp_sp
|
|
/// A shared pointer to a watchpoint being added to the list.
|
|
///
|
|
/// \return
|
|
/// The ID of the Watchpoint in the list.
|
|
lldb::watch_id_t Add(const lldb::WatchpointSP &wp_sp, bool notify);
|
|
|
|
/// 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 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::WatchpointSP FindByAddress(lldb::addr_t addr) const;
|
|
|
|
/// Returns a shared pointer to the watchpoint with watchpoint spec \a spec
|
|
/// - const version.
|
|
///
|
|
/// \param[in] spec
|
|
/// The watchpoint spec to look for.
|
|
///
|
|
/// \result
|
|
/// A shared pointer to the watchpoint. May contain a NULL
|
|
/// pointer if the watchpoint doesn't exist.
|
|
const lldb::WatchpointSP FindBySpec(std::string spec) const;
|
|
|
|
/// Returns a shared pointer to the watchpoint with id \a watchID, const
|
|
/// version.
|
|
///
|
|
/// \param[in] watchID
|
|
/// 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::WatchpointSP FindByID(lldb::watch_id_t watchID) const;
|
|
|
|
/// Returns the watchpoint id to the watchpoint at address \a addr.
|
|
///
|
|
/// \param[in] addr
|
|
/// The address to match.
|
|
///
|
|
/// \result
|
|
/// The ID of the watchpoint, or LLDB_INVALID_WATCH_ID.
|
|
lldb::watch_id_t FindIDByAddress(lldb::addr_t addr);
|
|
|
|
/// Returns the watchpoint id to the watchpoint with watchpoint spec \a
|
|
/// spec.
|
|
///
|
|
/// \param[in] spec
|
|
/// The watchpoint spec to match.
|
|
///
|
|
/// \result
|
|
/// The ID of the watchpoint, or LLDB_INVALID_WATCH_ID.
|
|
lldb::watch_id_t FindIDBySpec(std::string spec);
|
|
|
|
/// Returns a shared pointer to the watchpoint with index \a i.
|
|
///
|
|
/// \param[in] i
|
|
/// The watchpoint index to seek for.
|
|
///
|
|
/// \result
|
|
/// A shared pointer to the watchpoint. May contain a NULL pointer if
|
|
/// the watchpoint doesn't exist.
|
|
lldb::WatchpointSP GetByIndex(uint32_t i);
|
|
|
|
/// Returns a shared pointer to the watchpoint with index \a i, const
|
|
/// version.
|
|
///
|
|
/// \param[in] i
|
|
/// The watchpoint index to seek for.
|
|
///
|
|
/// \result
|
|
/// A shared pointer to the watchpoint. May contain a NULL pointer if
|
|
/// the watchpoint location doesn't exist.
|
|
const lldb::WatchpointSP GetByIndex(uint32_t i) const;
|
|
|
|
/// Removes the watchpoint given by \b watchID from this list.
|
|
///
|
|
/// \param[in] watchID
|
|
/// The watchpoint ID to remove.
|
|
///
|
|
/// \result
|
|
/// \b true if the watchpoint \a watchID was in the list.
|
|
bool Remove(lldb::watch_id_t watchID, bool notify);
|
|
|
|
/// Returns the number hit count of all watchpoints in this list.
|
|
///
|
|
/// \result
|
|
/// Hit count of all watchpoints in this list.
|
|
uint32_t GetHitCount() const;
|
|
|
|
/// Enquires of the watchpoint 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 list.
|
|
///
|
|
/// \result
|
|
/// The number of elements.
|
|
size_t GetSize() const {
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
|
return m_watchpoints.size();
|
|
}
|
|
|
|
/// Print a description of the watchpoints 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(bool notify);
|
|
|
|
/// Sets the passed in Locker to hold the Watchpoint List mutex.
|
|
///
|
|
/// \param[in] lock
|
|
/// The locker object that is set.
|
|
void GetListMutex(std::unique_lock<std::recursive_mutex> &lock);
|
|
|
|
WatchpointIterable Watchpoints() const {
|
|
return WatchpointIterable(m_watchpoints, m_mutex);
|
|
}
|
|
|
|
protected:
|
|
typedef std::vector<lldb::watch_id_t> id_vector;
|
|
|
|
id_vector GetWatchpointIDs() const;
|
|
|
|
wp_collection::iterator GetIDIterator(lldb::watch_id_t watchID);
|
|
|
|
wp_collection::const_iterator
|
|
GetIDConstIterator(lldb::watch_id_t watchID) const;
|
|
|
|
wp_collection m_watchpoints;
|
|
mutable std::recursive_mutex m_mutex;
|
|
|
|
lldb::watch_id_t m_next_wp_id = 0;
|
|
};
|
|
|
|
} // namespace lldb_private
|
|
|
|
#endif // LLDB_BREAKPOINT_WATCHPOINTLIST_H
|