124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- StoppointLocation.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_StoppointLocation_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_StoppointLocation_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/lldb-private.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/UserID.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// #include "lldb/Breakpoint/BreakpointOptions.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass StoppointLocation
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StoppointLocation (lldb::break_id_t bid,
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       lldb::addr_t m_addr,
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       bool hardware);
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StoppointLocation (lldb::break_id_t bid,
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       lldb::addr_t m_addr,
35bae39c554644de9f319f59c25a76ad64bd266f84Greg Clayton                       uint32_t byte_size,
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       bool hardware);
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~StoppointLocation ();
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Operators
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Methods
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb::addr_t
49265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    GetLoadAddress() const
50265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    {
51265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton        return m_addr;
52265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    }
53265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton
54116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen    virtual void
55116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen    SetLoadAddress (lldb::addr_t addr)
56265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    {
57116a5cd7b8a0ec7929f10281cd708edb2bf20ffaJohnny Chen        m_addr = addr;
58265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    }
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60bae39c554644de9f319f59c25a76ad64bd266f84Greg Clayton    uint32_t
61265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    GetByteSize () const
62265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    {
63265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton        return m_byte_size;
64265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    }
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
67265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    GetHitCount () const
68265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    {
69265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton        return m_hit_count;
70265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    }
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
73265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    GetHardwareIndex () const
74265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    {
75265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton        return m_hw_index;
76265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    }
77265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
80265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    HardwarePreferred () const
81265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    {
82265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton        return m_hw_preferred;
83265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    }
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8501acfa76010b8db2e77016c144963c4dd70f1392Johnny Chen    virtual bool
86265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    IsHardware () const
87265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    {
88265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton        return m_hw_index != LLDB_INVALID_INDEX32;
89265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    }
90265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
93265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    ShouldStop (StoppointCallbackContext *context)
94265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    {
95265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton        return true;
96265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    }
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
99265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    Dump (Stream *stream) const
100265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    {
101265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    }
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
104265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    SetHardwareIndex (uint32_t index)
105265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    {
106265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton        m_hw_index = index;
107265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    }
108265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::break_id_t
111265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    GetID () const
112265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    {
113265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton        return m_loc_id;
114265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton    }
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Classes that inherit from StoppointLocation can see and modify these
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
1201c2d941ab4c3ba05888c48e25d245b099a18213aJohnny Chen    lldb::break_id_t  m_loc_id;     // Stoppoint location ID
12154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    lldb::addr_t      m_addr;       // The load address of this stop point. The base Stoppoint doesn't
12254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                                    // store a full Address since that's not needed for the breakpoint sites.
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool        m_hw_preferred;     // 1 if this point has been requested to be set using hardware (which may fail due to lack of resources)
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t    m_hw_index;         // The hardware resource index for this breakpoint/watchpoint
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t    m_byte_size;        // The size in bytes of stop location.  e.g. the length of the trap opcode for
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    // software breakpoints, or the optional length in bytes for
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    // hardware breakpoints, or the length of the watchpoint.
1281c2d941ab4c3ba05888c48e25d245b099a18213aJohnny Chen    uint32_t    m_hit_count;        // Number of times this breakpoint/watchpoint has been hit
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    // If you override this, be sure to call the base class to increment the internal counter.
131fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    void
132fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    IncrementHitCount ()
133fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    {
134fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham        ++m_hit_count;
135fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham    }
136fdbd10abe4f1f0e97647355823a8e2cd5f50856bJim Ingham
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // For StoppointLocation only
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN(StoppointLocation);
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StoppointLocation(); // Disallow default constructor
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_StoppointLocation_h_
148