Skip to content

Commit b9993fc

Browse files
committed
DynamicRegisterInfo calculate offsets in separate function
This patch pull offset calculation logic out of DynamicRegisterInfo::Finalize into a separate function. We are going to call this function whenever we update SVE register sizes. Reviewed By: labath Differential Revision: https://reviews.llvm.org/D94008
1 parent 4fd7766 commit b9993fc

File tree

2 files changed

+53
-38
lines changed

2 files changed

+53
-38
lines changed

lldb/source/Plugins/Process/Utility/DynamicRegisterInfo.cpp

Lines changed: 51 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -442,28 +442,6 @@ void DynamicRegisterInfo::Finalize(const ArchSpec &arch) {
442442
m_sets[set].registers = m_set_reg_nums[set].data();
443443
}
444444

445-
// We are going to create a map between remote (eRegisterKindProcessPlugin)
446-
// and local (eRegisterKindLLDB) register numbers. This map will give us
447-
// remote register numbers in increasing order for offset calculation.
448-
std::map<uint32_t, uint32_t> remote_to_local_regnum_map;
449-
for (const auto &reg : m_regs)
450-
remote_to_local_regnum_map[reg.kinds[eRegisterKindProcessPlugin]] =
451-
reg.kinds[eRegisterKindLLDB];
452-
453-
// At this stage we manually calculate g/G packet offsets of all primary
454-
// registers, only if target XML or qRegisterInfo packet did not send
455-
// an offset explicitly.
456-
uint32_t reg_offset = 0;
457-
for (auto const &regnum_pair : remote_to_local_regnum_map) {
458-
if (m_regs[regnum_pair.second].byte_offset == LLDB_INVALID_INDEX32 &&
459-
m_regs[regnum_pair.second].value_regs == nullptr) {
460-
m_regs[regnum_pair.second].byte_offset = reg_offset;
461-
462-
reg_offset = m_regs[regnum_pair.second].byte_offset +
463-
m_regs[regnum_pair.second].byte_size;
464-
}
465-
}
466-
467445
// sort and unique all value registers and make sure each is terminated with
468446
// LLDB_INVALID_REGNUM
469447

@@ -485,24 +463,10 @@ void DynamicRegisterInfo::Finalize(const ArchSpec &arch) {
485463
// Now update all value_regs with each register info as needed
486464
const size_t num_regs = m_regs.size();
487465
for (size_t i = 0; i < num_regs; ++i) {
488-
if (m_value_regs_map.find(i) != m_value_regs_map.end()) {
466+
if (m_value_regs_map.find(i) != m_value_regs_map.end())
489467
m_regs[i].value_regs = m_value_regs_map[i].data();
490-
// Assign a valid offset to all pseudo registers if not assigned by stub.
491-
// Pseudo registers with value_regs list populated will share same offset
492-
// as that of their corresponding primary register in value_regs list.
493-
if (m_regs[i].byte_offset == LLDB_INVALID_INDEX32) {
494-
uint32_t value_regnum = m_regs[i].value_regs[0];
495-
if (value_regnum != LLDB_INVALID_INDEX32)
496-
m_regs[i].byte_offset =
497-
GetRegisterInfoAtIndex(remote_to_local_regnum_map[value_regnum])
498-
->byte_offset;
499-
}
500-
} else
468+
else
501469
m_regs[i].value_regs = nullptr;
502-
503-
reg_offset = m_regs[i].byte_offset + m_regs[i].byte_size;
504-
if (m_reg_data_byte_size < reg_offset)
505-
m_reg_data_byte_size = reg_offset;
506470
}
507471

508472
// Expand all invalidation dependencies
@@ -648,6 +612,55 @@ void DynamicRegisterInfo::Finalize(const ArchSpec &arch) {
648612
break;
649613
}
650614
}
615+
616+
// At this stage call ConfigureOffsets to calculate register offsets for
617+
// targets supporting dynamic offset calculation. It also calculates
618+
// total byte size of register data.
619+
ConfigureOffsets();
620+
}
621+
622+
void DynamicRegisterInfo::ConfigureOffsets() {
623+
// We are going to create a map between remote (eRegisterKindProcessPlugin)
624+
// and local (eRegisterKindLLDB) register numbers. This map will give us
625+
// remote register numbers in increasing order for offset calculation.
626+
std::map<uint32_t, uint32_t> remote_to_local_regnum_map;
627+
for (const auto &reg : m_regs)
628+
remote_to_local_regnum_map[reg.kinds[eRegisterKindProcessPlugin]] =
629+
reg.kinds[eRegisterKindLLDB];
630+
631+
// At this stage we manually calculate g/G packet offsets of all primary
632+
// registers, only if target XML or qRegisterInfo packet did not send
633+
// an offset explicitly.
634+
uint32_t reg_offset = 0;
635+
for (auto const &regnum_pair : remote_to_local_regnum_map) {
636+
if (m_regs[regnum_pair.second].byte_offset == LLDB_INVALID_INDEX32 &&
637+
m_regs[regnum_pair.second].value_regs == nullptr) {
638+
m_regs[regnum_pair.second].byte_offset = reg_offset;
639+
640+
reg_offset = m_regs[regnum_pair.second].byte_offset +
641+
m_regs[regnum_pair.second].byte_size;
642+
}
643+
}
644+
645+
// Now update all value_regs with each register info as needed
646+
for (auto &reg : m_regs) {
647+
if (reg.value_regs != nullptr) {
648+
// Assign a valid offset to all pseudo registers if not assigned by stub.
649+
// Pseudo registers with value_regs list populated will share same offset
650+
// as that of their corresponding primary register in value_regs list.
651+
if (reg.byte_offset == LLDB_INVALID_INDEX32) {
652+
uint32_t value_regnum = reg.value_regs[0];
653+
if (value_regnum != LLDB_INVALID_INDEX32)
654+
reg.byte_offset =
655+
GetRegisterInfoAtIndex(remote_to_local_regnum_map[value_regnum])
656+
->byte_offset;
657+
}
658+
}
659+
660+
reg_offset = reg.byte_offset + reg.byte_size;
661+
if (m_reg_data_byte_size < reg_offset)
662+
m_reg_data_byte_size = reg_offset;
663+
}
651664
}
652665

653666
bool DynamicRegisterInfo::IsReconfigurable() { return m_is_reconfigurable; }

lldb/source/Plugins/Process/Utility/DynamicRegisterInfo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ class DynamicRegisterInfo {
8282

8383
void MoveFrom(DynamicRegisterInfo &&info);
8484

85+
void ConfigureOffsets();
86+
8587
reg_collection m_regs;
8688
set_collection m_sets;
8789
set_reg_num_collection m_set_reg_nums;

0 commit comments

Comments
 (0)