BreakpointList.h revision 263367
1//===-- BreakpointList.h ----------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_BreakpointList_h_
11#define liblldb_BreakpointList_h_
12
13// C Includes
14// C++ Includes
15#include <list>
16// Other libraries and framework includes
17// Project includes
18#include "lldb/Breakpoint/Breakpoint.h"
19#include "lldb/Host/Mutex.h"
20
21namespace lldb_private {
22
23//----------------------------------------------------------------------
24/// @class BreakpointList BreakpointList.h "lldb/Breakpoint/BreakpointList.h"
25/// @brief This class manages a list of breakpoints.
26//----------------------------------------------------------------------
27
28//----------------------------------------------------------------------
29/// General Outline:
30/// Allows adding and removing breakpoints and find by ID and index.
31//----------------------------------------------------------------------
32
33class BreakpointList
34{
35public:
36    BreakpointList (bool is_internal);
37
38    ~BreakpointList();
39
40    //------------------------------------------------------------------
41    /// Add the breakpoint \a bp_sp to the list.
42    ///
43    /// @param[in] bp_sp
44    ///   Shared pointer to the breakpoint that will get added to the list.
45    ///
46    /// @result
47    ///   Returns breakpoint id.
48    //------------------------------------------------------------------
49    lldb::break_id_t
50    Add (lldb::BreakpointSP& bp_sp, bool notify);
51
52    //------------------------------------------------------------------
53    /// Standard "Dump" method.  At present it does nothing.
54    //------------------------------------------------------------------
55    void
56    Dump (Stream *s) const;
57
58    //------------------------------------------------------------------
59    /// Returns a shared pointer to the breakpoint with id \a breakID.
60    ///
61    /// @param[in] breakID
62    ///   The breakpoint ID to seek for.
63    ///
64    /// @result
65    ///   A shared pointer to the breakpoint.  May contain a NULL pointer if the
66    ///   breakpoint doesn't exist.
67    //------------------------------------------------------------------
68    lldb::BreakpointSP
69    FindBreakpointByID (lldb::break_id_t breakID);
70
71    //------------------------------------------------------------------
72    /// Returns a shared pointer to the breakpoint with id \a breakID.  Const version.
73    ///
74    /// @param[in] breakID
75    ///   The breakpoint ID to seek for.
76    ///
77    /// @result
78    ///   A shared pointer to the breakpoint.  May contain a NULL pointer if the
79    ///   breakpoint doesn't exist.
80    //------------------------------------------------------------------
81    const lldb::BreakpointSP
82    FindBreakpointByID (lldb::break_id_t breakID) const;
83
84    //------------------------------------------------------------------
85    /// Returns a shared pointer to the breakpoint with index \a i.
86    ///
87    /// @param[in] i
88    ///   The breakpoint index to seek for.
89    ///
90    /// @result
91    ///   A shared pointer to the breakpoint.  May contain a NULL pointer if the
92    ///   breakpoint doesn't exist.
93    //------------------------------------------------------------------
94    lldb::BreakpointSP
95    GetBreakpointAtIndex (size_t i);
96
97    //------------------------------------------------------------------
98    /// Returns a shared pointer to the breakpoint with index \a i, const version
99    ///
100    /// @param[in] i
101    ///   The breakpoint index to seek for.
102    ///
103    /// @result
104    ///   A shared pointer to the breakpoint.  May contain a NULL pointer if the
105    ///   breakpoint doesn't exist.
106    //------------------------------------------------------------------
107    const lldb::BreakpointSP
108    GetBreakpointAtIndex (size_t i) const;
109
110    //------------------------------------------------------------------
111    /// Returns the number of elements in this breakpoint list.
112    ///
113    /// @result
114    ///   The number of elements.
115    //------------------------------------------------------------------
116    size_t
117    GetSize() const
118    {
119        Mutex::Locker locker(m_mutex);
120        return m_breakpoints.size();
121    }
122
123    //------------------------------------------------------------------
124    /// Removes the breakpoint given by \b breakID from this list.
125    ///
126    /// @param[in] breakID
127    ///   The breakpoint index to remove.
128    ///
129    /// @result
130    ///   \b true if the breakpoint \a breakID was in the list.
131    //------------------------------------------------------------------
132    bool
133    Remove (lldb::break_id_t breakID, bool notify);
134
135
136    //------------------------------------------------------------------
137    /// Removes all invalid breakpoint locations.
138    ///
139    /// Removes all breakpoint locations in the list with architectures
140    /// that aren't compatible with \a arch. Also remove any breakpoint
141    /// locations with whose locations have address where the section
142    /// has been deleted (module and object files no longer exist).
143    ///
144    /// This is typically used after the process calls exec, or anytime
145    /// the architecture of the target changes.
146    ///
147    /// @param[in] arch
148    ///     If valid, check the module in each breakpoint to make sure
149    ///     they are compatible, otherwise, ignore architecture.
150    //------------------------------------------------------------------
151    void
152    RemoveInvalidLocations (const ArchSpec &arch);
153
154    void
155    SetEnabledAll (bool enabled);
156
157    //------------------------------------------------------------------
158    /// Removes all the breakpoints from this list.
159    //------------------------------------------------------------------
160    void
161    RemoveAll (bool notify);
162
163    //------------------------------------------------------------------
164    /// Tell all the breakpoints to update themselves due to a change in the
165    /// modules in \a module_list.  \a added says whether the module was loaded
166    /// or unloaded.
167    ///
168    /// @param[in] module_list
169    ///   The module list that has changed.
170    ///
171    /// @param[in] load
172    ///   \b true if the modules are loaded, \b false if unloaded.
173    ///
174    /// @param[in] delete_locations
175    ///   If \a load is \b false, then delete breakpoint locations when
176    ///   when updating breakpoints.
177    //------------------------------------------------------------------
178    void
179    UpdateBreakpoints (ModuleList &module_list,
180                       bool load,
181                       bool delete_locations);
182
183    void
184    UpdateBreakpointsWhenModuleIsReplaced (lldb::ModuleSP old_module_sp, lldb::ModuleSP new_module_sp);
185
186    void
187    ClearAllBreakpointSites ();
188
189    //------------------------------------------------------------------
190    /// Sets the passed in Locker to hold the Breakpoint List mutex.
191    ///
192    /// @param[in] locker
193    ///   The locker object that is set.
194    //------------------------------------------------------------------
195    void
196    GetListMutex (lldb_private::Mutex::Locker &locker);
197
198protected:
199    typedef std::list<lldb::BreakpointSP> bp_collection;
200
201    bp_collection::iterator
202    GetBreakpointIDIterator(lldb::break_id_t breakID);
203
204    bp_collection::const_iterator
205    GetBreakpointIDConstIterator(lldb::break_id_t breakID) const;
206
207    mutable Mutex m_mutex;
208    bp_collection m_breakpoints;  // The breakpoint list, currently a list.
209    lldb::break_id_t m_next_break_id;
210    bool m_is_internal;
211
212private:
213    DISALLOW_COPY_AND_ASSIGN (BreakpointList);
214};
215
216} // namespace lldb_private
217
218#endif  // liblldb_BreakpointList_h_
219