Index: lldb/include/lldb/Target/DynamicRegisterInfo.h =================================================================== --- lldb/include/lldb/Target/DynamicRegisterInfo.h +++ lldb/include/lldb/Target/DynamicRegisterInfo.h @@ -53,6 +53,9 @@ size_t SetRegisterInfo(const lldb_private::StructuredData::Dictionary &dict, const lldb_private::ArchSpec &arch); + size_t SetRegisterInfo(const std::vector ®s, + const lldb_private::ArchSpec &arch); + void AddRegister(lldb_private::RegisterInfo reg_info, lldb_private::ConstString &set_name); @@ -68,7 +71,7 @@ const lldb_private::RegisterSet *GetRegisterSet(uint32_t i) const; - uint32_t GetRegisterSetIndexByName(lldb_private::ConstString &set_name, + uint32_t GetRegisterSetIndexByName(const lldb_private::ConstString &set_name, bool can_create); uint32_t ConvertRegisterKindToRegisterNumber(uint32_t kind, Index: lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp =================================================================== --- lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -4502,32 +4502,7 @@ if (ABISP abi_sp = ABI::FindPlugin(shared_from_this(), arch_to_use)) abi_sp->AugmentRegisterInfo(registers); - for (auto it : llvm::enumerate(registers)) { - uint32_t local_regnum = it.index(); - DynamicRegisterInfo::Register &remote_reg_info = it.value(); - - auto regs_with_sentinel = [](std::vector &vec) -> uint32_t * { - if (!vec.empty()) { - vec.push_back(LLDB_INVALID_REGNUM); - return vec.data(); - } - return nullptr; - }; - - struct RegisterInfo reg_info { - remote_reg_info.name.AsCString(), remote_reg_info.alt_name.AsCString(), - remote_reg_info.byte_size, remote_reg_info.byte_offset, - remote_reg_info.encoding, remote_reg_info.format, - {remote_reg_info.regnum_ehframe, remote_reg_info.regnum_dwarf, - remote_reg_info.regnum_generic, remote_reg_info.regnum_remote, - local_regnum}, - regs_with_sentinel(remote_reg_info.value_regs), - regs_with_sentinel(remote_reg_info.invalidate_regs), - }; - m_register_info_sp->AddRegister(reg_info, remote_reg_info.set_name); - }; - - m_register_info_sp->Finalize(arch_to_use); + m_register_info_sp->SetRegisterInfo(registers, arch_to_use); } // query the target of gdb-remote for extended target information returns Index: lldb/source/Target/DynamicRegisterInfo.cpp =================================================================== --- lldb/source/Target/DynamicRegisterInfo.cpp +++ lldb/source/Target/DynamicRegisterInfo.cpp @@ -379,6 +379,45 @@ return m_regs.size(); } +size_t DynamicRegisterInfo::SetRegisterInfo( + const std::vector ®s, + const ArchSpec &arch) { + assert(!m_finalized); + + for (auto it : llvm::enumerate(regs)) { + uint32_t local_regnum = it.index(); + const DynamicRegisterInfo::Register ® = it.value(); + + assert(reg.name); + assert(reg.set_name); + + for (uint32_t value_reg : reg.value_regs) + m_value_regs_map[local_regnum].push_back(value_reg); + for (uint32_t invalidate_reg : reg.invalidate_regs) + m_invalidate_regs_map[local_regnum].push_back(invalidate_reg); + + struct RegisterInfo reg_info { + reg.name.AsCString(), reg.alt_name.AsCString(), reg.byte_size, + reg.byte_offset, reg.encoding, reg.format, + {reg.regnum_ehframe, reg.regnum_dwarf, reg.regnum_generic, + reg.regnum_remote, local_regnum}, + // value_regs and invalidate_regs are filled by Finalize() + nullptr, nullptr + }; + + m_regs.push_back(reg_info); + + uint32_t set = GetRegisterSetIndexByName(reg.set_name, true); + assert(set < m_sets.size()); + assert(set < m_set_reg_nums.size()); + assert(set < m_set_names.size()); + m_set_reg_nums[set].push_back(local_regnum); + }; + + Finalize(arch); + return m_regs.size(); +} + void DynamicRegisterInfo::AddRegister(RegisterInfo reg_info, ConstString &set_name) { assert(!m_finalized); @@ -682,8 +721,9 @@ return nullptr; } -uint32_t DynamicRegisterInfo::GetRegisterSetIndexByName(ConstString &set_name, - bool can_create) { +uint32_t +DynamicRegisterInfo::GetRegisterSetIndexByName(const ConstString &set_name, + bool can_create) { name_collection::iterator pos, end = m_set_names.end(); for (pos = m_set_names.begin(); pos != end; ++pos) { if (*pos == set_name)