NativeRegisterContext.h revision 275072
1275072Semaste//===-- NativeRegisterContext.h ---------------------------------*- C++ -*-===//
2275072Semaste//
3275072Semaste//                     The LLVM Compiler Infrastructure
4275072Semaste//
5275072Semaste// This file is distributed under the University of Illinois Open Source
6275072Semaste// License. See LICENSE.TXT for details.
7275072Semaste//
8275072Semaste//===----------------------------------------------------------------------===//
9275072Semaste
10275072Semaste#ifndef liblldb_NativeRegisterContext_h_
11275072Semaste#define liblldb_NativeRegisterContext_h_
12275072Semaste
13275072Semaste// C Includes
14275072Semaste// C++ Includes
15275072Semaste// Other libraries and framework includes
16275072Semaste// Project includes
17275072Semaste#include "lldb/lldb-private.h"
18275072Semaste
19275072Semastenamespace lldb_private {
20275072Semaste
21275072Semasteclass NativeThreadProtocol;
22275072Semaste
23275072Semasteclass NativeRegisterContext:
24275072Semaste    public std::enable_shared_from_this<NativeRegisterContext>
25275072Semaste{
26275072Semastepublic:
27275072Semaste    //------------------------------------------------------------------
28275072Semaste    // Constructors and Destructors
29275072Semaste    //------------------------------------------------------------------
30275072Semaste    NativeRegisterContext (NativeThreadProtocol &thread, uint32_t concrete_frame_idx);
31275072Semaste
32275072Semaste    virtual
33275072Semaste    ~NativeRegisterContext ();
34275072Semaste
35275072Semaste    // void
36275072Semaste    // InvalidateIfNeeded (bool force);
37275072Semaste
38275072Semaste    //------------------------------------------------------------------
39275072Semaste    // Subclasses must override these functions
40275072Semaste    //------------------------------------------------------------------
41275072Semaste    // virtual void
42275072Semaste    // InvalidateAllRegisters () = 0;
43275072Semaste
44275072Semaste    virtual uint32_t
45275072Semaste    GetRegisterCount () const = 0;
46275072Semaste
47275072Semaste    virtual const RegisterInfo *
48275072Semaste    GetRegisterInfoAtIndex (uint32_t reg) const = 0;
49275072Semaste
50275072Semaste    const char *
51275072Semaste    GetRegisterSetNameForRegisterAtIndex (uint32_t reg_index) const;
52275072Semaste
53275072Semaste    virtual uint32_t
54275072Semaste    GetRegisterSetCount () const = 0;
55275072Semaste
56275072Semaste    virtual const RegisterSet *
57275072Semaste    GetRegisterSet (uint32_t set_index) const = 0;
58275072Semaste
59275072Semaste    virtual Error
60275072Semaste    ReadRegister (const RegisterInfo *reg_info, RegisterValue &reg_value) = 0;
61275072Semaste
62275072Semaste    virtual Error
63275072Semaste    WriteRegister (const RegisterInfo *reg_info, const RegisterValue &reg_value) = 0;
64275072Semaste
65275072Semaste    virtual Error
66275072Semaste    ReadAllRegisterValues (lldb::DataBufferSP &data_sp) = 0;
67275072Semaste
68275072Semaste    virtual Error
69275072Semaste    WriteAllRegisterValues (const lldb::DataBufferSP &data_sp) = 0;
70275072Semaste
71275072Semaste    uint32_t
72275072Semaste    ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num) const;
73275072Semaste
74275072Semaste    //------------------------------------------------------------------
75275072Semaste    // Subclasses can override these functions if desired
76275072Semaste    //------------------------------------------------------------------
77275072Semaste    virtual uint32_t
78275072Semaste    NumSupportedHardwareBreakpoints ();
79275072Semaste
80275072Semaste    virtual uint32_t
81275072Semaste    SetHardwareBreakpoint (lldb::addr_t addr, size_t size);
82275072Semaste
83275072Semaste    virtual bool
84275072Semaste    ClearHardwareBreakpoint (uint32_t hw_idx);
85275072Semaste
86275072Semaste    virtual uint32_t
87275072Semaste    NumSupportedHardwareWatchpoints ();
88275072Semaste
89275072Semaste    virtual uint32_t
90275072Semaste    SetHardwareWatchpoint (lldb::addr_t addr, size_t size, uint32_t watch_flags);
91275072Semaste
92275072Semaste    virtual bool
93275072Semaste    ClearHardwareWatchpoint (uint32_t hw_index);
94275072Semaste
95275072Semaste    virtual bool
96275072Semaste    HardwareSingleStep (bool enable);
97275072Semaste
98275072Semaste    virtual Error
99275072Semaste    ReadRegisterValueFromMemory (const lldb_private::RegisterInfo *reg_info, lldb::addr_t src_addr, lldb::addr_t src_len, RegisterValue &reg_value);
100275072Semaste
101275072Semaste    virtual Error
102275072Semaste    WriteRegisterValueToMemory (const lldb_private::RegisterInfo *reg_info, lldb::addr_t dst_addr, lldb::addr_t dst_len, const RegisterValue &reg_value);
103275072Semaste
104275072Semaste    //------------------------------------------------------------------
105275072Semaste    // Subclasses should not override these
106275072Semaste    //------------------------------------------------------------------
107275072Semaste    virtual lldb::tid_t
108275072Semaste    GetThreadID() const;
109275072Semaste
110275072Semaste    virtual NativeThreadProtocol &
111275072Semaste    GetThread ()
112275072Semaste    {
113275072Semaste        return m_thread;
114275072Semaste    }
115275072Semaste
116275072Semaste    const RegisterInfo *
117275072Semaste    GetRegisterInfoByName (const char *reg_name, uint32_t start_idx = 0);
118275072Semaste
119275072Semaste    const RegisterInfo *
120275072Semaste    GetRegisterInfo (uint32_t reg_kind, uint32_t reg_num);
121275072Semaste
122275072Semaste    lldb::addr_t
123275072Semaste    GetPC (lldb::addr_t fail_value = LLDB_INVALID_ADDRESS);
124275072Semaste
125275072Semaste    Error
126275072Semaste    SetPC (lldb::addr_t pc);
127275072Semaste
128275072Semaste    lldb::addr_t
129275072Semaste    GetSP (lldb::addr_t fail_value = LLDB_INVALID_ADDRESS);
130275072Semaste
131275072Semaste    Error
132275072Semaste    SetSP (lldb::addr_t sp);
133275072Semaste
134275072Semaste    lldb::addr_t
135275072Semaste    GetFP (lldb::addr_t fail_value = LLDB_INVALID_ADDRESS);
136275072Semaste
137275072Semaste    Error
138275072Semaste    SetFP (lldb::addr_t fp);
139275072Semaste
140275072Semaste    const char *
141275072Semaste    GetRegisterName (uint32_t reg);
142275072Semaste
143275072Semaste    lldb::addr_t
144275072Semaste    GetReturnAddress (lldb::addr_t fail_value = LLDB_INVALID_ADDRESS);
145275072Semaste
146275072Semaste    lldb::addr_t
147275072Semaste    GetFlags (lldb::addr_t fail_value = 0);
148275072Semaste
149275072Semaste    lldb::addr_t
150275072Semaste    ReadRegisterAsUnsigned (uint32_t reg, lldb::addr_t fail_value);
151275072Semaste
152275072Semaste    lldb::addr_t
153275072Semaste    ReadRegisterAsUnsigned (const RegisterInfo *reg_info, lldb::addr_t fail_value);
154275072Semaste
155275072Semaste    Error
156275072Semaste    WriteRegisterFromUnsigned (uint32_t reg, uint64_t uval);
157275072Semaste
158275072Semaste    Error
159275072Semaste    WriteRegisterFromUnsigned (const RegisterInfo *reg_info, uint64_t uval);
160275072Semaste
161275072Semaste    // uint32_t
162275072Semaste    // GetStopID () const
163275072Semaste    // {
164275072Semaste    //     return m_stop_id;
165275072Semaste    // }
166275072Semaste
167275072Semaste    // void
168275072Semaste    // SetStopID (uint32_t stop_id)
169275072Semaste    // {
170275072Semaste    //     m_stop_id = stop_id;
171275072Semaste    // }
172275072Semaste
173275072Semasteprotected:
174275072Semaste    //------------------------------------------------------------------
175275072Semaste    // Classes that inherit from RegisterContext can see and modify these
176275072Semaste    //------------------------------------------------------------------
177275072Semaste    NativeThreadProtocol &m_thread; // The thread that this register context belongs to.
178275072Semaste    uint32_t m_concrete_frame_idx;  // The concrete frame index for this register context
179275072Semaste    // uint32_t m_stop_id;             // The stop ID that any data in this context is valid for
180275072Semaste
181275072Semasteprivate:
182275072Semaste    //------------------------------------------------------------------
183275072Semaste    // For RegisterContext only
184275072Semaste    //------------------------------------------------------------------
185275072Semaste    DISALLOW_COPY_AND_ASSIGN (NativeRegisterContext);
186275072Semaste};
187275072Semaste
188275072Semaste} // namespace lldb_private
189275072Semaste
190275072Semaste#endif  // liblldb_NativeRegisterContext_h_
191