1//===-- RegisterContextPOSIX.h --------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_RegisterContextPOSIX_H_
11#define liblldb_RegisterContextPOSIX_H_
12
13// C Includes
14// C++ Includes
15// Other libraries and framework includes
16#include "lldb/Core/ArchSpec.h"
17#include "lldb/Target/RegisterContext.h"
18
19//------------------------------------------------------------------------------
20/// @class POSIXBreakpointProtocol
21///
22/// @brief Extends RegisterClass with a few virtual operations useful on POSIX.
23class POSIXBreakpointProtocol
24{
25public:
26    POSIXBreakpointProtocol()
27        { m_watchpoints_initialized = false; }
28    virtual ~POSIXBreakpointProtocol() {}
29
30    /// Updates the register state of the associated thread after hitting a
31    /// breakpoint (if that make sense for the architecture).  Default
32    /// implementation simply returns true for architectures which do not
33    /// require any update.
34    ///
35    /// @return
36    ///    True if the operation succeeded and false otherwise.
37    virtual bool UpdateAfterBreakpoint() = 0;
38
39    /// Determines the index in lldb's register file given a kernel byte offset.
40    virtual unsigned
41    GetRegisterIndexFromOffset(unsigned offset) = 0;
42
43    // Checks to see if a watchpoint specified by hw_index caused the inferior
44    // to stop.
45    virtual bool
46    IsWatchpointHit (uint32_t hw_index) = 0;
47
48    // Resets any watchpoints that have been hit.
49    virtual bool
50    ClearWatchpointHits () = 0;
51
52    // Returns the watchpoint address associated with a watchpoint hardware
53    // index.
54    virtual lldb::addr_t
55    GetWatchpointAddress (uint32_t hw_index) = 0;
56
57    virtual bool
58    IsWatchpointVacant (uint32_t hw_index) = 0;
59
60    virtual bool
61    SetHardwareWatchpointWithIndex (lldb::addr_t addr, size_t size,
62                                    bool read, bool write,
63                                    uint32_t hw_index) = 0;
64
65    // From lldb_private::RegisterContext
66    virtual uint32_t
67    NumSupportedHardwareWatchpoints () = 0;
68
69    // Force m_watchpoints_initialized to TRUE
70    void
71    ForceWatchpointsInitialized () {m_watchpoints_initialized = true;}
72
73protected:
74    bool m_watchpoints_initialized;
75};
76
77//------------------------------------------------------------------------------
78/// @class RegisterInfoInterface
79///
80/// @brief RegisterInfo interface to patch RegisterInfo structure for archs.
81class RegisterInfoInterface
82{
83public:
84    RegisterInfoInterface(const lldb_private::ArchSpec& target_arch) : m_target_arch(target_arch) {}
85    virtual ~RegisterInfoInterface () {}
86
87    virtual size_t
88    GetGPRSize () = 0;
89
90    virtual const lldb_private::RegisterInfo *
91    GetRegisterInfo () = 0;
92
93public:
94    lldb_private::ArchSpec m_target_arch;
95};
96
97#endif // #ifndef liblldb_RegisterContextPOSIX_H_
98
99