Files
clang-r547379/include/lldb/Breakpoint/WatchpointResource.h
Ryan Prichard 6024e5c395 Update prebuilt Clang to r547379 (20.0.0).
clang 20.0.0 (based on r547379) from build 12806354.

Bug: http://b/379133546
Test: N/A
Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b

Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
2025-11-26 14:59:46 -05:00

162 lines
4.9 KiB
C++

//===-- WatchpointResource.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_WATCHPOINTRESOURCE_H
#define LLDB_BREAKPOINT_WATCHPOINTRESOURCE_H
#include "lldb/Utility/Iterable.h"
#include "lldb/lldb-public.h"
#include <mutex>
#include <vector>
namespace lldb_private {
class WatchpointResource
: public std::enable_shared_from_this<WatchpointResource> {
public:
WatchpointResource(lldb::addr_t addr, size_t size, bool read, bool write);
~WatchpointResource();
typedef lldb::wp_resource_id_t SiteID;
typedef lldb::watch_id_t ConstituentID;
lldb::addr_t GetLoadAddress() const;
size_t GetByteSize() const;
bool WatchpointResourceRead() const;
bool WatchpointResourceWrite() const;
void SetType(bool read, bool write);
typedef std::vector<lldb::WatchpointSP> WatchpointCollection;
typedef LockingAdaptedIterable<WatchpointCollection, lldb::WatchpointSP,
vector_adapter, std::mutex>
WatchpointIterable;
/// Iterate over the watchpoint constituents for this resource
///
/// \return
/// An Iterable object which can be used to loop over the watchpoints
/// that are constituents of this resource.
WatchpointIterable Constituents() {
return WatchpointIterable(m_constituents, m_constituents_mutex);
}
/// Enquires of the atchpoints that produced this watchpoint resource
/// whether we should stop at this location.
///
/// \param[in] context
/// This contains the information about this stop.
///
/// \return
/// \b true if we should stop, \b false otherwise.
bool ShouldStop(StoppointCallbackContext *context);
/// Standard Dump method
void Dump(Stream *s) const;
/// The "Constituents" are the watchpoints that share this resource.
/// The method adds the \a constituent to this resource's constituent list.
///
/// \param[in] constituent
/// \a constituent is the Wachpoint to add.
void AddConstituent(const lldb::WatchpointSP &constituent);
/// The method removes the constituent at \a constituent from this watchpoint
/// resource.
void RemoveConstituent(lldb::WatchpointSP &constituent);
/// This method returns the number of Watchpoints currently using
/// watchpoint resource.
///
/// \return
/// The number of constituents.
size_t GetNumberOfConstituents();
/// This method returns the Watchpoint at index \a index using this
/// Resource. The constituents are listed ordinally from 0 to
/// GetNumberOfConstituents() - 1 so you can use this method to iterate over
/// the constituents.
///
/// \param[in] idx
/// The index in the list of constituents for which you wish the
/// constituent location.
///
/// \return
/// The Watchpoint at that index.
lldb::WatchpointSP GetConstituentAtIndex(size_t idx);
/// Check if the constituents includes a watchpoint.
///
/// \param[in] wp_sp
/// The WatchpointSP to search for.
///
/// \result
/// true if this resource's constituents includes the watchpoint.
bool ConstituentsContains(const lldb::WatchpointSP &wp_sp);
/// Check if the constituents includes a watchpoint.
///
/// \param[in] wp
/// The Watchpoint to search for.
///
/// \result
/// true if this resource's constituents includes the watchpoint.
bool ConstituentsContains(const lldb_private::Watchpoint *wp);
/// This method copies the watchpoint resource's constituents into a new
/// collection. It does this while the constituents mutex is locked.
///
/// \return
/// A copy of the Watchpoints which own this resource.
WatchpointCollection CopyConstituentsList();
lldb::wp_resource_id_t GetID() const;
bool Contains(lldb::addr_t addr);
protected:
// The StopInfoWatchpoint knows when it is processing a hit for a thread for
// a site, so let it be the one to manage setting the location hit count once
// and only once.
friend class StopInfoWatchpoint;
void BumpHitCounts();
private:
static lldb::wp_resource_id_t GetNextID();
lldb::wp_resource_id_t m_id;
// Start address & size aligned & expanded to be a valid watchpoint
// memory granule on this target.
lldb::addr_t m_addr;
size_t m_size;
bool m_watch_read;
bool m_watch_write;
/// The Watchpoints which own this resource.
WatchpointCollection m_constituents;
/// This mutex protects the constituents collection.
std::mutex m_constituents_mutex;
WatchpointResource(const WatchpointResource &) = delete;
const WatchpointResource &operator=(const WatchpointResource &) = delete;
};
} // namespace lldb_private
#endif // LLDB_BREAKPOINT_WATCHPOINTRESOURCE_H