Home | History | Annotate | Download | only in Breakpoint
      1 //===-- WatchpointList.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_WatchpointList_h_
     11 #define liblldb_WatchpointList_h_
     12 
     13 // C Includes
     14 // C++ Includes
     15 #include <list>
     16 #include <vector>
     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 WatchpointList WatchpointList.h "lldb/Breakpoint/WatchpointList.h"
     27 /// @brief This class is used by Watchpoint to manage a list of watchpoints,
     28 //  each watchpoint in the list has a unique ID, and is unique by Address as
     29 //  well.
     30 //----------------------------------------------------------------------
     31 
     32 class WatchpointList
     33 {
     34 // Only Target can make the watchpoint list, or add elements to it.
     35 // This is not just some random collection of watchpoints.  Rather, the act of
     36 // adding the watchpoint to this list sets its ID.
     37 friend class Watchpoint;
     38 friend class Target;
     39 
     40 public:
     41     //------------------------------------------------------------------
     42     /// Default constructor makes an empty list.
     43     //------------------------------------------------------------------
     44     WatchpointList();
     45 
     46     //------------------------------------------------------------------
     47     /// Destructor, currently does nothing.
     48     //------------------------------------------------------------------
     49     ~WatchpointList();
     50 
     51     //------------------------------------------------------------------
     52     /// Add a Watchpoint to the list.
     53     ///
     54     /// @param[in] wp_sp
     55     ///    A shared pointer to a watchpoint being added to the list.
     56     ///
     57     /// @return
     58     ///    The ID of the Watchpoint in the list.
     59     //------------------------------------------------------------------
     60     lldb::watch_id_t
     61     Add (const lldb::WatchpointSP& wp_sp, bool notify);
     62 
     63     //------------------------------------------------------------------
     64     /// Standard "Dump" method.
     65     //------------------------------------------------------------------
     66     void
     67     Dump (Stream *s) const;
     68 
     69     //------------------------------------------------------------------
     70     /// Dump with lldb::DescriptionLevel.
     71     //------------------------------------------------------------------
     72     void
     73     DumpWithLevel (Stream *s, lldb::DescriptionLevel description_level) const;
     74 
     75     //------------------------------------------------------------------
     76     /// Returns a shared pointer to the watchpoint at address
     77     /// \a addr -
     78     /// const version.
     79     ///
     80     /// @param[in] addr
     81     ///     The address to look for.
     82     ///
     83     /// @result
     84     ///     A shared pointer to the watchpoint.  May contain a NULL
     85     ///     pointer if the watchpoint doesn't exist.
     86     //------------------------------------------------------------------
     87     const lldb::WatchpointSP
     88     FindByAddress (lldb::addr_t addr) const;
     89 
     90     //------------------------------------------------------------------
     91     /// Returns a shared pointer to the watchpoint with watchpoint spec
     92     /// \a spec -
     93     /// const version.
     94     ///
     95     /// @param[in] spec
     96     ///     The watchpoint spec to look for.
     97     ///
     98     /// @result
     99     ///     A shared pointer to the watchpoint.  May contain a NULL
    100     ///     pointer if the watchpoint doesn't exist.
    101     //------------------------------------------------------------------
    102     const lldb::WatchpointSP
    103     FindBySpec (std::string spec) const;
    104 
    105     //------------------------------------------------------------------
    106     /// Returns a shared pointer to the watchpoint with id
    107     /// \a watchID, const
    108     /// version.
    109     ///
    110     /// @param[in] watchID
    111     ///     The watchpoint location ID to seek for.
    112     ///
    113     /// @result
    114     ///     A shared pointer to the watchpoint.  May contain a NULL
    115     ///     pointer if the watchpoint doesn't exist.
    116     //------------------------------------------------------------------
    117     lldb::WatchpointSP
    118     FindByID (lldb::watch_id_t watchID) const;
    119 
    120     //------------------------------------------------------------------
    121     /// Returns the watchpoint id to the watchpoint
    122     /// at address \a addr.
    123     ///
    124     /// @param[in] addr
    125     ///     The address to match.
    126     ///
    127     /// @result
    128     ///     The ID of the watchpoint, or LLDB_INVALID_WATCH_ID.
    129     //------------------------------------------------------------------
    130     lldb::watch_id_t
    131     FindIDByAddress (lldb::addr_t addr);
    132 
    133     //------------------------------------------------------------------
    134     /// Returns the watchpoint id to the watchpoint
    135     /// with watchpoint spec \a spec.
    136     ///
    137     /// @param[in] spec
    138     ///     The watchpoint spec to match.
    139     ///
    140     /// @result
    141     ///     The ID of the watchpoint, or LLDB_INVALID_WATCH_ID.
    142     //------------------------------------------------------------------
    143     lldb::watch_id_t
    144     FindIDBySpec (std::string spec);
    145 
    146     //------------------------------------------------------------------
    147     /// Returns a shared pointer to the watchpoint with index \a i.
    148     ///
    149     /// @param[in] i
    150     ///     The watchpoint index to seek for.
    151     ///
    152     /// @result
    153     ///     A shared pointer to the watchpoint.  May contain a NULL pointer if
    154     ///     the watchpoint doesn't exist.
    155     //------------------------------------------------------------------
    156     lldb::WatchpointSP
    157     GetByIndex (uint32_t i);
    158 
    159     //------------------------------------------------------------------
    160     /// Returns a shared pointer to the watchpoint with index \a i, const
    161     /// version.
    162     ///
    163     /// @param[in] i
    164     ///     The watchpoint index to seek for.
    165     ///
    166     /// @result
    167     ///     A shared pointer to the watchpoint.  May contain a NULL pointer if
    168     ///     the watchpoint location doesn't exist.
    169     //------------------------------------------------------------------
    170     const lldb::WatchpointSP
    171     GetByIndex (uint32_t i) const;
    172 
    173     //------------------------------------------------------------------
    174     /// Removes the watchpoint given by \b watchID from this list.
    175     ///
    176     /// @param[in] watchID
    177     ///   The watchpoint ID to remove.
    178     ///
    179     /// @result
    180     ///   \b true if the watchpoint \a watchID was in the list.
    181     //------------------------------------------------------------------
    182     bool
    183     Remove (lldb::watch_id_t watchID, bool notify);
    184 
    185     //------------------------------------------------------------------
    186     /// Returns the number hit count of all watchpoints in this list.
    187     ///
    188     /// @result
    189     ///     Hit count of all watchpoints in this list.
    190     //------------------------------------------------------------------
    191     uint32_t
    192     GetHitCount () const;
    193 
    194     //------------------------------------------------------------------
    195     /// Enquires of the watchpoint in this list with ID \a watchID whether we
    196     /// should stop.
    197     ///
    198     /// @param[in] context
    199     ///     This contains the information about this stop.
    200     ///
    201     /// @param[in] watchID
    202     ///     This watch ID that we hit.
    203     ///
    204     /// @return
    205     ///     \b true if we should stop, \b false otherwise.
    206     //------------------------------------------------------------------
    207     bool
    208     ShouldStop (StoppointCallbackContext *context,
    209                 lldb::watch_id_t watchID);
    210 
    211     //------------------------------------------------------------------
    212     /// Returns the number of elements in this watchpoint list.
    213     ///
    214     /// @result
    215     ///     The number of elements.
    216     //------------------------------------------------------------------
    217     size_t
    218     GetSize() const
    219     {
    220         Mutex::Locker locker(m_mutex);
    221         return m_watchpoints.size();
    222     }
    223 
    224     //------------------------------------------------------------------
    225     /// Print a description of the watchpoints in this list to the stream \a s.
    226     ///
    227     /// @param[in] s
    228     ///     The stream to which to print the description.
    229     ///
    230     /// @param[in] level
    231     ///     The description level that indicates the detail level to
    232     ///     provide.
    233     ///
    234     /// @see lldb::DescriptionLevel
    235     //------------------------------------------------------------------
    236     void
    237     GetDescription (Stream *s,
    238                     lldb::DescriptionLevel level);
    239 
    240     void
    241     SetEnabledAll (bool enabled);
    242 
    243     void
    244     RemoveAll (bool notify);
    245 
    246     //------------------------------------------------------------------
    247     /// Sets the passed in Locker to hold the Watchpoint List mutex.
    248     ///
    249     /// @param[in] locker
    250     ///   The locker object that is set.
    251     //------------------------------------------------------------------
    252     void
    253     GetListMutex (lldb_private::Mutex::Locker &locker);
    254 
    255 protected:
    256     typedef std::list<lldb::WatchpointSP> wp_collection;
    257     typedef std::vector<lldb::watch_id_t> id_vector;
    258 
    259     id_vector
    260     GetWatchpointIDs() const;
    261 
    262     wp_collection::iterator
    263     GetIDIterator(lldb::watch_id_t watchID);
    264 
    265     wp_collection::const_iterator
    266     GetIDConstIterator(lldb::watch_id_t watchID) const;
    267 
    268     wp_collection m_watchpoints;
    269     mutable Mutex m_mutex;
    270 
    271     lldb::watch_id_t m_next_wp_id;
    272 };
    273 
    274 } // namespace lldb_private
    275 
    276 #endif  // liblldb_WatchpointList_h_
    277