[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.
This commit is contained in:
Michael Buch 2024-01-31 17:18:13 +00:00 committed by GitHub
parent 8241106bf3
commit 08c0eb183a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 26 additions and 73 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;