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