Commit ea9d44f5 authored by David Spickett's avatar David Spickett
Browse files

Reland "[lldb] Add template method for getting const or mutable regs from...

Reland "[lldb] Add template method for getting const or mutable regs from DynamicRegisterInfo (#71402)"

This reverts commit 75b195cc.

I've moved the specialisations out of the class to fix the g++ compilation.
parent 04790b98
Loading
Loading
Loading
Loading
+16 −6
Original line number Diff line number Diff line
@@ -89,13 +89,11 @@ public:
  GetRegisterInfo(llvm::StringRef reg_name) const;

  typedef std::vector<lldb_private::RegisterInfo> reg_collection;
  llvm::iterator_range<reg_collection::const_iterator> registers() const {
    return llvm::iterator_range<reg_collection::const_iterator>(m_regs);
  }
  typedef llvm::iterator_range<reg_collection::const_iterator>
      reg_collection_const_range;
  typedef llvm::iterator_range<reg_collection::iterator> reg_collection_range;

  llvm::iterator_range<reg_collection::iterator> registers_mutable() {
    return llvm::iterator_range<reg_collection::iterator>(m_regs);
  }
  template <typename T> T registers() = delete;

  void ConfigureOffsets();

@@ -135,6 +133,18 @@ protected:
  bool m_is_reconfigurable = false;
};

template <>
inline DynamicRegisterInfo::reg_collection_const_range
DynamicRegisterInfo::registers() {
  return reg_collection_const_range(m_regs);
}

template <>
inline DynamicRegisterInfo::reg_collection_range
DynamicRegisterInfo::registers() {
  return reg_collection_range(m_regs);
}

void addSupplementaryRegister(std::vector<DynamicRegisterInfo::Register> &regs,
                              DynamicRegisterInfo::Register new_reg_info);

+9 −12
Original line number Diff line number Diff line
@@ -38,10 +38,8 @@ ArchitectureAArch64::Create(const ArchSpec &arch) {
  return std::unique_ptr<Architecture>(new ArchitectureAArch64());
}

static void UpdateARM64SVERegistersInfos(
    llvm::iterator_range<
        lldb_private::DynamicRegisterInfo::reg_collection::iterator>
        regs,
static void
UpdateARM64SVERegistersInfos(DynamicRegisterInfo::reg_collection_range regs,
                             uint64_t vg) {
  // SVE Z register size is vg x 8 bytes.
  uint32_t z_reg_byte_size = vg * 8;
@@ -62,10 +60,8 @@ static void UpdateARM64SVERegistersInfos(
  }
}

static void UpdateARM64SMERegistersInfos(
    llvm::iterator_range<
        lldb_private::DynamicRegisterInfo::reg_collection::iterator>
        regs,
static void
UpdateARM64SMERegistersInfos(DynamicRegisterInfo::reg_collection_range regs,
                             uint64_t svg) {
  for (auto &reg : regs) {
    if (strcmp(reg.name, "za") == 0) {
@@ -108,10 +104,11 @@ bool ArchitectureAArch64::ReconfigureRegisterInfo(DynamicRegisterInfo &reg_info,
  if (!vg_reg_value && !svg_reg_value)
    return false;

  auto regs = reg_info.registers<DynamicRegisterInfo::reg_collection_range>();
  if (vg_reg_value)
    UpdateARM64SVERegistersInfos(reg_info.registers_mutable(), *vg_reg_value);
    UpdateARM64SVERegistersInfos(regs, *vg_reg_value);
  if (svg_reg_value)
    UpdateARM64SMERegistersInfos(reg_info.registers_mutable(), *svg_reg_value);
    UpdateARM64SMERegistersInfos(regs, *svg_reg_value);

  // At this point if we have updated any registers, their offsets will all be
  // invalid. If we did, we need to update them all.
+3 −1
Original line number Diff line number Diff line
@@ -228,7 +228,9 @@ bool GDBRemoteRegisterContext::ReadRegisterBytes(const RegisterInfo *reg_info) {
          SetAllRegisterValid(true);
          return true;
        } else if (buffer_sp->GetByteSize() > 0) {
          for (auto x : llvm::enumerate(m_reg_info_sp->registers())) {
          for (auto x : llvm::enumerate(
                   m_reg_info_sp->registers<
                       DynamicRegisterInfo::reg_collection_const_range>())) {
            const struct RegisterInfo &reginfo = x.value();
            m_reg_valid[x.index()] =
                (reginfo.byte_offset + reginfo.byte_size <=