Index: lldb/include/lldb/Target/DynamicRegisterInfo.h =================================================================== --- lldb/include/lldb/Target/DynamicRegisterInfo.h +++ lldb/include/lldb/Target/DynamicRegisterInfo.h @@ -56,11 +56,6 @@ size_t SetRegisterInfo(const std::vector ®s, const lldb_private::ArchSpec &arch); - void AddRegister(lldb_private::RegisterInfo reg_info, - lldb_private::ConstString &set_name); - - void Finalize(const lldb_private::ArchSpec &arch); - size_t GetNumRegisters() const; size_t GetNumRegisterSets() const; @@ -114,6 +109,8 @@ void MoveFrom(DynamicRegisterInfo &&info); + void Finalize(const lldb_private::ArchSpec &arch); + void ConfigureOffsets(); reg_collection m_regs; Index: lldb/source/Target/DynamicRegisterInfo.cpp =================================================================== --- lldb/source/Target/DynamicRegisterInfo.cpp +++ lldb/source/Target/DynamicRegisterInfo.cpp @@ -418,35 +418,6 @@ return m_regs.size(); } -void DynamicRegisterInfo::AddRegister(RegisterInfo reg_info, - ConstString &set_name) { - assert(!m_finalized); - const uint32_t reg_num = m_regs.size(); - assert(reg_info.name); - uint32_t i; - if (reg_info.value_regs) { - for (i = 0; reg_info.value_regs[i] != LLDB_INVALID_REGNUM; ++i) - m_value_regs_map[reg_num].push_back(reg_info.value_regs[i]); - - // invalidate until Finalize() is called - reg_info.value_regs = nullptr; - } - if (reg_info.invalidate_regs) { - for (i = 0; reg_info.invalidate_regs[i] != LLDB_INVALID_REGNUM; ++i) - m_invalidate_regs_map[reg_num].push_back(reg_info.invalidate_regs[i]); - - // invalidate until Finalize() is called - reg_info.invalidate_regs = nullptr; - } - - m_regs.push_back(reg_info); - uint32_t set = GetRegisterSetIndexByName(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(reg_num); -} - void DynamicRegisterInfo::Finalize(const ArchSpec &arch) { if (m_finalized) return; Index: lldb/unittests/Target/DynamicRegisterInfoTest.cpp =================================================================== --- lldb/unittests/Target/DynamicRegisterInfoTest.cpp +++ lldb/unittests/Target/DynamicRegisterInfoTest.cpp @@ -25,108 +25,6 @@ return ret; } -class DynamicRegisterInfoTest : public ::testing::Test { -protected: - DynamicRegisterInfo info; - uint32_t next_regnum = 0; - ConstString group{"group"}; - - uint32_t AddTestRegister(const char *name, uint32_t byte_size, - std::vector value_regs = {}, - std::vector invalidate_regs = {}) { - struct RegisterInfo new_reg { - name, nullptr, byte_size, LLDB_INVALID_INDEX32, lldb::eEncodingUint, - lldb::eFormatUnsigned, - {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, - next_regnum, next_regnum}, - nullptr, nullptr - }; - - if (!value_regs.empty()) { - value_regs.push_back(LLDB_INVALID_REGNUM); - new_reg.value_regs = value_regs.data(); - } - if (!invalidate_regs.empty()) { - invalidate_regs.push_back(LLDB_INVALID_REGNUM); - new_reg.invalidate_regs = invalidate_regs.data(); - } - - info.AddRegister(new_reg, group); - return next_regnum++; - } - - void AssertRegisterInfo(uint32_t reg_num, const char *reg_name, - uint32_t byte_offset, - std::vector value_regs = {}, - std::vector invalidate_regs = {}) { - const RegisterInfo *reg = info.GetRegisterInfoAtIndex(reg_num); - EXPECT_NE(reg, nullptr); - if (!reg) - return; - - EXPECT_STREQ(reg->name, reg_name); - EXPECT_EQ(reg->byte_offset, byte_offset); - EXPECT_THAT(regs_to_vector(reg->value_regs), value_regs); - EXPECT_THAT(regs_to_vector(reg->invalidate_regs), invalidate_regs); - } -}; - -#define ASSERT_REG(reg, ...) \ - { \ - SCOPED_TRACE("at register " #reg); \ - AssertRegisterInfo(reg, #reg, __VA_ARGS__); \ - } - -TEST_F(DynamicRegisterInfoTest, finalize_regs) { - // Add regular registers - uint32_t b1 = AddTestRegister("b1", 8); - uint32_t b2 = AddTestRegister("b2", 8); - - // Add a few sub-registers - uint32_t s1 = AddTestRegister("s1", 4, {b1}); - uint32_t s2 = AddTestRegister("s2", 4, {b2}); - - // Add a register with invalidate_regs - uint32_t i1 = AddTestRegister("i1", 8, {}, {b1}); - - // Add a register with indirect invalidate regs to be expanded - // TODO: why is it done conditionally to value_regs? - uint32_t i2 = AddTestRegister("i2", 4, {b2}, {i1}); - - info.Finalize(lldb_private::ArchSpec()); - - ASSERT_REG(b1, 0); - ASSERT_REG(b2, 8); - ASSERT_REG(s1, 0, {b1}); - ASSERT_REG(s2, 8, {b2}); - ASSERT_REG(i1, 16, {}, {b1}); - ASSERT_REG(i2, 8, {b2}, {b1, i1}); -} - -TEST_F(DynamicRegisterInfoTest, no_finalize_regs) { - // Add regular registers - uint32_t b1 = AddTestRegister("b1", 8); - uint32_t b2 = AddTestRegister("b2", 8); - - // Add a few sub-registers - uint32_t s1 = AddTestRegister("s1", 4, {b1}); - uint32_t s2 = AddTestRegister("s2", 4, {b2}); - - // Add a register with invalidate_regs - uint32_t i1 = AddTestRegister("i1", 8, {}, {b1}); - - // Add a register with indirect invalidate regs to be expanded - // TODO: why is it done conditionally to value_regs? - uint32_t i2 = AddTestRegister("i2", 4, {b2}, {i1}); - - ASSERT_REG(b1, LLDB_INVALID_INDEX32); - ASSERT_REG(b2, LLDB_INVALID_INDEX32); - ASSERT_REG(s1, LLDB_INVALID_INDEX32); - ASSERT_REG(s2, LLDB_INVALID_INDEX32); - ASSERT_REG(i1, LLDB_INVALID_INDEX32); - ASSERT_REG(i2, LLDB_INVALID_INDEX32); -} - class DynamicRegisterInfoRegisterTest : public ::testing::Test { protected: std::vector m_regs; @@ -184,6 +82,12 @@ } }; +#define ASSERT_REG(reg, ...) \ + { \ + SCOPED_TRACE("at register " #reg); \ + AssertRegisterInfo(reg, #reg, __VA_ARGS__); \ + } + TEST_F(DynamicRegisterInfoRegisterTest, addSupplementaryRegister) { // Add a base register uint32_t rax = AddTestRegister(