diff options
-rw-r--r-- | lldb/include/lldb/Breakpoint/WatchpointLocation.h | 4 | ||||
-rw-r--r-- | lldb/include/lldb/Target/StopInfo.h | 2 | ||||
-rw-r--r-- | lldb/source/Breakpoint/WatchpointLocation.cpp | 8 | ||||
-rw-r--r-- | lldb/source/Target/StopInfo.cpp | 44 | ||||
-rw-r--r-- | lldb/source/Target/ThreadPlanBase.cpp | 1 |
5 files changed, 51 insertions, 8 deletions
diff --git a/lldb/include/lldb/Breakpoint/WatchpointLocation.h b/lldb/include/lldb/Breakpoint/WatchpointLocation.h index 88c00cabbb4..9362d4ca679 100644 --- a/lldb/include/lldb/Breakpoint/WatchpointLocation.h +++ b/lldb/include/lldb/Breakpoint/WatchpointLocation.h @@ -40,12 +40,14 @@ public: void SetEnabled (bool enabled); + virtual bool + ShouldStop (StoppointCallbackContext *context); + bool WatchpointRead () const; bool WatchpointWrite () const; uint32_t GetIgnoreCount () const; void SetIgnoreCount (uint32_t n); void SetWatchpointType (uint32_t type); - bool BreakpointWasHit (StoppointCallbackContext *context); bool SetCallback (WatchpointHitCallback callback, void *callback_baton); void SetDeclInfo (std::string &str); void GetDescription (Stream *s, lldb::DescriptionLevel level); diff --git a/lldb/include/lldb/Target/StopInfo.h b/lldb/include/lldb/Target/StopInfo.h index 525ed8ce012..3a6ce8a2d4a 100644 --- a/lldb/include/lldb/Target/StopInfo.h +++ b/lldb/include/lldb/Target/StopInfo.h @@ -53,7 +53,7 @@ public: // ---------------------------------------------- // eStopReasonBreakpoint BreakpointSiteID // eStopReasonSignal Signal number - // eStopReasonWatchpoint WatchpointSiteID + // eStopReasonWatchpoint WatchpointLocationID // eStopReasonPlanComplete No significance uint64_t diff --git a/lldb/source/Breakpoint/WatchpointLocation.cpp b/lldb/source/Breakpoint/WatchpointLocation.cpp index f647e42d882..e0c14edfff2 100644 --- a/lldb/source/Breakpoint/WatchpointLocation.cpp +++ b/lldb/source/Breakpoint/WatchpointLocation.cpp @@ -62,7 +62,7 @@ WatchpointLocation::SetDeclInfo (std::string &str) // should continue. bool -WatchpointLocation::BreakpointWasHit (StoppointCallbackContext *context) +WatchpointLocation::ShouldStop (StoppointCallbackContext *context) { m_hit_count++; @@ -73,7 +73,11 @@ WatchpointLocation::BreakpointWasHit (StoppointCallbackContext *context) access |= LLDB_WATCH_TYPE_READ; if (m_watch_was_written) access |= LLDB_WATCH_TYPE_WRITE; - return m_callback(m_callback_baton, context, GetID(), access); + + if (m_callback) + return m_callback(m_callback_baton, context, GetID(), access); + else + return true; } return false; } diff --git a/lldb/source/Target/StopInfo.cpp b/lldb/source/Target/StopInfo.cpp index c0daf8a1fcf..8978f73a0fe 100644 --- a/lldb/source/Target/StopInfo.cpp +++ b/lldb/source/Target/StopInfo.cpp @@ -324,8 +324,10 @@ class StopInfoWatchpoint : public StopInfo public: StopInfoWatchpoint (Thread &thread, break_id_t watch_id) : - StopInfo (thread, watch_id), - m_description() + StopInfo(thread, watch_id), + m_description(), + m_should_stop(false), + m_should_stop_is_valid(false) { } @@ -339,6 +341,40 @@ public: return eStopReasonWatchpoint; } + virtual bool + ShouldStop (Event *event_ptr) + { + // ShouldStop() method is idempotent and should not affect hit count. + if (m_should_stop_is_valid) + return m_should_stop; + + WatchpointLocationSP wp_loc_sp = + m_thread.GetProcess().GetTarget().GetWatchpointLocationList().FindByID(GetValue()); + if (wp_loc_sp) + { + // Check if we should stop at a watchpoint. + StoppointCallbackContext context (event_ptr, + &m_thread.GetProcess(), + &m_thread, + m_thread.GetStackFrameAtIndex(0).get(), + true); + + m_should_stop = wp_loc_sp->ShouldStop (&context); + } + else + { + LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); + + if (log) + log->Printf ("Process::%s could not find watchpoint location id: %lld...", + __FUNCTION__, GetValue()); + + m_should_stop = true; + } + m_should_stop_is_valid = true; + return m_should_stop; + } + virtual const char * GetDescription () { @@ -351,10 +387,10 @@ public: return m_description.c_str(); } - - private: std::string m_description; + bool m_should_stop; + bool m_should_stop_is_valid; }; diff --git a/lldb/source/Target/ThreadPlanBase.cpp b/lldb/source/Target/ThreadPlanBase.cpp index 7529991a7bd..5c2631ad172 100644 --- a/lldb/source/Target/ThreadPlanBase.cpp +++ b/lldb/source/Target/ThreadPlanBase.cpp @@ -99,6 +99,7 @@ ThreadPlanBase::ShouldStop (Event *event_ptr) return false; case eStopReasonBreakpoint: + case eStopReasonWatchpoint: if (stop_info_sp->ShouldStop(event_ptr)) { // If we are going to stop for a breakpoint, then unship the other plans |