]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Plugins/Process/Utility/RegisterContextThreadMemory.h
Merge ^/head r294169 through r294598.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Plugins / Process / Utility / RegisterContextThreadMemory.h
1 //===-- RegisterContextThreadMemory.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 lldb_RegisterContextThreadMemory_h_
11 #define lldb_RegisterContextThreadMemory_h_
12
13 // C Includes
14 // C++ Includes
15 #include <vector>
16
17 // Other libraries and framework includes
18 // Project includes
19 #include "lldb/lldb-private.h"
20 #include "lldb/Target/RegisterContext.h"
21 #include "lldb/Symbol/SymbolContext.h"
22
23 namespace lldb_private {
24     
25 class RegisterContextThreadMemory : public lldb_private::RegisterContext
26 {
27 public:
28     RegisterContextThreadMemory (Thread &thread,
29                                  lldb::addr_t register_data_addr);
30     
31     ~RegisterContextThreadMemory() override;
32
33     void
34     InvalidateAllRegisters() override;
35     
36     size_t
37     GetRegisterCount() override;
38     
39     const RegisterInfo *
40     GetRegisterInfoAtIndex(size_t reg) override;
41     
42     size_t
43     GetRegisterSetCount() override;
44     
45     const RegisterSet *
46     GetRegisterSet(size_t reg_set) override;
47     
48     bool
49     ReadRegister(const RegisterInfo *reg_info, RegisterValue &reg_value) override;
50     
51     bool
52     WriteRegister(const RegisterInfo *reg_info, const RegisterValue &reg_value) override;
53     
54     // These two functions are used to implement "push" and "pop" of register states.  They are used primarily
55     // for expression evaluation, where we need to push a new state (storing the old one in data_sp) and then
56     // restoring the original state by passing the data_sp we got from ReadAllRegisters to WriteAllRegisterValues.
57     // ReadAllRegisters will do what is necessary to return a coherent set of register values for this thread, which
58     // may mean e.g. interrupting a thread that is sitting in a kernel trap.  That is a somewhat disruptive operation,
59     // so these API's should only be used when this behavior is needed.
60     
61     bool
62     ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override;
63     
64     bool
65     WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
66     
67     bool
68     CopyFromRegisterContext (lldb::RegisterContextSP context);
69     
70     uint32_t
71     ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, uint32_t num) override;
72     
73     uint32_t
74     NumSupportedHardwareBreakpoints() override;
75     
76     uint32_t
77     SetHardwareBreakpoint(lldb::addr_t addr, size_t size) override;
78     
79     bool
80     ClearHardwareBreakpoint(uint32_t hw_idx) override;
81     
82     uint32_t
83     NumSupportedHardwareWatchpoints() override;
84     
85     uint32_t
86     SetHardwareWatchpoint(lldb::addr_t addr, size_t size, bool read, bool write) override;
87     
88     bool
89     ClearHardwareWatchpoint(uint32_t hw_index) override;
90     
91     bool
92     HardwareSingleStep(bool enable) override;
93     
94     Error
95     ReadRegisterValueFromMemory(const lldb_private::RegisterInfo *reg_info,
96                                 lldb::addr_t src_addr,
97                                 uint32_t src_len,
98                                 RegisterValue &reg_value) override;
99     
100     Error
101     WriteRegisterValueToMemory(const lldb_private::RegisterInfo *reg_info,
102                                lldb::addr_t dst_addr, uint32_t dst_len,
103                                const RegisterValue &reg_value) override;
104
105 protected:
106     void
107     UpdateRegisterContext ();
108     
109     lldb::ThreadWP m_thread_wp;
110     lldb::RegisterContextSP m_reg_ctx_sp;
111     lldb::addr_t m_register_data_addr;
112     uint32_t m_stop_id;
113
114 private:
115     DISALLOW_COPY_AND_ASSIGN (RegisterContextThreadMemory);
116 };
117
118 } // namespace lldb_private
119
120 #endif // lldb_RegisterContextThreadMemory_h_