]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h
MFV r337197: 9456 ztest failure in zil_commit_waiter_timeout
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Plugins / Process / gdb-remote / GDBRemoteRegisterContext.h
1 //===-- GDBRemoteRegisterContext.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_GDBRemoteRegisterContext_h_
11 #define lldb_GDBRemoteRegisterContext_h_
12
13 // C Includes
14 // C++ Includes
15 #include <vector>
16
17 // Other libraries and framework includes
18 // Project includes
19 #include "Plugins/Process/Utility/DynamicRegisterInfo.h"
20 #include "lldb/Target/RegisterContext.h"
21 #include "lldb/Utility/ConstString.h"
22 #include "lldb/Utility/DataExtractor.h"
23 #include "lldb/lldb-enumerations.h"
24 #include "lldb/lldb-private.h"
25
26 #include "GDBRemoteCommunicationClient.h"
27
28 class StringExtractor;
29
30 namespace lldb_private {
31 namespace process_gdb_remote {
32
33 class ThreadGDBRemote;
34 class ProcessGDBRemote;
35
36 class GDBRemoteDynamicRegisterInfo : public DynamicRegisterInfo {
37 public:
38   GDBRemoteDynamicRegisterInfo() : DynamicRegisterInfo() {}
39
40   ~GDBRemoteDynamicRegisterInfo() override = default;
41
42   void HardcodeARMRegisters(bool from_scratch);
43 };
44
45 class GDBRemoteRegisterContext : public RegisterContext {
46 public:
47   GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx,
48                            GDBRemoteDynamicRegisterInfo &reg_info,
49                            bool read_all_at_once);
50
51   ~GDBRemoteRegisterContext() override;
52
53   void InvalidateAllRegisters() override;
54
55   size_t GetRegisterCount() override;
56
57   const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;
58
59   size_t GetRegisterSetCount() override;
60
61   const RegisterSet *GetRegisterSet(size_t reg_set) override;
62
63   bool ReadRegister(const RegisterInfo *reg_info,
64                     RegisterValue &value) override;
65
66   bool WriteRegister(const RegisterInfo *reg_info,
67                      const RegisterValue &value) override;
68
69   bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override;
70
71   bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
72
73   bool ReadAllRegisterValues(RegisterCheckpoint &reg_checkpoint) override;
74
75   bool
76   WriteAllRegisterValues(const RegisterCheckpoint &reg_checkpoint) override;
77
78   uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,
79                                                uint32_t num) override;
80
81 protected:
82   friend class ThreadGDBRemote;
83
84   bool ReadRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data);
85
86   bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data,
87                           uint32_t data_offset);
88
89   bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data);
90
91   bool PrivateSetRegisterValue(uint32_t reg, uint64_t val);
92
93   void SetAllRegisterValid(bool b);
94
95   bool GetRegisterIsValid(uint32_t reg) const {
96 #if defined(LLDB_CONFIGURATION_DEBUG)
97     assert(reg < m_reg_valid.size());
98 #endif
99     if (reg < m_reg_valid.size())
100       return m_reg_valid[reg];
101     return false;
102   }
103
104   void SetRegisterIsValid(const RegisterInfo *reg_info, bool valid) {
105     if (reg_info)
106       return SetRegisterIsValid(reg_info->kinds[lldb::eRegisterKindLLDB],
107                                 valid);
108   }
109
110   void SetRegisterIsValid(uint32_t reg, bool valid) {
111 #if defined(LLDB_CONFIGURATION_DEBUG)
112     assert(reg < m_reg_valid.size());
113 #endif
114     if (reg < m_reg_valid.size())
115       m_reg_valid[reg] = valid;
116   }
117
118   GDBRemoteDynamicRegisterInfo &m_reg_info;
119   std::vector<bool> m_reg_valid;
120   DataExtractor m_reg_data;
121   bool m_read_all_at_once;
122
123 private:
124   // Helper function for ReadRegisterBytes().
125   bool GetPrimordialRegister(const RegisterInfo *reg_info,
126                              GDBRemoteCommunicationClient &gdb_comm);
127   // Helper function for WriteRegisterBytes().
128   bool SetPrimordialRegister(const RegisterInfo *reg_info,
129                              GDBRemoteCommunicationClient &gdb_comm);
130
131   DISALLOW_COPY_AND_ASSIGN(GDBRemoteRegisterContext);
132 };
133
134 } // namespace process_gdb_remote
135 } // namespace lldb_private
136
137 #endif // lldb_GDBRemoteRegisterContext_h_