brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.4 KiB · 6a90f91 Raw
142 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H10#define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H11 12#include <vector>13 14#include "lldb/Target/DynamicRegisterInfo.h"15#include "lldb/Target/RegisterContext.h"16#include "lldb/Utility/ConstString.h"17#include "lldb/Utility/DataExtractor.h"18#include "lldb/lldb-enumerations.h"19#include "lldb/lldb-private.h"20 21#include "GDBRemoteCommunicationClient.h"22 23class StringExtractor;24 25namespace lldb_private {26namespace process_gdb_remote {27 28class ThreadGDBRemote;29class ProcessGDBRemote;30class GDBRemoteDynamicRegisterInfo;31 32typedef std::shared_ptr<GDBRemoteDynamicRegisterInfo>33    GDBRemoteDynamicRegisterInfoSP;34 35class GDBRemoteDynamicRegisterInfo final : public DynamicRegisterInfo {36public:37  GDBRemoteDynamicRegisterInfo() : DynamicRegisterInfo() {}38 39  ~GDBRemoteDynamicRegisterInfo() override = default;40 41  void UpdateARM64SVERegistersInfos(uint64_t vg);42  void UpdateARM64SMERegistersInfos(uint64_t svg);43};44 45class GDBRemoteRegisterContext : public RegisterContext {46public:47  GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx,48                           GDBRemoteDynamicRegisterInfoSP reg_info_sp,49                           bool read_all_at_once, bool write_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::WritableDataBufferSP &data_sp) override;70 71  bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;72 73  bool ReadAllRegisterValues(RegisterCheckpoint &reg_checkpoint) override;74 75  bool76  WriteAllRegisterValues(const RegisterCheckpoint &reg_checkpoint) override;77 78  uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,79                                               uint32_t num) override;80 81  bool RegisterWriteCausesReconfigure(const llvm::StringRef name) override;82 83  bool ReconfigureRegisterInfo() override;84 85protected:86  friend class ThreadGDBRemote;87 88  bool ReadRegisterBytes(const RegisterInfo *reg_info);89 90  bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data,91                          uint32_t data_offset);92 93  bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data);94 95  bool PrivateSetRegisterValue(uint32_t reg, uint64_t val);96 97  void SetAllRegisterValid(bool b);98 99  bool GetRegisterIsValid(uint32_t reg) const {100    assert(reg < m_reg_valid.size());101    if (reg < m_reg_valid.size())102      return m_reg_valid[reg];103    return false;104  }105 106  void SetRegisterIsValid(const RegisterInfo *reg_info, bool valid) {107    if (reg_info)108      return SetRegisterIsValid(reg_info->kinds[lldb::eRegisterKindLLDB],109                                valid);110  }111 112  void SetRegisterIsValid(uint32_t reg, bool valid) {113    assert(reg < m_reg_valid.size());114    if (reg < m_reg_valid.size())115      m_reg_valid[reg] = valid;116  }117 118  GDBRemoteDynamicRegisterInfoSP m_reg_info_sp;119  std::vector<bool> m_reg_valid;120  DataExtractor m_reg_data;121  bool m_read_all_at_once;122  bool m_write_all_at_once;123  bool m_gpacket_cached;124 125private:126  // Helper function for ReadRegisterBytes().127  bool GetPrimordialRegister(const RegisterInfo *reg_info,128                             GDBRemoteCommunicationClient &gdb_comm);129  // Helper function for WriteRegisterBytes().130  bool SetPrimordialRegister(const RegisterInfo *reg_info,131                             GDBRemoteCommunicationClient &gdb_comm);132 133  GDBRemoteRegisterContext(const GDBRemoteRegisterContext &) = delete;134  const GDBRemoteRegisterContext &135  operator=(const GDBRemoteRegisterContext &) = delete;136};137 138} // namespace process_gdb_remote139} // namespace lldb_private140 141#endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTEREGISTERCONTEXT_H142