1 //===-- BreakpointLocation.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_BreakpointLocation_h_ 11 #define liblldb_BreakpointLocation_h_ 12 13 // C Includes 14 15 // C++ Includes 16 #include <list> 17 18 // Other libraries and framework includes 19 20 // Project includes 21 #include "lldb/lldb-private.h" 22 #include "lldb/Breakpoint/StoppointLocation.h" 23 #include "lldb/Core/Address.h" 24 #include "lldb/Core/StringList.h" 25 #include "lldb/Core/UserID.h" 26 #include "lldb/Host/Mutex.h" 27 #include "lldb/Target/Process.h" 28 #include "lldb/Expression/ClangUserExpression.h" 29 30 namespace lldb_private { 31 32 //---------------------------------------------------------------------- 33 /// @class BreakpointLocation BreakpointLocation.h "lldb/Breakpoint/BreakpointLocation.h" 34 /// @brief Class that manages one unique (by address) instance of a logical breakpoint. 35 //---------------------------------------------------------------------- 36 37 //---------------------------------------------------------------------- 38 /// General Outline: 39 /// A breakpoint location is defined by the breakpoint that produces it, 40 /// and the address that resulted in this particular instantiation. 41 /// Each breakpoint location also may have a breakpoint site if its 42 /// address has been loaded into the program. 43 /// Finally it has a settable options object. 44 /// 45 /// FIXME: Should we also store some fingerprint for the location, so 46 /// we can map one location to the "equivalent location" on rerun? This 47 /// would be useful if you've set options on the locations. 48 //---------------------------------------------------------------------- 49 50 class BreakpointLocation : 51 public std::enable_shared_from_this<BreakpointLocation>, 52 public StoppointLocation 53 { 54 public: 55 56 ~BreakpointLocation (); 57 58 //------------------------------------------------------------------ 59 /// Gets the load address for this breakpoint location 60 /// @return 61 /// Returns breakpoint location load address, \b 62 /// LLDB_INVALID_ADDRESS if not yet set. 63 //------------------------------------------------------------------ 64 lldb::addr_t 65 GetLoadAddress () const; 66 67 //------------------------------------------------------------------ 68 /// Gets the Address for this breakpoint location 69 /// @return 70 /// Returns breakpoint location Address. 71 //------------------------------------------------------------------ 72 Address & 73 GetAddress (); 74 //------------------------------------------------------------------ 75 /// Gets the Breakpoint that created this breakpoint location 76 /// @return 77 /// Returns the owning breakpoint. 78 //------------------------------------------------------------------ 79 Breakpoint & 80 GetBreakpoint (); 81 82 //------------------------------------------------------------------ 83 /// Determines whether we should stop due to a hit at this 84 /// breakpoint location. 85 /// 86 /// Side Effects: This may evaluate the breakpoint condition, and 87 /// run the callback. So this command may do a considerable amount 88 /// of work. 89 /// 90 /// @return 91 /// \b true if this breakpoint location thinks we should stop, 92 /// \b false otherwise. 93 //------------------------------------------------------------------ 94 bool 95 ShouldStop (StoppointCallbackContext *context); 96 97 //------------------------------------------------------------------ 98 // The next section deals with various breakpoint options. 99 //------------------------------------------------------------------ 100 101 //------------------------------------------------------------------ 102 /// If \a enable is \b true, enable the breakpoint, if \b false 103 /// disable it. 104 //------------------------------------------------------------------ 105 void 106 SetEnabled(bool enabled); 107 108 //------------------------------------------------------------------ 109 /// Check the Enable/Disable state. 110 /// 111 /// @return 112 /// \b true if the breakpoint is enabled, \b false if disabled. 113 //------------------------------------------------------------------ 114 bool 115 IsEnabled () const; 116 117 //------------------------------------------------------------------ 118 /// Return the current Ignore Count. 119 /// 120 /// @return 121 /// The number of breakpoint hits to be ignored. 122 //------------------------------------------------------------------ 123 uint32_t 124 GetIgnoreCount (); 125 126 //------------------------------------------------------------------ 127 /// Set the breakpoint to ignore the next \a count breakpoint hits. 128 /// 129 /// @param[in] count 130 /// The number of breakpoint hits to ignore. 131 //------------------------------------------------------------------ 132 void 133 SetIgnoreCount (uint32_t n); 134 135 //------------------------------------------------------------------ 136 /// Set the callback action invoked when the breakpoint is hit. 137 /// 138 /// The callback will return a bool indicating whether the target 139 /// should stop at this breakpoint or not. 140 /// 141 /// @param[in] callback 142 /// The method that will get called when the breakpoint is hit. 143 /// 144 /// @param[in] callback_baton_sp 145 /// A shared pointer to a Baton that provides the void * needed 146 /// for the callback. 147 /// 148 /// @see lldb_private::Baton 149 //------------------------------------------------------------------ 150 void 151 SetCallback (BreakpointHitCallback callback, 152 const lldb::BatonSP &callback_baton_sp, 153 bool is_synchronous); 154 155 void 156 SetCallback (BreakpointHitCallback callback, 157 void *baton, 158 bool is_synchronous); 159 160 void 161 ClearCallback (); 162 163 //------------------------------------------------------------------ 164 /// Set the breakpoint location's condition. 165 /// 166 /// @param[in] condition 167 /// The condition expression to evaluate when the breakpoint is hit. 168 //------------------------------------------------------------------ 169 void 170 SetCondition (const char *condition); 171 172 //------------------------------------------------------------------ 173 /// Return a pointer to the text of the condition expression. 174 /// 175 /// @return 176 /// A pointer to the condition expression text, or NULL if no 177 // condition has been set. 178 //------------------------------------------------------------------ 179 const char * 180 GetConditionText (size_t *hash = NULL) const; 181 182 bool 183 ConditionSaysStop (ExecutionContext &exe_ctx, Error &error); 184 185 186 //------------------------------------------------------------------ 187 /// Set the valid thread to be checked when the breakpoint is hit. 188 /// 189 /// @param[in] thread_id 190 /// If this thread hits the breakpoint, we stop, otherwise not. 191 //------------------------------------------------------------------ 192 void 193 SetThreadID (lldb::tid_t thread_id); 194 195 lldb::tid_t 196 GetThreadID (); 197 198 void 199 SetThreadIndex (uint32_t index); 200 201 uint32_t 202 GetThreadIndex() const; 203 204 void 205 SetThreadName (const char *thread_name); 206 207 const char * 208 GetThreadName () const; 209 210 void 211 SetQueueName (const char *queue_name); 212 213 const char * 214 GetQueueName () const; 215 216 //------------------------------------------------------------------ 217 // The next section deals with this location's breakpoint sites. 218 //------------------------------------------------------------------ 219 220 //------------------------------------------------------------------ 221 /// Try to resolve the breakpoint site for this location. 222 /// 223 /// @return 224 /// \b true if we were successful at setting a breakpoint site, 225 /// \b false otherwise. 226 //------------------------------------------------------------------ 227 bool 228 ResolveBreakpointSite (); 229 230 //------------------------------------------------------------------ 231 /// Clear this breakpoint location's breakpoint site - for instance 232 /// when disabling the breakpoint. 233 /// 234 /// @return 235 /// \b true if there was a breakpoint site to be cleared, \b false 236 /// otherwise. 237 //------------------------------------------------------------------ 238 bool 239 ClearBreakpointSite (); 240 241 //------------------------------------------------------------------ 242 /// Return whether this breakpoint location has a breakpoint site. 243 /// @return 244 /// \b true if there was a breakpoint site for this breakpoint 245 /// location, \b false otherwise. 246 //------------------------------------------------------------------ 247 bool 248 IsResolved () const; 249 250 lldb::BreakpointSiteSP 251 GetBreakpointSite() const; 252 253 //------------------------------------------------------------------ 254 // The next section are generic report functions. 255 //------------------------------------------------------------------ 256 257 //------------------------------------------------------------------ 258 /// Print a description of this breakpoint location to the stream 259 /// \a s. 260 /// 261 /// @param[in] s 262 /// The stream to which to print the description. 263 /// 264 /// @param[in] level 265 /// The description level that indicates the detail level to 266 /// provide. 267 /// 268 /// @see lldb::DescriptionLevel 269 //------------------------------------------------------------------ 270 void 271 GetDescription (Stream *s, lldb::DescriptionLevel level); 272 273 //------------------------------------------------------------------ 274 /// Standard "Dump" method. At present it does nothing. 275 //------------------------------------------------------------------ 276 void 277 Dump (Stream *s) const; 278 279 //------------------------------------------------------------------ 280 /// Use this to set location specific breakpoint options. 281 /// 282 /// It will create a copy of the containing breakpoint's options if 283 /// that hasn't been done already 284 /// 285 /// @return 286 /// A pointer to the breakpoint options. 287 //------------------------------------------------------------------ 288 BreakpointOptions * 289 GetLocationOptions (); 290 291 //------------------------------------------------------------------ 292 /// Use this to access breakpoint options from this breakpoint location. 293 /// This will point to the owning breakpoint's options unless options have 294 /// been set specifically on this location. 295 /// 296 /// @return 297 /// A pointer to the containing breakpoint's options if this 298 /// location doesn't have its own copy. 299 //------------------------------------------------------------------ 300 const BreakpointOptions * 301 GetOptionsNoCreate () const; 302 303 bool 304 ValidForThisThread (Thread *thread); 305 306 307 //------------------------------------------------------------------ 308 /// Invoke the callback action when the breakpoint is hit. 309 /// 310 /// Meant to be used by the BreakpointLocation class. 311 /// 312 /// @param[in] context 313 /// Described the breakpoint event. 314 /// 315 /// @param[in] bp_loc_id 316 /// Which breakpoint location hit this breakpoint. 317 /// 318 /// @return 319 /// \b true if the target should stop at this breakpoint and \b 320 /// false not. 321 //------------------------------------------------------------------ 322 bool 323 InvokeCallback (StoppointCallbackContext *context); 324 325 protected: 326 friend class BreakpointLocationList; 327 friend class CommandObjectBreakpointCommandAdd; 328 friend class Process; 329 330 //------------------------------------------------------------------ 331 /// Set the breakpoint site for this location to \a bp_site_sp. 332 /// 333 /// @param[in] bp_site_sp 334 /// The breakpoint site we are setting for this location. 335 /// 336 /// @return 337 /// \b true if we were successful at setting the breakpoint site, 338 /// \b false otherwise. 339 //------------------------------------------------------------------ 340 bool 341 SetBreakpointSite (lldb::BreakpointSiteSP& bp_site_sp); 342 343 void 344 DecrementIgnoreCount(); 345 346 bool 347 IgnoreCountShouldStop(); 348 349 private: 350 351 //------------------------------------------------------------------ 352 // Constructors and Destructors 353 // 354 // Only the Breakpoint can make breakpoint locations, and it owns 355 // them. 356 //------------------------------------------------------------------ 357 358 //------------------------------------------------------------------ 359 /// Constructor. 360 /// 361 /// @param[in] owner 362 /// A back pointer to the breakpoint that owns this location. 363 /// 364 /// @param[in] addr 365 /// The Address defining this location. 366 /// 367 /// @param[in] tid 368 /// The thread for which this breakpoint location is valid, or 369 /// LLDB_INVALID_THREAD_ID if it is valid for all threads. 370 /// 371 /// @param[in] hardware 372 /// \b true if a hardware breakpoint is requested. 373 //------------------------------------------------------------------ 374 375 BreakpointLocation (lldb::break_id_t bid, 376 Breakpoint &owner, 377 const Address &addr, 378 lldb::tid_t tid = LLDB_INVALID_THREAD_ID, 379 bool hardware = false); 380 381 //------------------------------------------------------------------ 382 // Data members: 383 //------------------------------------------------------------------ 384 bool m_being_created; 385 Address m_address; ///< The address defining this location. 386 Breakpoint &m_owner; ///< The breakpoint that produced this object. 387 std::unique_ptr<BreakpointOptions> m_options_ap; ///< Breakpoint options pointer, NULL if we're using our breakpoint's options. 388 lldb::BreakpointSiteSP m_bp_site_sp; ///< Our breakpoint site (it may be shared by more than one location.) 389 ClangUserExpression::ClangUserExpressionSP m_user_expression_sp; ///< The compiled expression to use in testing our condition. 390 Mutex m_condition_mutex; ///< Guards parsing and evaluation of the condition, which could be evaluated by multiple processes. 391 size_t m_condition_hash; ///< For testing whether the condition source code changed. 392 393 void 394 SendBreakpointLocationChangedEvent (lldb::BreakpointEventType eventKind); 395 396 DISALLOW_COPY_AND_ASSIGN (BreakpointLocation); 397 }; 398 399 } // namespace lldb_private 400 401 #endif // liblldb_BreakpointLocation_h_ 402