124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- BreakpointLocation.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_BreakpointLocation_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_BreakpointLocation_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <list>
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/StoppointLocation.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StringList.h"
25d93d9131514d1c6f849a06180ec2f01d7792a661Sean Callanan#include "lldb/Core/UserID.h"
26d93d9131514d1c6f849a06180ec2f01d7792a661Sean Callanan#include "lldb/Host/Mutex.h"
27d93d9131514d1c6f849a06180ec2f01d7792a661Sean Callanan#include "lldb/Target/Process.h"
2828195f9e55173cd06c3c5f9e69cefeb1d03cc129Sean Callanan#include "lldb/Expression/ClangUserExpression.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class BreakpointLocation BreakpointLocation.h "lldb/Breakpoint/BreakpointLocation.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief Class that manages one unique (by address) instance of a logical breakpoint.
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// General Outline:
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// A breakpoint location is defined by the breakpoint that produces it,
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// and the address that resulted in this particular instantiation.
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Each breakpoint location also may have a breakpoint site if its
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// address has been loaded into the program.
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Finally it has a settable options object.
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// FIXME: Should we also store some fingerprint for the location, so
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// we can map one location to the "equivalent location" on rerun?  This
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// would be useful if you've set options on the locations.
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Claytonclass BreakpointLocation :
51102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    public std::enable_shared_from_this<BreakpointLocation>,
52987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    public StoppointLocation
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~BreakpointLocation ();
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the load address for this breakpoint location
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Returns breakpoint location load address, \b
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     LLDB_INVALID_ADDRESS if not yet set.
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::addr_t
65273a8e58a03ebf44fba04bd006b832882c80a9a0Greg Clayton    GetLoadAddress () const;
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the Address for this breakpoint location
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Returns breakpoint location Address.
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Address &
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetAddress ();
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the Breakpoint that created this breakpoint location
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Returns the owning breakpoint.
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Breakpoint &
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetBreakpoint ();
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Determines whether we should stop due to a hit at this
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// breakpoint location.
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Side Effects: This may evaluate the breakpoint condition, and
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// run the callback.  So this command may do a considerable amount
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// of work.
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b true if this breakpoint location thinks we should stop,
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b false otherwise.
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ShouldStop (StoppointCallbackContext *context);
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The next section deals with various breakpoint options.
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// If \a enable is \b true, enable the breakpoint, if \b false
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// disable it.
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetEnabled(bool enabled);
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Check the Enable/Disable state.
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b true if the breakpoint is enabled, \b false if disabled.
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
115ca4fe802f0f8439a070e2adfb38ae2487fbde135Johnny Chen    IsEnabled () const;
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Return the current Ignore Count.
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The number of breakpoint hits to be ignored.
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    uint32_t
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetIgnoreCount ();
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Set the breakpoint to ignore the next \a count breakpoint hits.
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] count
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The number of breakpoint hits to ignore.
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
13354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    SetIgnoreCount (uint32_t n);
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Set the callback action invoked when the breakpoint is hit.
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The callback will return a bool indicating whether the target
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// should stop at this breakpoint or not.
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] callback
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The method that will get called when the breakpoint is hit.
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] callback_baton_sp
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A shared pointer to a Baton that provides the void * needed
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     for the callback.
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see lldb_private::Baton
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetCallback (BreakpointHitCallback callback,
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 const lldb::BatonSP &callback_baton_sp,
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 bool is_synchronous);
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetCallback (BreakpointHitCallback callback,
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 void *baton,
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 bool is_synchronous);
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ClearCallback ();
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
164d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    /// Set the breakpoint location's condition.
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
166d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    /// @param[in] condition
167d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    ///    The condition expression to evaluate when the breakpoint is hit.
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
169640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    void
170640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    SetCondition (const char *condition);
171b5d55cf7a00d0f9e31a1664d372f8e570d562777Jim Ingham
172d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    //------------------------------------------------------------------
173d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    /// Return a pointer to the text of the condition expression.
174d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    ///
175d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    /// @return
176d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    ///    A pointer to the condition expression text, or NULL if no
177d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    //     condition has been set.
178d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    //------------------------------------------------------------------
179640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    const char *
18028195f9e55173cd06c3c5f9e69cefeb1d03cc129Sean Callanan    GetConditionText (size_t *hash = NULL) const;
18128195f9e55173cd06c3c5f9e69cefeb1d03cc129Sean Callanan
18228195f9e55173cd06c3c5f9e69cefeb1d03cc129Sean Callanan    bool
18328195f9e55173cd06c3c5f9e69cefeb1d03cc129Sean Callanan    ConditionSaysStop (ExecutionContext &exe_ctx, Error &error);
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Set the valid thread to be checked when the breakpoint is hit.
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] thread_id
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    If this thread hits the breakpoint, we stop, otherwise not.
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetThreadID (lldb::tid_t thread_id);
19428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
19528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    lldb::tid_t
19628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    GetThreadID ();
19728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
19828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    void
19928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SetThreadIndex (uint32_t index);
20028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
20128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    uint32_t
20228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    GetThreadIndex() const;
20328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
20428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    void
20528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SetThreadName (const char *thread_name);
20628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
20728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    const char *
20828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    GetThreadName () const;
20928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
21028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    void
21128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SetQueueName (const char *queue_name);
21228e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
21328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    const char *
21428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    GetQueueName () const;
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The next section deals with this location's breakpoint sites.
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Try to resolve the breakpoint site for this location.
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b true if we were successful at setting a breakpoint site,
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b false otherwise.
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ResolveBreakpointSite ();
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Clear this breakpoint location's breakpoint site - for instance
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// when disabling the breakpoint.
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b true if there was a breakpoint site to be cleared, \b false
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     otherwise.
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ClearBreakpointSite ();
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Return whether this breakpoint location has a breakpoint site.
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b true if there was a breakpoint site for this breakpoint
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     location, \b false otherwise.
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsResolved () const;
249d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham
250d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    lldb::BreakpointSiteSP
251d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham    GetBreakpointSite() const;
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The next section are generic report functions.
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Print a description of this breakpoint location to the stream
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// \a s.
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The stream to which to print the description.
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] level
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The description level that indicates the detail level to
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     provide.
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see lldb::DescriptionLevel
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetDescription (Stream *s, lldb::DescriptionLevel level);
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Standard "Dump" method.  At present it does nothing.
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Dump (Stream *s) const;
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Use this to set location specific breakpoint options.
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// It will create a copy of the containing breakpoint's options if
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// that hasn't been done already
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    A pointer to the breakpoint options.
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointOptions *
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetLocationOptions ();
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
2929c6898b5686984baa09d0c694169cc935fc99562Jim Ingham    /// Use this to access breakpoint options from this breakpoint location.
2939c6898b5686984baa09d0c694169cc935fc99562Jim Ingham    /// This will point to the owning breakpoint's options unless options have
2949c6898b5686984baa09d0c694169cc935fc99562Jim Ingham    /// been set specifically on this location.
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the containing breakpoint's options if this
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     location doesn't have its own copy.
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
3003c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    const BreakpointOptions *
3019c6898b5686984baa09d0c694169cc935fc99562Jim Ingham    GetOptionsNoCreate () const;
3023c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham
3033c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    bool
3043c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    ValidForThisThread (Thread *thread);
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Invoke the callback action when the breakpoint is hit.
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Meant to be used by the BreakpointLocation class.
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] context
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Described the breakpoint event.
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] bp_loc_id
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Which breakpoint location hit this breakpoint.
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b true if the target should stop at this breakpoint and \b
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     false not.
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    InvokeCallback (StoppointCallbackContext *context);
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
325643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonprotected:
32619a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg Clayton    friend class BreakpointLocationList;
327643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    friend class CommandObjectBreakpointCommandAdd;
328643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    friend class Process;
329643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Set the breakpoint site for this location to \a bp_site_sp.
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] bp_site_sp
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///      The breakpoint site we are setting for this location.
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b true if we were successful at setting the breakpoint site,
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b false otherwise.
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetBreakpointSite (lldb::BreakpointSiteSP& bp_site_sp);
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
343fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    void
344fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    DecrementIgnoreCount();
345fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham
346fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    bool
347fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    IgnoreCountShouldStop();
348fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Only the Breakpoint can make breakpoint locations, and it owns
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // them.
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Constructor.
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] owner
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A back pointer to the breakpoint that owns this location.
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] addr
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The Address defining this location.
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] tid
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The thread for which this breakpoint location is valid, or
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     LLDB_INVALID_THREAD_ID if it is valid for all threads.
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] hardware
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b true if a hardware breakpoint is requested.
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointLocation (lldb::break_id_t bid,
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        Breakpoint &owner,
37719a1ab8a1e0c9c66adaa648b5cf5909dac2d667eGreg Clayton                        const Address &addr,
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        lldb::tid_t tid = LLDB_INVALID_THREAD_ID,
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        bool hardware = false);
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Data members:
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
38428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    bool m_being_created;
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Address m_address; ///< The address defining this location.
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Breakpoint &m_owner; ///< The breakpoint that produced this object.
387102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<BreakpointOptions> m_options_ap; ///< Breakpoint options pointer, NULL if we're using our breakpoint's options.
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::BreakpointSiteSP m_bp_site_sp; ///< Our breakpoint site (it may be shared by more than one location.)
38928195f9e55173cd06c3c5f9e69cefeb1d03cc129Sean Callanan    ClangUserExpression::ClangUserExpressionSP m_user_expression_sp; ///< The compiled expression to use in testing our condition.
390d93d9131514d1c6f849a06180ec2f01d7792a661Sean Callanan    Mutex m_condition_mutex; ///< Guards parsing and evaluation of the condition, which could be evaluated by multiple processes.
39128195f9e55173cd06c3c5f9e69cefeb1d03cc129Sean Callanan    size_t m_condition_hash; ///< For testing whether the condition source code changed.
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    void
39428e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    SendBreakpointLocationChangedEvent (lldb::BreakpointEventType eventKind);
39528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (BreakpointLocation);
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_BreakpointLocation_h_
402