1 //===-- BreakpointLocationList.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_BreakpointLocationList_h_
11 #define liblldb_BreakpointLocationList_h_
12 
13 // C Includes
14 // C++ Includes
15 #include <vector>
16 #include <map>
17 // Other libraries and framework includes
18 // Project includes
19 #include "lldb/lldb-private.h"
20 #include "lldb/Core/Address.h"
21 #include "lldb/Host/Mutex.h"
22 
23 namespace lldb_private {
24 
25 //----------------------------------------------------------------------
26 /// @class BreakpointLocationList BreakpointLocationList.h "lldb/Breakpoint/BreakpointLocationList.h"
27 /// @brief This class is used by Breakpoint to manage a list of breakpoint locations,
28 //  each breakpoint location in the list
29 /// has a unique ID, and is unique by Address as well.
30 //----------------------------------------------------------------------
31 
32 class BreakpointLocationList
33 {
34 // Only Breakpoints can make the location list, or add elements to it.
35 // This is not just some random collection of locations.  Rather, the act of adding the location
36 // to this list sets its ID, and implicitly all the locations have the same breakpoint ID as
37 // well.  If you need a generic container for breakpoint locations, use BreakpointLocationCollection.
38 friend class Breakpoint;
39 
40 public:
41     virtual
42     ~BreakpointLocationList();
43 
44     //------------------------------------------------------------------
45     /// Standard "Dump" method.  At present it does nothing.
46     //------------------------------------------------------------------
47     void
48     Dump (Stream *s) const;
49 
50     //------------------------------------------------------------------
51     /// Returns a shared pointer to the breakpoint location at address
52     /// \a addr - const version.
53     ///
54     /// @param[in] addr
55     ///     The address to look for.
56     ///
57     /// @result
58     ///     A shared pointer to the breakpoint.  May contain a NULL
59     ///     pointer if the breakpoint doesn't exist.
60     //------------------------------------------------------------------
61     const lldb::BreakpointLocationSP
62     FindByAddress (const Address &addr) const;
63 
64     //------------------------------------------------------------------
65     /// Returns a shared pointer to the breakpoint location with id
66     /// \a breakID, const version.
67     ///
68     /// @param[in] breakID
69     ///     The breakpoint location ID to seek for.
70     ///
71     /// @result
72     ///     A shared pointer to the breakpoint.  May contain a NULL
73     ///     pointer if the breakpoint doesn't exist.
74     //------------------------------------------------------------------
75     lldb::BreakpointLocationSP
76     FindByID (lldb::break_id_t breakID) const;
77 
78     //------------------------------------------------------------------
79     /// Returns the breakpoint location id to the breakpoint location
80     /// at address \a addr.
81     ///
82     /// @param[in] addr
83     ///     The address to match.
84     ///
85     /// @result
86     ///     The ID of the breakpoint location, or LLDB_INVALID_BREAK_ID.
87     //------------------------------------------------------------------
88     lldb::break_id_t
89     FindIDByAddress (const Address &addr);
90 
91     //------------------------------------------------------------------
92     /// Returns a breakpoint location list of the breakpoint locations
93     /// in the module \a module.  This list is allocated, and owned by
94     /// the caller.
95     ///
96     /// @param[in] module
97     ///     The module to seek in.
98     ///
99     /// @param[in]
100     ///     A breakpoint collection that gets any breakpoint locations
101     ///     that match \a module appended to.
102     ///
103     /// @result
104     ///     The number of matches
105     //------------------------------------------------------------------
106     size_t
107     FindInModule (Module *module,
108                   BreakpointLocationCollection& bp_loc_list);
109 
110     //------------------------------------------------------------------
111     /// Returns a shared pointer to the breakpoint location with
112     /// index \a i.
113     ///
114     /// @param[in] i
115     ///     The breakpoint location index to seek for.
116     ///
117     /// @result
118     ///     A shared pointer to the breakpoint.  May contain a NULL
119     ///     pointer if the breakpoint doesn't exist.
120     //------------------------------------------------------------------
121     lldb::BreakpointLocationSP
122     GetByIndex (size_t i);
123 
124     //------------------------------------------------------------------
125     /// Returns a shared pointer to the breakpoint location with index
126     /// \a i, const version.
127     ///
128     /// @param[in] i
129     ///     The breakpoint location index to seek for.
130     ///
131     /// @result
132     ///     A shared pointer to the breakpoint.  May contain a NULL
133     ///     pointer if the breakpoint doesn't exist.
134     //------------------------------------------------------------------
135     const lldb::BreakpointLocationSP
136     GetByIndex (size_t i) const;
137 
138     //------------------------------------------------------------------
139     /// Removes all the locations in this list from their breakpoint site
140     /// owners list.
141     //------------------------------------------------------------------
142     void
143     ClearAllBreakpointSites ();
144 
145     //------------------------------------------------------------------
146     /// Tells all the breakopint locations in this list to attempt to
147     /// resolve any possible breakpoint sites.
148     //------------------------------------------------------------------
149     void
150     ResolveAllBreakpointSites ();
151 
152     //------------------------------------------------------------------
153     /// Returns the number of breakpoint locations in this list with
154     /// resolved breakpoints.
155     ///
156     /// @result
157     ///     Number of qualifying breakpoint locations.
158     //------------------------------------------------------------------
159     size_t
160     GetNumResolvedLocations() const;
161 
162     //------------------------------------------------------------------
163     /// Returns the number hit count of all locations in this list.
164     ///
165     /// @result
166     ///     Hit count of all locations in this list.
167     //------------------------------------------------------------------
168     uint32_t
169     GetHitCount () const;
170 
171     //------------------------------------------------------------------
172     /// Enquires of the breakpoint location in this list with ID \a
173     /// breakID whether we should stop.
174     ///
175     /// @param[in] context
176     ///     This contains the information about this stop.
177     ///
178     /// @param[in] breakID
179     ///     This break ID that we hit.
180     ///
181     /// @return
182     ///     \b true if we should stop, \b false otherwise.
183     //------------------------------------------------------------------
184     bool
185     ShouldStop (StoppointCallbackContext *context,
186                 lldb::break_id_t breakID);
187 
188     //------------------------------------------------------------------
189     /// Returns the number of elements in this breakpoint location list.
190     ///
191     /// @result
192     ///     The number of elements.
193     //------------------------------------------------------------------
194     size_t
GetSize()195     GetSize() const
196     {
197         return m_locations.size();
198     }
199 
200     //------------------------------------------------------------------
201     /// Print a description of the breakpoint locations in this list to
202     /// the stream \a s.
203     ///
204     /// @param[in] s
205     ///     The stream to which to print the description.
206     ///
207     /// @param[in] level
208     ///     The description level that indicates the detail level to
209     ///     provide.
210     ///
211     /// @see lldb::DescriptionLevel
212     //------------------------------------------------------------------
213     void
214     GetDescription (Stream *s,
215                     lldb::DescriptionLevel level);
216 
217 protected:
218 
219     //------------------------------------------------------------------
220     /// This is the standard constructor.
221     ///
222     /// It creates an empty breakpoint location list. It is protected
223     /// here because only Breakpoints are allowed to create the
224     /// breakpoint location list.
225     //------------------------------------------------------------------
226     BreakpointLocationList(Breakpoint &owner);
227 
228     //------------------------------------------------------------------
229     /// Add the breakpoint \a bp_loc_sp to the list.
230     ///
231     /// @param[in] bp_sp
232     ///     Shared pointer to the breakpoint location that will get
233     ///     added to the list.
234     ///
235     /// @result
236     ///     Returns breakpoint location id.
237     //------------------------------------------------------------------
238     lldb::BreakpointLocationSP
239     Create (const Address &addr);
240 
241     void
242     StartRecordingNewLocations(BreakpointLocationCollection &new_locations);
243 
244     void
245     StopRecordingNewLocations();
246 
247     lldb::BreakpointLocationSP
248     AddLocation (const Address &addr,
249                  bool *new_location = NULL);
250 
251     bool
252     RemoveLocation (const lldb::BreakpointLocationSP &bp_loc_sp);
253 
254     typedef std::vector<lldb::BreakpointLocationSP> collection;
255     typedef std::map<lldb_private::Address,
256                      lldb::BreakpointLocationSP,
257                      Address::ModulePointerAndOffsetLessThanFunctionObject> addr_map;
258 
259     Breakpoint &m_owner;
260     collection m_locations;
261     addr_map m_address_to_location;
262     mutable Mutex m_mutex;
263     lldb::break_id_t m_next_id;
264     BreakpointLocationCollection *m_new_location_recorder;
265 };
266 
267 } // namespace lldb_private
268 
269 #endif  // liblldb_BreakpointLocationList_h_
270