1//===-- BreakpointSiteList.h ------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLDB_BREAKPOINT_BREAKPOINTSITELIST_H
10#define LLDB_BREAKPOINT_BREAKPOINTSITELIST_H
11
12#include <functional>
13#include <map>
14#include <mutex>
15
16#include "lldb/Breakpoint/BreakpointSite.h"
17
18namespace lldb_private {
19
20/// \class BreakpointSiteList BreakpointSiteList.h
21/// "lldb/Breakpoint/BreakpointSiteList.h" Class that manages lists of
22/// BreakpointSite shared pointers.
23class BreakpointSiteList {
24  // At present Process directly accesses the map of BreakpointSites so it can
25  // do quick lookups into the map (using GetMap).
26  // FIXME: Find a better interface for this.
27  friend class Process;
28
29public:
30  /// Default constructor makes an empty list.
31  BreakpointSiteList();
32
33  /// Destructor, currently does nothing.
34  ~BreakpointSiteList();
35
36  /// Add a BreakpointSite to the list.
37  ///
38  /// \param[in] bp_site_sp
39  ///    A shared pointer to a breakpoint site being added to the list.
40  ///
41  /// \return
42  ///    The ID of the BreakpointSite in the list.
43  lldb::break_id_t Add(const lldb::BreakpointSiteSP &bp_site_sp);
44
45  /// Standard Dump routine, doesn't do anything at present. \param[in] s
46  ///     Stream into which to dump the description.
47  void Dump(Stream *s) const;
48
49  /// Returns a shared pointer to the breakpoint site at address \a addr.
50  ///
51  /// \param[in] addr
52  ///     The address to look for.
53  ///
54  /// \result
55  ///     A shared pointer to the breakpoint site. May contain a NULL
56  ///     pointer if no breakpoint site exists with a matching address.
57  lldb::BreakpointSiteSP FindByAddress(lldb::addr_t addr);
58
59  /// Returns a shared pointer to the breakpoint site with id \a breakID.
60  ///
61  /// \param[in] breakID
62  ///   The breakpoint site ID to seek for.
63  ///
64  /// \result
65  ///   A shared pointer to the breakpoint site.  May contain a NULL pointer if
66  ///   the
67  ///   breakpoint doesn't exist.
68  lldb::BreakpointSiteSP FindByID(lldb::break_id_t breakID);
69
70  /// Returns a shared pointer to the breakpoint site with id \a breakID -
71  /// const version.
72  ///
73  /// \param[in] breakID
74  ///   The breakpoint site ID to seek for.
75  ///
76  /// \result
77  ///   A shared pointer to the breakpoint site.  May contain a NULL pointer if
78  ///   the
79  ///   breakpoint doesn't exist.
80  const lldb::BreakpointSiteSP FindByID(lldb::break_id_t breakID) const;
81
82  /// Returns the breakpoint site id to the breakpoint site at address \a
83  /// addr.
84  ///
85  /// \param[in] addr
86  ///   The address to match.
87  ///
88  /// \result
89  ///   The ID of the breakpoint site, or LLDB_INVALID_BREAK_ID.
90  lldb::break_id_t FindIDByAddress(lldb::addr_t addr);
91
92  /// Returns whether the breakpoint site \a bp_site_id has \a bp_id
93  //  as one of its owners.
94  ///
95  /// \param[in] bp_site_id
96  ///   The breakpoint site id to query.
97  ///
98  /// \param[in] bp_id
99  ///   The breakpoint id to look for in \a bp_site_id.
100  ///
101  /// \result
102  ///   True if \a bp_site_id exists in the site list AND \a bp_id is one of the
103  ///   owners of that site.
104  bool BreakpointSiteContainsBreakpoint(lldb::break_id_t bp_site_id,
105                                        lldb::break_id_t bp_id);
106
107  void ForEach(std::function<void(BreakpointSite *)> const &callback);
108
109  /// Removes the breakpoint site given by \b breakID from this list.
110  ///
111  /// \param[in] breakID
112  ///   The breakpoint site index to remove.
113  ///
114  /// \result
115  ///   \b true if the breakpoint site \a breakID was in the list.
116  bool Remove(lldb::break_id_t breakID);
117
118  /// Removes the breakpoint site at address \a addr from this list.
119  ///
120  /// \param[in] addr
121  ///   The address from which to remove a breakpoint site.
122  ///
123  /// \result
124  ///   \b true if \a addr had a breakpoint site to remove from the list.
125  bool RemoveByAddress(lldb::addr_t addr);
126
127  bool FindInRange(lldb::addr_t lower_bound, lldb::addr_t upper_bound,
128                   BreakpointSiteList &bp_site_list) const;
129
130  typedef void (*BreakpointSiteSPMapFunc)(lldb::BreakpointSiteSP &bp,
131                                          void *baton);
132
133  /// Enquires of the breakpoint site on in this list with ID \a breakID
134  /// whether we should stop for the breakpoint or not.
135  ///
136  /// \param[in] context
137  ///    This contains the information about this stop.
138  ///
139  /// \param[in] breakID
140  ///    This break ID that we hit.
141  ///
142  /// \return
143  ///    \b true if we should stop, \b false otherwise.
144  bool ShouldStop(StoppointCallbackContext *context, lldb::break_id_t breakID);
145
146  /// Returns the number of elements in the list.
147  ///
148  /// \result
149  ///   The number of elements.
150  size_t GetSize() const {
151    std::lock_guard<std::recursive_mutex> guard(m_mutex);
152    return m_bp_site_list.size();
153  }
154
155  bool IsEmpty() const {
156    std::lock_guard<std::recursive_mutex> guard(m_mutex);
157    return m_bp_site_list.empty();
158  }
159
160protected:
161  typedef std::map<lldb::addr_t, lldb::BreakpointSiteSP> collection;
162
163  collection::iterator GetIDIterator(lldb::break_id_t breakID);
164
165  collection::const_iterator GetIDConstIterator(lldb::break_id_t breakID) const;
166
167  mutable std::recursive_mutex m_mutex;
168  collection m_bp_site_list; // The breakpoint site list.
169};
170
171} // namespace lldb_private
172
173#endif // LLDB_BREAKPOINT_BREAKPOINTSITELIST_H
174