diff options
author | Michael Buch <michaelbuch12@gmail.com> | 2024-01-31 17:18:13 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-31 17:18:13 +0000 |
commit | 08c0eb183a9ca2983d20f5a5f366df44f199d287 (patch) | |
tree | 4b2bce041b0632d81175cf60c47e1d4e072a2e82 /lldb | |
parent | 8241106bf30fa74f27e324ba23c42a3503ab5707 (diff) | |
download | llvm-08c0eb183a9ca2983d20f5a5f366df44f199d287.zip llvm-08c0eb183a9ca2983d20f5a5f366df44f199d287.tar.gz llvm-08c0eb183a9ca2983d20f5a5f366df44f199d287.tar.bz2 |
[lldb][DataFormatter][NFC] Use GetFirstValueOfLibCXXCompressedPair throughout formatters (#80133)
This avoids duplicating the logic to get the first
element of a libc++ `__compressed_pair`. This will
be useful in supporting upcoming changes to the layout
of `__compressed_pair`.
Drive-by changes:
* Renamed `m_item` to `size_node` for readability;
`m_item` suggests it's a member variable, which it
is not.
Diffstat (limited to 'lldb')
3 files changed, 26 insertions, 73 deletions
diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp index 092a412..d3ee63a 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp @@ -213,30 +213,20 @@ size_t lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd:: CalculateNumChildren() { if (m_count != UINT32_MAX) return m_count; + if (m_tree == nullptr) return 0; - ValueObjectSP m_item(m_tree->GetChildMemberWithName("__pair3_")); - if (!m_item) + + ValueObjectSP size_node(m_tree->GetChildMemberWithName("__pair3_")); + if (!size_node) return 0; - switch (m_item->GetCompilerType().GetNumDirectBaseClasses()) { - case 1: - // Assume a pre llvm r300140 __compressed_pair implementation: - m_item = m_item->GetChildMemberWithName("__first_"); - break; - case 2: { - // Assume a post llvm r300140 __compressed_pair implementation: - ValueObjectSP first_elem_parent = m_item->GetChildAtIndex(0); - m_item = first_elem_parent->GetChildMemberWithName("__value_"); - break; - } - default: - return false; - } + size_node = GetFirstValueOfLibCXXCompressedPair(*size_node); - if (!m_item) + if (!size_node) return 0; - m_count = m_item->GetValueAsUnsigned(0); + + m_count = size_node->GetValueAsUnsigned(0); return m_count; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp index ff7043bd..1a85d37 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp @@ -116,25 +116,10 @@ lldb::ValueObjectSP lldb_private::formatters:: if (!p1_sp) return nullptr; - ValueObjectSP first_sp = nullptr; - switch (p1_sp->GetCompilerType().GetNumDirectBaseClasses()) { - case 1: - // Assume a pre llvm r300140 __compressed_pair implementation: - first_sp = p1_sp->GetChildMemberWithName("__first_"); - break; - case 2: { - // Assume a post llvm r300140 __compressed_pair implementation: - ValueObjectSP first_elem_parent_sp = - p1_sp->GetChildAtIndex(0); - first_sp = p1_sp->GetChildMemberWithName("__value_"); - break; - } - default: - return nullptr; - } - + ValueObjectSP first_sp = GetFirstValueOfLibCXXCompressedPair(*p1_sp); if (!first_sp) return nullptr; + m_element_type = first_sp->GetCompilerType(); m_element_type = m_element_type.GetTypeTemplateArgument(0); m_element_type = m_element_type.GetPointeeType(); @@ -218,37 +203,30 @@ bool lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd:: return false; ValueObjectSP p2_sp = table_sp->GetChildMemberWithName("__p2_"); - ValueObjectSP num_elements_sp = nullptr; - llvm::SmallVector<llvm::StringRef, 3> next_path; - switch (p2_sp->GetCompilerType().GetNumDirectBaseClasses()) { - case 1: - // Assume a pre llvm r300140 __compressed_pair implementation: - num_elements_sp = p2_sp->GetChildMemberWithName("__first_"); - next_path.append({"__p1_", "__first_", "__next_"}); - break; - case 2: { - // Assume a post llvm r300140 __compressed_pair implementation: - ValueObjectSP first_elem_parent = p2_sp->GetChildAtIndex(0); - num_elements_sp = first_elem_parent->GetChildMemberWithName("__value_"); - next_path.append({"__p1_", "__value_", "__next_"}); - break; - } - default: + if (!p2_sp) return false; - } + ValueObjectSP num_elements_sp = GetFirstValueOfLibCXXCompressedPair(*p2_sp); if (!num_elements_sp) return false; - m_tree = table_sp->GetChildAtNamePath(next_path).get(); + ValueObjectSP p1_sp = table_sp->GetChildMemberWithName("__p1_"); + if (!p1_sp) + return false; + + ValueObjectSP value_sp = GetFirstValueOfLibCXXCompressedPair(*p1_sp); + if (!value_sp) + return false; + + m_tree = value_sp->GetChildMemberWithName("__next_").get(); if (m_tree == nullptr) return false; m_num_elements = num_elements_sp->GetValueAsUnsigned(0); if (m_num_elements > 0) - m_next_element = - table_sp->GetChildAtNamePath(next_path).get(); + m_next_element = m_tree; + return false; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp index db7cc5b..9d88fcf 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp @@ -123,26 +123,11 @@ bool lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::Update() { if (!data_type_finder_sp) return false; - switch (data_type_finder_sp->GetCompilerType().GetNumDirectBaseClasses()) { - case 1: - // Assume a pre llvm r300140 __compressed_pair implementation: - data_type_finder_sp = - data_type_finder_sp->GetChildMemberWithName("__first_"); - break; - case 2: { - // Assume a post llvm r300140 __compressed_pair implementation: - ValueObjectSP first_elem_parent_sp = - data_type_finder_sp->GetChildAtIndex(0); - data_type_finder_sp = - first_elem_parent_sp->GetChildMemberWithName("__value_"); - break; - } - default: - return false; - } - + data_type_finder_sp = + GetFirstValueOfLibCXXCompressedPair(*data_type_finder_sp); if (!data_type_finder_sp) return false; + m_element_type = data_type_finder_sp->GetCompilerType().GetPointeeType(); if (std::optional<uint64_t> size = m_element_type.GetByteSize(nullptr)) { m_element_size = *size; |