[Lldb-commits] [lldb] r151435 - in /lldb/trunk: include/lldb/Breakpoint/StoppointLocation.h include/lldb/Breakpoint/Watchpoint.h include/lldb/Breakpoint/WatchpointList.h include/lldb/Target/Target.h source/Breakpoint/Watchpoint.cpp source/Breakpoint/WatchpointList.cpp source/Target/Target.cpp

Johnny Chen johnny.chen at apple.com
Fri Feb 24 22:44:30 PST 2012


Author: johnny
Date: Sat Feb 25 00:44:30 2012
New Revision: 151435

URL: http://llvm.org/viewvc/llvm-project?rev=151435&view=rev
Log:
Make the Watchpoint IDs unique per target, not across targets as before.
Now Each newly created target has its Watchpoint IDs as 1, 2, 3 ...

Modified:
    lldb/trunk/include/lldb/Breakpoint/StoppointLocation.h
    lldb/trunk/include/lldb/Breakpoint/Watchpoint.h
    lldb/trunk/include/lldb/Breakpoint/WatchpointList.h
    lldb/trunk/include/lldb/Target/Target.h
    lldb/trunk/source/Breakpoint/Watchpoint.cpp
    lldb/trunk/source/Breakpoint/WatchpointList.cpp
    lldb/trunk/source/Target/Target.cpp

Modified: lldb/trunk/include/lldb/Breakpoint/StoppointLocation.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Breakpoint/StoppointLocation.h?rev=151435&r1=151434&r2=151435&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Breakpoint/StoppointLocation.h (original)
+++ lldb/trunk/include/lldb/Breakpoint/StoppointLocation.h Sat Feb 25 00:44:30 2012
@@ -51,10 +51,10 @@
         return m_addr;
     }
 
-    virtual lldb::addr_t
-    SetLoadAddress () const
+    virtual void
+    SetLoadAddress (lldb::addr_t addr)
     {
-        return m_addr;
+        m_addr = addr;
     }
 
     uint32_t

Modified: lldb/trunk/include/lldb/Breakpoint/Watchpoint.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Breakpoint/Watchpoint.h?rev=151435&r1=151434&r2=151435&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Breakpoint/Watchpoint.h (original)
+++ lldb/trunk/include/lldb/Breakpoint/Watchpoint.h Sat Feb 25 00:44:30 2012
@@ -55,6 +55,7 @@
     bool        SetCallback (WatchpointHitCallback callback, void *callback_baton);
     void        ClearCallback();
     void        SetDeclInfo (std::string &str);
+    void        SetWatchSpec (std::string &str);
     void        GetDescription (Stream *s, lldb::DescriptionLevel level);
     void        Dump (Stream *s) const;
     void        DumpWithLevel (Stream *s, lldb::DescriptionLevel description_level) const;
@@ -96,8 +97,11 @@
 
 private:
     friend class Target;
+    friend class WatchpointList;
 
     void        SetTarget(Target *target_ptr) { m_target = target_ptr; }
+    std::string GetWatchSpec() { return m_watch_spec_str; }
+    void        ResetHitCount() { m_hit_count = 0; }
 
     Target      *m_target;
     bool        m_enabled;             // Is this watchpoint enabled
@@ -110,12 +114,12 @@
     WatchpointHitCallback m_callback;
     void *      m_callback_baton;      // Callback user data to pass to callback
     std::string m_decl_str;            // Declaration information, if any.
+    std::string m_watch_spec_str;      // Spec for the watchpoint (for future use).
     Error       m_error;               // An error object describing errors creating watchpoint.
 
     std::auto_ptr<ClangUserExpression> m_condition_ap;  // The condition to test.
 
-    static lldb::break_id_t
-    GetNextID();
+    void SetID(lldb::watch_id_t id) { m_loc_id = id; }
 
     DISALLOW_COPY_AND_ASSIGN (Watchpoint);
 };

Modified: lldb/trunk/include/lldb/Breakpoint/WatchpointList.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Breakpoint/WatchpointList.h?rev=151435&r1=151434&r2=151435&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Breakpoint/WatchpointList.h (original)
+++ lldb/trunk/include/lldb/Breakpoint/WatchpointList.h Sat Feb 25 00:44:30 2012
@@ -12,8 +12,8 @@
 
 // C Includes
 // C++ Includes
+#include <list>
 #include <vector>
-#include <map>
 // Other libraries and framework includes
 // Project includes
 #include "lldb/lldb-private.h"
@@ -35,6 +35,7 @@
 // This is not just some random collection of watchpoints.  Rather, the act of
 // adding the watchpoint to this list sets its ID.
 friend class Watchpoint;
+friend class Target;
 
 public:
     //------------------------------------------------------------------
@@ -72,7 +73,8 @@
     DumpWithLevel (Stream *s, lldb::DescriptionLevel description_level) const;
 
     //------------------------------------------------------------------
-    /// Returns a shared pointer to the watchpoint at address /// \a addr -
+    /// Returns a shared pointer to the watchpoint at address
+    /// \a addr -
     /// const version.
     ///
     /// @param[in] addr
@@ -86,10 +88,26 @@
     FindByAddress (lldb::addr_t addr) const;
 
     //------------------------------------------------------------------
-    /// Returns a shared pointer to the watchpoint with id /// \a breakID, const
+    /// Returns a shared pointer to the watchpoint with watchpoint spec
+    /// \a spec -
+    /// const version.
+    ///
+    /// @param[in] spec
+    ///     The watchpoint spec to look for.
+    ///
+    /// @result
+    ///     A shared pointer to the watchpoint.  May contain a NULL
+    ///     pointer if the watchpoint doesn't exist.
+    //------------------------------------------------------------------
+    const lldb::WatchpointSP
+    FindBySpec (std::string spec) const;
+
+    //------------------------------------------------------------------
+    /// Returns a shared pointer to the watchpoint with id
+    /// \a watchID, const
     /// version.
     ///
-    /// @param[in] breakID
+    /// @param[in] watchID
     ///     The watchpoint location ID to seek for.
     ///
     /// @result
@@ -100,7 +118,8 @@
     FindByID (lldb::watch_id_t watchID) const;
 
     //------------------------------------------------------------------
-    /// Returns the watchpoint id to the watchpoint /// at address \a addr.
+    /// Returns the watchpoint id to the watchpoint
+    /// at address \a addr.
     ///
     /// @param[in] addr
     ///     The address to match.
@@ -112,6 +131,19 @@
     FindIDByAddress (lldb::addr_t addr);
 
     //------------------------------------------------------------------
+    /// Returns the watchpoint id to the watchpoint
+    /// with watchpoint spec \a spec.
+    ///
+    /// @param[in] spec
+    ///     The watchpoint spec to match.
+    ///
+    /// @result
+    ///     The ID of the watchpoint, or LLDB_INVALID_WATCH_ID.
+    //------------------------------------------------------------------
+    lldb::watch_id_t
+    FindIDBySpec (std::string spec);
+
+    //------------------------------------------------------------------
     /// Returns a shared pointer to the watchpoint with index \a i.
     ///
     /// @param[in] i
@@ -186,7 +218,7 @@
     GetSize() const
     {
         Mutex::Locker locker(m_mutex);
-        return m_address_to_watchpoint.size();
+        return m_watchpoints.size();
     }
 
     //------------------------------------------------------------------
@@ -221,16 +253,22 @@
     GetListMutex (lldb_private::Mutex::Locker &locker);
 
 protected:
-    typedef std::map<lldb::addr_t, lldb::WatchpointSP> addr_map;
+    typedef std::list<lldb::WatchpointSP> wp_collection;
+    typedef std::vector<lldb::watch_id_t> id_vector;
 
-    addr_map::iterator
+    id_vector
+    GetWatchpointIDs() const;
+
+    wp_collection::iterator
     GetIDIterator(lldb::watch_id_t watchID);
 
-    addr_map::const_iterator
+    wp_collection::const_iterator
     GetIDConstIterator(lldb::watch_id_t watchID) const;
 
-    addr_map m_address_to_watchpoint;
+    wp_collection m_watchpoints;
     mutable Mutex m_mutex;
+
+    lldb::watch_id_t m_next_wp_id;
 };
 
 } // namespace lldb_private

Modified: lldb/trunk/include/lldb/Target/Target.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Target.h?rev=151435&r1=151434&r2=151435&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Target.h (original)
+++ lldb/trunk/include/lldb/Target/Target.h Sat Feb 25 00:44:30 2012
@@ -528,6 +528,9 @@
     EnableAllWatchpoints (bool end_to_end = true);
 
     bool
+    ClearAllWatchpointHitCounts ();
+
+    bool
     IgnoreAllWatchpoints (uint32_t ignore_count);
 
     bool

Modified: lldb/trunk/source/Breakpoint/Watchpoint.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Breakpoint/Watchpoint.cpp?rev=151435&r1=151434&r2=151435&view=diff
==============================================================================
--- lldb/trunk/source/Breakpoint/Watchpoint.cpp (original)
+++ lldb/trunk/source/Breakpoint/Watchpoint.cpp Sat Feb 25 00:44:30 2012
@@ -24,9 +24,9 @@
 using namespace lldb_private;
 
 Watchpoint::Watchpoint (lldb::addr_t addr, size_t size, bool hardware) :
-    StoppointLocation (GetNextID(), addr, size, hardware),
+    StoppointLocation (0, addr, size, hardware),
     m_target(NULL),
-    m_enabled(0),
+    m_enabled(false),
     m_is_hardware(hardware),
     m_watch_read(0),
     m_watch_write(0),
@@ -36,6 +36,7 @@
     m_callback(NULL),
     m_callback_baton(NULL),
     m_decl_str(),
+    m_watch_spec_str(),
     m_error()
 {
 }
@@ -44,13 +45,6 @@
 {
 }
 
-break_id_t
-Watchpoint::GetNextID()
-{
-    static break_id_t g_next_ID = 0;
-    return ++g_next_ID;
-}
-
 bool
 Watchpoint::SetCallback (WatchpointHitCallback callback, void *callback_baton)
 {
@@ -66,6 +60,13 @@
     return;
 }
 
+void
+Watchpoint::SetWatchSpec (std::string &str)
+{
+    m_watch_spec_str = str;
+    return;
+}
+
 // Override default impl of StoppointLocation::IsHardware() since m_is_hardware
 // member field is more accurate.
 bool
@@ -117,13 +118,15 @@
               GetID(),
               GetLoadAddress(),
               m_byte_size,
-              m_enabled ? "enabled" : "disabled",
+              IsEnabled() ? "enabled" : "disabled",
               m_watch_read ? "r" : "",
               m_watch_write ? "w" : "");
 
     if (description_level >= lldb::eDescriptionLevelFull) {
         if (!m_decl_str.empty())
             s->Printf("\n    declare @ '%s'", m_decl_str.c_str());
+        if (!m_watch_spec_str.empty())
+            s->Printf("\n    static watchpoint spec = '%s'", m_watch_spec_str.c_str());
         if (GetConditionText())
             s->Printf("\n    condition = '%s'", GetConditionText());
     }

Modified: lldb/trunk/source/Breakpoint/WatchpointList.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Breakpoint/WatchpointList.cpp?rev=151435&r1=151434&r2=151435&view=diff
==============================================================================
--- lldb/trunk/source/Breakpoint/WatchpointList.cpp (original)
+++ lldb/trunk/source/Breakpoint/WatchpointList.cpp Sat Feb 25 00:44:30 2012
@@ -19,8 +19,9 @@
 using namespace lldb_private;
 
 WatchpointList::WatchpointList() :
-    m_address_to_watchpoint (),
-    m_mutex (Mutex::eMutexTypeRecursive)
+    m_watchpoints (),
+    m_mutex (Mutex::eMutexTypeRecursive),
+    m_next_wp_id (0)
 {
 }
 
@@ -28,21 +29,13 @@
 {
 }
 
-// Add watchpoint loc to the list.  However, if the element already exists in the
-// list, then replace it with the input one.
-
+// Add a watchpoint to the list.
 lldb::watch_id_t
 WatchpointList::Add (const WatchpointSP &wp_sp)
 {
     Mutex::Locker locker (m_mutex);
-    lldb::addr_t wp_addr = wp_sp->GetLoadAddress();
-    addr_map::iterator iter = m_address_to_watchpoint.find(wp_addr);
-
-    if (iter == m_address_to_watchpoint.end())
-        m_address_to_watchpoint.insert(iter, addr_map::value_type(wp_addr, wp_sp));
-    else
-        m_address_to_watchpoint[wp_addr] = wp_sp;
-
+    wp_sp->SetID(++m_next_wp_id);
+    m_watchpoints.push_back(wp_sp);
     return wp_sp->GetID();
 }
 
@@ -59,11 +52,11 @@
     s->Printf("%p: ", this);
     //s->Indent();
     s->Printf("WatchpointList with %zu Watchpoints:\n",
-              m_address_to_watchpoint.size());
+              m_watchpoints.size());
     s->IndentMore();
-    addr_map::const_iterator pos, end = m_address_to_watchpoint.end();
-    for (pos = m_address_to_watchpoint.begin(); pos != end; ++pos)
-        pos->second->DumpWithLevel(s, description_level);
+    wp_collection::const_iterator pos, end = m_watchpoints.end();
+    for (pos = m_watchpoints.begin(); pos != end; ++pos)
+        (*pos)->DumpWithLevel(s, description_level);
     s->IndentLess();
 }
 
@@ -72,11 +65,32 @@
 {
     WatchpointSP wp_sp;
     Mutex::Locker locker (m_mutex);
-    if (!m_address_to_watchpoint.empty())
+    if (!m_watchpoints.empty())
+    {
+        wp_collection::const_iterator pos, end = m_watchpoints.end();
+        for (pos = m_watchpoints.begin(); pos != end; ++pos)
+            if ((*pos)->GetLoadAddress() == addr) {
+                wp_sp = *pos;
+                break;
+            }
+    }
+
+    return wp_sp;
+}
+
+const WatchpointSP
+WatchpointList::FindBySpec (std::string spec) const
+{
+    WatchpointSP wp_sp;
+    Mutex::Locker locker (m_mutex);
+    if (!m_watchpoints.empty())
     {
-        addr_map::const_iterator pos = m_address_to_watchpoint.find (addr);
-        if (pos != m_address_to_watchpoint.end())
-            wp_sp = pos->second;
+        wp_collection::const_iterator pos, end = m_watchpoints.end();
+        for (pos = m_watchpoints.begin(); pos != end; ++pos)
+            if ((*pos)->GetWatchSpec() == spec) {
+                wp_sp = *pos;
+                break;
+            }
     }
 
     return wp_sp;
@@ -90,27 +104,27 @@
     {
     }
 
-    bool operator() (std::pair <lldb::addr_t, WatchpointSP> val_pair) const
+    bool operator() (const WatchpointSP &wp) const
     {
-        return m_watch_id == val_pair.second.get()->GetID();
+        return m_watch_id == wp->GetID();
     }
 
 private:
    const lldb::watch_id_t m_watch_id;
 };
 
-WatchpointList::addr_map::iterator
+WatchpointList::wp_collection::iterator
 WatchpointList::GetIDIterator (lldb::watch_id_t watch_id)
 {
-    return std::find_if(m_address_to_watchpoint.begin(), m_address_to_watchpoint.end(), // Search full range
-                        WatchpointIDMatches(watch_id));                                 // Predicate
+    return std::find_if(m_watchpoints.begin(), m_watchpoints.end(), // Search full range
+                        WatchpointIDMatches(watch_id));             // Predicate
 }
 
-WatchpointList::addr_map::const_iterator
+WatchpointList::wp_collection::const_iterator
 WatchpointList::GetIDConstIterator (lldb::watch_id_t watch_id) const
 {
-    return std::find_if(m_address_to_watchpoint.begin(), m_address_to_watchpoint.end(), // Search full range
-                        WatchpointIDMatches(watch_id));                                 // Predicate
+    return std::find_if(m_watchpoints.begin(), m_watchpoints.end(), // Search full range
+                        WatchpointIDMatches(watch_id));             // Predicate
 }
 
 WatchpointSP
@@ -118,9 +132,9 @@
 {
     WatchpointSP wp_sp;
     Mutex::Locker locker (m_mutex);
-    addr_map::const_iterator pos = GetIDConstIterator(watch_id);
-    if (pos != m_address_to_watchpoint.end())
-        wp_sp = pos->second;
+    wp_collection::const_iterator pos = GetIDConstIterator(watch_id);
+    if (pos != m_watchpoints.end())
+        wp_sp = *pos;
 
     return wp_sp;
 }
@@ -136,16 +150,27 @@
     return LLDB_INVALID_WATCH_ID;
 }
 
+lldb::watch_id_t
+WatchpointList::FindIDBySpec (std::string spec)
+{
+    WatchpointSP wp_sp = FindBySpec (spec);
+    if (wp_sp)
+    {
+        return wp_sp->GetID();
+    }
+    return LLDB_INVALID_WATCH_ID;
+}
+
 WatchpointSP
 WatchpointList::GetByIndex (uint32_t i)
 {
     Mutex::Locker locker (m_mutex);
     WatchpointSP wp_sp;
-    if (i < m_address_to_watchpoint.size())
+    if (i < m_watchpoints.size())
     {
-        addr_map::const_iterator pos = m_address_to_watchpoint.begin();
+        wp_collection::const_iterator pos = m_watchpoints.begin();
         std::advance(pos, i);
-        wp_sp = pos->second;
+        wp_sp = *pos;
     }
     return wp_sp;
 }
@@ -155,23 +180,33 @@
 {
     Mutex::Locker locker (m_mutex);
     WatchpointSP wp_sp;
-    if (i < m_address_to_watchpoint.size())
+    if (i < m_watchpoints.size())
     {
-        addr_map::const_iterator pos = m_address_to_watchpoint.begin();
+        wp_collection::const_iterator pos = m_watchpoints.begin();
         std::advance(pos, i);
-        wp_sp = pos->second;
+        wp_sp = *pos;
     }
     return wp_sp;
 }
 
+std::vector<lldb::watch_id_t>
+WatchpointList::GetWatchpointIDs() const
+{
+    std::vector<lldb::watch_id_t> IDs;
+    wp_collection::const_iterator pos, end = m_watchpoints.end();
+    for (pos = m_watchpoints.begin(); pos != end; ++pos)
+        IDs.push_back((*pos)->GetID());
+    return IDs;
+}
+
 bool
 WatchpointList::Remove (lldb::watch_id_t watch_id)
 {
     Mutex::Locker locker (m_mutex);
-    addr_map::iterator pos = GetIDIterator(watch_id);
-    if (pos != m_address_to_watchpoint.end())
+    wp_collection::iterator pos = GetIDIterator(watch_id);
+    if (pos != m_watchpoints.end())
     {
-        m_address_to_watchpoint.erase(pos);
+        m_watchpoints.erase(pos);
         return true;
     }
     return false;
@@ -182,9 +217,9 @@
 {
     uint32_t hit_count = 0;
     Mutex::Locker locker (m_mutex);
-    addr_map::const_iterator pos, end = m_address_to_watchpoint.end();
-    for (pos = m_address_to_watchpoint.begin(); pos != end; ++pos)
-        hit_count += pos->second->GetHitCount();
+    wp_collection::const_iterator pos, end = m_watchpoints.end();
+    for (pos = m_watchpoints.begin(); pos != end; ++pos)
+        hit_count += (*pos)->GetHitCount();
     return hit_count;
 }
 
@@ -209,12 +244,12 @@
 WatchpointList::GetDescription (Stream *s, lldb::DescriptionLevel level)
 {
     Mutex::Locker locker (m_mutex);
-    addr_map::iterator pos, end = m_address_to_watchpoint.end();
+    wp_collection::iterator pos, end = m_watchpoints.end();
 
-    for (pos = m_address_to_watchpoint.begin(); pos != end; ++pos)
+    for (pos = m_watchpoints.begin(); pos != end; ++pos)
     {
         s->Printf(" ");
-        pos->second->Dump(s);
+        (*pos)->Dump(s);
     }
 }
 
@@ -223,16 +258,16 @@
 {
     Mutex::Locker locker(m_mutex);
 
-    addr_map::iterator pos, end = m_address_to_watchpoint.end();
-    for (pos = m_address_to_watchpoint.begin(); pos != end; ++pos)
-        pos->second->SetEnabled (enabled);
+    wp_collection::iterator pos, end = m_watchpoints.end();
+    for (pos = m_watchpoints.begin(); pos != end; ++pos)
+        (*pos)->SetEnabled (enabled);
 }
 
 void
 WatchpointList::RemoveAll ()
 {
     Mutex::Locker locker(m_mutex);
-    m_address_to_watchpoint.clear();
+    m_watchpoints.clear();
 }
 
 void

Modified: lldb/trunk/source/Target/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Target.cpp?rev=151435&r1=151434&r2=151435&view=diff
==============================================================================
--- lldb/trunk/source/Target/Target.cpp (original)
+++ lldb/trunk/source/Target/Target.cpp Sat Feb 25 00:44:30 2012
@@ -138,7 +138,10 @@
         m_breakpoint_list.ClearAllBreakpointSites();
         m_internal_breakpoint_list.ClearAllBreakpointSites();
         // Disable watchpoints just on the debugger side.
+        Mutex::Locker locker;
+        this->GetWatchpointList().GetListMutex(locker);
         DisableAllWatchpoints(false);
+        ClearAllWatchpointHitCounts();
         m_process_sp.reset();
     }
 }
@@ -672,6 +675,26 @@
     return true; // Success!
 }
 
+// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
+bool
+Target::ClearAllWatchpointHitCounts ()
+{
+    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
+    if (log)
+        log->Printf ("Target::%s\n", __FUNCTION__);
+
+    size_t num_watchpoints = m_watchpoint_list.GetSize();
+    for (size_t i = 0; i < num_watchpoints; ++i)
+    {
+        WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
+        if (!wp_sp)
+            return false;
+
+        wp_sp->ResetHitCount();
+    }
+    return true; // Success!
+}
+
 // Assumption: Caller holds the list mutex lock for m_watchpoint_list
 // during these operations.
 bool





More information about the lldb-commits mailing list