LLDB mainline
GDBRemoteRegisterContext.h
Go to the documentation of this file.
1//===-- GDBRemoteRegisterContext.h ------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H
10#define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H
11
12#include <vector>
13
19#include "lldb/lldb-private.h"
20
22
23class StringExtractor;
24
25namespace lldb_private {
26namespace process_gdb_remote {
27
28class ThreadGDBRemote;
30
32public:
33 GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx,
35 bool read_all_at_once, bool write_all_at_once);
36
38
40
41 size_t GetRegisterCount() override;
42
43 const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;
44
45 size_t GetRegisterSetCount() override;
46
47 const RegisterSet *GetRegisterSet(size_t reg_set) override;
48
49 bool ReadRegister(const RegisterInfo *reg_info,
50 RegisterValue &value) override;
51
52 bool WriteRegister(const RegisterInfo *reg_info,
53 const RegisterValue &value) override;
54
56
57 bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
58
59 bool ReadAllRegisterValues(RegisterCheckpoint &reg_checkpoint) override;
60
61 bool
62 WriteAllRegisterValues(const RegisterCheckpoint &reg_checkpoint) override;
63
65 uint32_t num) override;
66
67 bool RegisterWriteCausesReconfigure(const llvm::StringRef name) override;
68
69 bool ReconfigureRegisterInfo() override;
70
71protected:
72 friend class ThreadGDBRemote;
73
74 bool ReadRegisterBytes(const RegisterInfo *reg_info);
75
76 bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data,
77 uint32_t data_offset);
78
79 bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data);
80
81 bool PrivateSetRegisterValue(uint32_t reg, uint64_t val);
82
87
88 bool GetRegisterIsValid(uint32_t reg) const {
90 }
91 bool GetRegisterIsUnavailable(uint32_t reg) const {
93 }
94 bool GetRegisterIsUnfetched(uint32_t reg) const {
96 }
97
98 void SetRegisterIsValid(const RegisterInfo *reg_info) {
100 }
103 }
107 void SetRegisterIsValid(uint32_t reg) {
109 }
110 void SetRegisterIsUnavailable(uint32_t reg) {
112 }
116
118
119 /// eLazyBoolYes - we have the bytes for this register locally.
120 /// eLazyBoolCalculate - we have not yet tried to get the bytes.
121 /// eLazyBoolNo - the bytes are unreadable at this stop.
122 std::vector<LazyBool> m_reg_valid;
123
128
129private:
130 LazyBool GetRegisterValidState(uint32_t reg) const;
132 void SetRegisterIsValidState(const RegisterInfo *reg_info, LazyBool valid);
133 void SetRegisterIsValidState(uint32_t reg, LazyBool valid);
134
135 // Helper function for ReadRegisterBytes().
136 bool GetPrimordialRegister(const RegisterInfo *reg_info,
138 // Helper function for WriteRegisterBytes().
139 bool SetPrimordialRegister(const RegisterInfo *reg_info,
141
145};
146
147} // namespace process_gdb_remote
148} // namespace lldb_private
149
150#endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H
An data extractor class.
RegisterContext(Thread &thread, uint32_t concrete_frame_idx)
const RegisterSet * GetRegisterSet(size_t reg_set) override
const GDBRemoteRegisterContext & operator=(const GDBRemoteRegisterContext &)=delete
bool RegisterWriteCausesReconfigure(const llvm::StringRef name) override
GDBRemoteRegisterContext(const GDBRemoteRegisterContext &)=delete
bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data, uint32_t data_offset)
bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef< uint8_t > data)
bool ReadRegister(const RegisterInfo *reg_info, RegisterValue &value) override
bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override
bool WriteRegister(const RegisterInfo *reg_info, const RegisterValue &value) override
bool ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override
void SetRegisterIsValidState(const RegisterInfo *reg_info, LazyBool valid)
bool SetPrimordialRegister(const RegisterInfo *reg_info, GDBRemoteCommunicationClient &gdb_comm)
uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, uint32_t num) override
Convert from a given register numbering scheme to the lldb register numbering scheme.
GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx, lldb::DynamicRegisterInfoSP reg_info_sp, bool read_all_at_once, bool write_all_at_once)
bool GetPrimordialRegister(const RegisterInfo *reg_info, GDBRemoteCommunicationClient &gdb_comm)
std::vector< LazyBool > m_reg_valid
eLazyBoolYes - we have the bytes for this register locally.
A class that represents a running process on the host machine.
std::shared_ptr< lldb_private::DynamicRegisterInfo > DynamicRegisterInfoSP
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
RegisterKind
Register numbering types.
Every register is described in detail including its name, alternate name (optional),...
Registers are grouped into register sets.