124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Breakpoint.h --------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_Breakpoint_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_Breakpoint_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/BreakpointLocationList.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/BreakpointOptions.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/BreakpointLocationCollection.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/Stoppoint.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/SearchFilter.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Event.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StringList.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class Breakpoint Breakpoint.h "lldb/Breakpoint/Breakpoint.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief Class that manages logical breakpoint setting.
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// General Outline:
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// A breakpoint has four main parts, a filter, a resolver, the list of breakpoint
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// locations that have been determined for the filter/resolver pair, and finally
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// a set of options for the breakpoint.
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// \b Filter:
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// This is an object derived from SearchFilter.  It manages the search
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// for breakpoint location matches through the symbols in the module list of the target
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// that owns it.  It also filters out locations based on whatever logic it wants.
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// \b Resolver:
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// This is an object derived from BreakpointResolver.  It provides a
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// callback to the filter that will find breakpoint locations.  How it does this is
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// determined by what kind of resolver it is.
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// The Breakpoint class also provides constructors for the common breakpoint cases
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// which make the appropriate filter and resolver for you.
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// \b Location List:
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// This stores the breakpoint locations that have been determined
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// to date.  For a given breakpoint, there will be only one location with a given
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// address.  Adding a location at an already taken address will just return the location
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// already at that address.  Locations can be looked up by ID, or by address.
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// \b Options:
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// This includes:
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///    \b Enabled/Disabled
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///    \b Ignore Count
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///    \b Callback
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///    \b Condition
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Note, these options can be set on the breakpoint, and they can also be set on the
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// individual locations.  The options set on the breakpoint take precedence over the
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// options set on the individual location.
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// So for instance disabling the breakpoint will cause NONE of the locations to get hit.
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// But if the breakpoint is enabled, then the location's enabled state will be checked
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// to determine whether to insert that breakpoint location.
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Similarly, if the breakpoint condition says "stop", we won't check the location's condition.
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// But if the breakpoint condition says "continue", then we will check the location for whether
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// to actually stop or not.
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// One subtle point worth observing here is that you don't actually stop at a Breakpoint, you
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// always stop at one of its locations.  So the "should stop" tests are done by the location,
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// not by the breakpoint.
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Breakpoint:
77102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    public std::enable_shared_from_this<Breakpoint>,
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public Stoppoint
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const ConstString &
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetEventIdentifier ();
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// An enum specifying the match style for breakpoint settings.  At
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// present only used for function name style breakpoints.
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef enum
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Exact,
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Regexp,
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Glob
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    } MatchType;
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    class BreakpointEventData :
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        public EventData
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public:
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        static const ConstString &
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetFlavorString ();
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        virtual const ConstString &
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetFlavor () const;
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
108c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        BreakpointEventData (lldb::BreakpointEventType sub_type,
10928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham                             const lldb::BreakpointSP &new_breakpoint_sp);
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        virtual
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ~BreakpointEventData();
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
114c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        lldb::BreakpointEventType
115c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        GetBreakpointEventType () const;
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::BreakpointSP &
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetBreakpoint ();
11928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
12028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        BreakpointLocationCollection &
12128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        GetBreakpointLocationCollection()
12228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        {
12328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham            return m_locations;
12428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        }
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        virtual void
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Dump (Stream *s) const;
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        static lldb::BreakpointEventType
131c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        GetBreakpointEventTypeFromEvent (const lldb::EventSP &event_sp);
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        static lldb::BreakpointSP
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetBreakpointFromEvent (const lldb::EventSP &event_sp);
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
136c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        static lldb::BreakpointLocationSP
137c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        GetBreakpointLocationAtIndexFromEvent (const lldb::EventSP &event_sp, uint32_t loc_idx);
13828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
13936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        static size_t
14028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        GetNumBreakpointLocationsFromEvent (const lldb::EventSP &event_sp);
14128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
14228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        static const BreakpointEventData *
14328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham        GetEventDataFromEvent (const Event *event_sp);
144c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    private:
146c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton
147c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton        lldb::BreakpointEventType m_breakpoint_event;
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::BreakpointSP m_new_breakpoint_sp;
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        BreakpointLocationCollection m_locations;
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DISALLOW_COPY_AND_ASSIGN (BreakpointEventData);
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Destructor.
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The destructor is not virtual since there should be no reason to subclass
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// breakpoints.  The varieties of breakpoints are specified instead by
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// providing different resolvers & filters.
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~Breakpoint();
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Methods
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Tell whether this breakpoint is an "internal" breakpoint.
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Returns \b true if this is an internal breakpoint, \b false otherwise.
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsInternal () const;
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Standard "Dump" method.  At present it does nothing.
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Dump (Stream *s);
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The next set of methods provide ways to tell the breakpoint to update
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // it's location list - usually done when modules appear or disappear.
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Tell this breakpoint to clear all its breakpoint sites.  Done
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// when the process holding the breakpoint sites is destroyed.
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ClearAllBreakpointSites ();
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Tell this breakpoint to scan it's target's module list and resolve any
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// new locations that match the breakpoint's specifications.
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ResolveBreakpoint ();
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Tell this breakpoint to scan a given module list and resolve any
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// new locations that match the breakpoint's specifications.
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
20603e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    /// @param[in] changed_modules
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The list of modules to look in for new locations.
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
21003e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    ResolveBreakpointInModules (ModuleList &changed_modules);
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Like ResolveBreakpointInModules, but allows for "unload" events, in
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// which case we will remove any locations that are in modules that got
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// unloaded.
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] changedModules
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The list of modules to look in for new locations.
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] load_event
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    If \b true then the modules were loaded, if \b false, unloaded.
22203e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    /// @param[in] delete_locations
22303e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    ///    If \b true then the modules were unloaded delete any locations in the changed modules.
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
22603e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    ModulesChanged (ModuleList &changed_modules,
22703e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham                    bool load_event,
22803e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham                    bool delete_locations = false);
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
23203e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    /// Tells the breakpoint the old module \a old_module_sp has been
23303e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    /// replaced by new_module_sp (usually because the underlying file has been
23403e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    /// rebuilt, and the old version is gone.)
23503e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    ///
23603e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    /// @param[in] old_module_sp
23703e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    ///    The old module that is going away.
23803e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    /// @param[in] new_module_sp
23903e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    ///    The new module that is replacing it.
24003e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    //------------------------------------------------------------------
24103e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    void
24203e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    ModuleReplaced (lldb::ModuleSP old_module_sp, lldb::ModuleSP new_module_sp);
24303e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham
24403e5e512252fc7971430027d8ea05f64576bcbb3Jim Ingham    //------------------------------------------------------------------
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The next set of methods provide access to the breakpoint locations
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // for this breakpoint.
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Add a location to the breakpoint's location list.  This is only meant
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// to be called by the breakpoint's resolver.  FIXME: how do I ensure that?
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] addr
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The Address specifying the new location.
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[out] new_location
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Set to \b true if a new location was created, to \b false if there
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    already was a location at this Address.
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Returns a pointer to the new location.
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::BreakpointLocationSP
26219a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg Clayton    AddLocation (const Address &addr,
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 bool *new_location = NULL);
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Find a breakpoint location by Address.
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] addr
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The Address specifying the location.
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Returns a shared pointer to the location at \a addr.  The pointer
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    in the shared pointer will be NULL if there is no location at that address.
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::BreakpointLocationSP
27519a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg Clayton    FindLocationByAddress (const Address &addr);
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Find a breakpoint location ID by Address.
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] addr
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The Address specifying the location.
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Returns the UID of the location at \a addr, or \b LLDB_INVALID_ID if
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    there is no breakpoint location at that address.
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::break_id_t
28719a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg Clayton    FindLocationIDByAddress (const Address &addr);
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Find a breakpoint location for a given breakpoint location ID.
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] bp_loc_id
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The ID specifying the location.
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Returns a shared pointer to the location with ID \a bp_loc_id.  The pointer
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    in the shared pointer will be NULL if there is no location with that ID.
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::BreakpointLocationSP
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FindLocationByID (lldb::break_id_t bp_loc_id);
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get breakpoint locations by index.
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] index
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The location index.
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Returns a shared pointer to the location with index \a
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     index. The shared pointer might contain NULL if \a index is
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     greater than then number of actual locations.
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::BreakpointLocationSP
31336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    GetLocationAtIndex (size_t index);
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The next section deals with various breakpoint options.
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// If \a enable is \b true, enable the breakpoint, if \b false disable it.
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetEnabled (bool enable);
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Check the Enable/Disable state.
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b true if the breakpoint is enabled, \b false if disabled.
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsEnabled ();
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Set the breakpoint to ignore the next \a count breakpoint hits.
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] count
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The number of breakpoint hits to ignore.
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
33954e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    SetIgnoreCount (uint32_t count);
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
342c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    /// Return the current ignore count/
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The number of breakpoint hits to be ignored.
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
34654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    uint32_t
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetIgnoreCount () const;
348fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
350c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    /// Return the current hit count for all locations.
351c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    /// @return
352c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    ///     The current hit count for all locations.
353c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    //------------------------------------------------------------------
354c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    uint32_t
355c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    GetHitCount () const;
356c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton
357c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton
358c7f5d5c3a3b48869f5ad2a3cdc4b20ca40929ba3Greg Clayton    //------------------------------------------------------------------
3592753a024a5a314232baa579c0ada87551aa86988Jim Ingham    /// If \a one_shot is \b true, breakpoint will be deleted on first hit.
3602753a024a5a314232baa579c0ada87551aa86988Jim Ingham    //------------------------------------------------------------------
3612753a024a5a314232baa579c0ada87551aa86988Jim Ingham    void
3622753a024a5a314232baa579c0ada87551aa86988Jim Ingham    SetOneShot (bool one_shot);
3632753a024a5a314232baa579c0ada87551aa86988Jim Ingham
3642753a024a5a314232baa579c0ada87551aa86988Jim Ingham    //------------------------------------------------------------------
3652753a024a5a314232baa579c0ada87551aa86988Jim Ingham    /// Check the OneShot state.
3662753a024a5a314232baa579c0ada87551aa86988Jim Ingham    /// @return
3672753a024a5a314232baa579c0ada87551aa86988Jim Ingham    ///     \b true if the breakpoint is one shot, \b false otherwise.
3682753a024a5a314232baa579c0ada87551aa86988Jim Ingham    //------------------------------------------------------------------
3692753a024a5a314232baa579c0ada87551aa86988Jim Ingham    bool
3702753a024a5a314232baa579c0ada87551aa86988Jim Ingham    IsOneShot () const;
3712753a024a5a314232baa579c0ada87551aa86988Jim Ingham
3722753a024a5a314232baa579c0ada87551aa86988Jim Ingham    //------------------------------------------------------------------
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Set the valid thread to be checked when the breakpoint is hit.
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] thread_id
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    If this thread hits the breakpoint, we stop, otherwise not.
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetThreadID (lldb::tid_t thread_id);
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Return the current stop thread value.
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The thread id for which the breakpoint hit will stop, LLDB_INVALID_THREAD_ID for all threads.
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::tid_t
38628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    GetThreadID () const;
38728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
38828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    void
38928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SetThreadIndex (uint32_t index);
39028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
39128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    uint32_t
39228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    GetThreadIndex() const;
39328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
39428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    void
39528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SetThreadName (const char *thread_name);
39628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
39728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    const char *
39828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    GetThreadName () const;
39928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
40028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    void
40128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SetQueueName (const char *queue_name);
40228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
40328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    const char *
40428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    GetQueueName () const;
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
40721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    /// Set the callback action invoked when the breakpoint is hit.
40821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    ///
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] callback
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The method that will get called when the breakpoint is hit.
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] baton
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    A void * pointer that will get passed back to the callback function.
41321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    /// @param[in] is_synchronous
41421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    ///    If \b true the callback will be run on the private event thread
41521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    ///    before the stop event gets reported.  If false, the callback will get
41621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    ///    handled on the public event thead after the stop has been posted.
41721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    ///
41821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    /// @return
41921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    ///    \b true if the process should stop when you hit the breakpoint.
42021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    ///    \b false if it should continue.
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetCallback (BreakpointHitCallback callback,
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 void *baton,
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 bool is_synchronous = false);
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetCallback (BreakpointHitCallback callback,
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 const lldb::BatonSP &callback_baton_sp,
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 bool is_synchronous = false);
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ClearCallback ();
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
436d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    /// Set the breakpoint's condition.
437d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    ///
438d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    /// @param[in] condition
439d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    ///    The condition expression to evaluate when the breakpoint is hit.
440d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    ///    Pass in NULL to clear the condition.
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
442d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    void SetCondition (const char *condition);
443d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham
444d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    //------------------------------------------------------------------
445d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    /// Return a pointer to the text of the condition expression.
446d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    ///
447d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    /// @return
448d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    ///    A pointer to the condition expression text, or NULL if no
449d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    //     condition has been set.
450d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    //------------------------------------------------------------------
451ac35442b2b1a35ea3100c870214977e3bddb76f6Jim Ingham    const char *GetConditionText () const;
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The next section are various utility functions.
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Return the number of breakpoint locations that have resolved to
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// actual breakpoint sites.
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The number locations resolved breakpoint sites.
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetNumResolvedLocations() const;
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Return the number of breakpoint locations.
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The number breakpoint locations.
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetNumLocations() const;
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Put a description of this breakpoint into the stream \a s.
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Stream into which to dump the description.
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] level
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The description level that indicates the detail level to
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     provide.
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see lldb::DescriptionLevel
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_locations = false);
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
492090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    /// Set the "kind" description for a breakpoint.  If the breakpoint is hit
493090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    /// the stop info will show this "kind" description instead of the breakpoint
494090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    /// number.  Mostly useful for internal breakpoints, where the breakpoint number
495090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    /// doesn't have meaning to the user.
496090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    ///
497090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    /// @param[in] kind
498090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    ///     New "kind" description.
499090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    //------------------------------------------------------------------
500090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    void
501090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    SetBreakpointKind (const char *kind)
502090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    {
503090f83176695d86197b0e86b67dee4160ec5003dJim Ingham        m_kind_description.assign (kind);
504090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    }
505090f83176695d86197b0e86b67dee4160ec5003dJim Ingham
506090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    //------------------------------------------------------------------
507090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    /// Return the "kind" description for a breakpoint.
508090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    ///
509090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    /// @return
510090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    ///     The breakpoint kind, or NULL if none is set.
511090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    //------------------------------------------------------------------
512090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    const char *GetBreakpointKind () const
513090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    {
514090f83176695d86197b0e86b67dee4160ec5003dJim Ingham        return m_kind_description.c_str();
515090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    }
516090f83176695d86197b0e86b67dee4160ec5003dJim Ingham
517090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    //------------------------------------------------------------------
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Accessor for the breakpoint Target.
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     This breakpoint's Target.
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Target &
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetTarget ();
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Target &
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetTarget () const;
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetResolverDescription (Stream *s);
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
531a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen    //------------------------------------------------------------------
532a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen    /// Find breakpoint locations which match the (filename, line_number) description.
533a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen    /// The breakpoint location collection is to be filled with the matching locations.
534a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen    /// It should be initialized with 0 size by the API client.
535a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen    ///
536a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen    /// @return
537a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen    ///     True if there is a match
538a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen    ///
539a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen    ///     The locations which match the filename and line_number in loc_coll.  If its
540a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen    ///     size is 0 and true is returned, it means the breakpoint fully matches the
541a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen    ///     description.
542a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen    //------------------------------------------------------------------
543a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen    bool GetMatchingFileLine(const ConstString &filename, uint32_t line_number,
544a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen                             BreakpointLocationCollection &loc_coll);
545a62ad7c886252a08d614a2b391d0774a151b7196Johnny Chen
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFilterDescription (Stream *s);
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Returns the BreakpointOptions structure set at the breakpoint level.
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Meant to be used by the BreakpointLocation class.
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to this breakpoint's BreakpointOptions.
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointOptions *
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetOptions ();
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Invoke the callback action when the breakpoint is hit.
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Meant to be used by the BreakpointLocation class.
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] context
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Described the breakpoint event.
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] bp_loc_id
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Which breakpoint location hit this breakpoint.
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b true if the target should stop at this breakpoint and \b false not.
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    InvokeCallback (StoppointCallbackContext *context,
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    lldb::break_id_t bp_loc_id);
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
579643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonprotected:
580643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    friend class Target;
581643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    //------------------------------------------------------------------
582643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    // Protected Methods
583643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    //------------------------------------------------------------------
584643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
585643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
586643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    //------------------------------------------------------------------
587643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    /// Constructors and Destructors
588643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    /// Only the Target can make a breakpoint, and it owns the breakpoint lifespans.
589643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    /// The constructor takes a filter and a resolver.  Up in Target there are convenience
590643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    /// variants that make breakpoints for some common cases.
591643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    //------------------------------------------------------------------
592643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    // This is the generic constructor
593643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    Breakpoint(Target &target, lldb::SearchFilterSP &filter_sp, lldb::BreakpointResolverSP &resolver_sp);
594fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham
595fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    friend class BreakpointLocation;  // To call the following two when determining whether to stop.
596fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham
597fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    void
598fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    DecrementIgnoreCount();
599fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham
600fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    // BreakpointLocation::IgnoreCountShouldStop & Breakpoint::IgnoreCountShouldStop can only be called once per stop,
601fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    // and BreakpointLocation::IgnoreCountShouldStop should be tested first, and if it returns false we should
602fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    // continue, otherwise we should test Breakpoint::IgnoreCountShouldStop.
603fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham
604fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    bool
605fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    IgnoreCountShouldStop ();
606643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // For Breakpoint only
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
61128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    bool m_being_created;
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Target &m_target;                         // The target that holds this breakpoint.
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::SearchFilterSP m_filter_sp;         // The filter that constrains the breakpoint's domain.
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::BreakpointResolverSP m_resolver_sp; // The resolver that defines this breakpoint.
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointOptions m_options;              // Settable breakpoint options
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointLocationList m_locations;       // The list of locations currently found for this breakpoint.
617090f83176695d86197b0e86b67dee4160ec5003dJim Ingham    std::string            m_kind_description;
61828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
61928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    void
62028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SendBreakpointChangedEvent (lldb::BreakpointEventType eventKind);
62128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
62228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    void
62328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SendBreakpointChangedEvent (BreakpointEventData *data);
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN(Breakpoint);
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Breakpoint_h_
631