1//===-- RegisterContextMemory.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_RegisterContextMemory_h_
10#define lldb_RegisterContextMemory_h_
11
12#include <vector>
13
14#include "lldb/Target/RegisterContext.h"
15#include "lldb/Utility/DataExtractor.h"
16#include "lldb/lldb-private.h"
17
18class DynamicRegisterInfo;
19
20class RegisterContextMemory : public lldb_private::RegisterContext {
21public:
22  RegisterContextMemory(lldb_private::Thread &thread,
23                        uint32_t concrete_frame_idx,
24                        DynamicRegisterInfo &reg_info,
25                        lldb::addr_t reg_data_addr);
26
27  ~RegisterContextMemory() override;
28
29  void InvalidateAllRegisters() override;
30
31  size_t GetRegisterCount() override;
32
33  const lldb_private::RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;
34
35  size_t GetRegisterSetCount() override;
36
37  const lldb_private::RegisterSet *GetRegisterSet(size_t reg_set) override;
38
39  uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,
40                                               uint32_t num) override;
41
42  // If all of the thread register are in a contiguous buffer in
43  // memory, then the default ReadRegister/WriteRegister and
44  // ReadAllRegisterValues/WriteAllRegisterValues will work. If thread
45  // registers are not contiguous, clients will want to subclass this
46  // class and modify the read/write functions as needed.
47
48  bool ReadRegister(const lldb_private::RegisterInfo *reg_info,
49                    lldb_private::RegisterValue &reg_value) override;
50
51  bool WriteRegister(const lldb_private::RegisterInfo *reg_info,
52                     const lldb_private::RegisterValue &reg_value) override;
53
54  bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override;
55
56  bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
57
58  void SetAllRegisterData(const lldb::DataBufferSP &data_sp);
59
60protected:
61  void SetAllRegisterValid(bool b);
62
63  DynamicRegisterInfo &m_reg_infos;
64  std::vector<bool> m_reg_valid;
65  lldb_private::DataExtractor m_reg_data;
66  lldb::addr_t m_reg_data_addr; // If this is valid, then we have a register
67                                // context that is stored in memmory
68
69private:
70  DISALLOW_COPY_AND_ASSIGN(RegisterContextMemory);
71};
72
73#endif // lldb_RegisterContextMemory_h_
74