Fix libcxx formatters for changes in r300140.
Summary: LLVM r300140 changed the layout and field names of __compressed_pair, which broke LLDB's std::vector, std::map and std::unsorted_map formatters. This patch attempts to fix these formatters by having them interogate the __compressed_pair values to determine whether they're pre- or post-r300140 variants, then access them accordingly. Reviewers: jingham, EricWF Reviewed By: jingham Differential Revision: https://reviews.llvm.org/D32554 llvm-svn: 301493
This commit is contained in:
parent
1182779917
commit
6cc3354dd6
|
@ -219,6 +219,7 @@ size_t lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::
|
|||
CalculateNumChildren() {
|
||||
static ConstString g___pair3_("__pair3_");
|
||||
static ConstString g___first_("__first_");
|
||||
static ConstString g___value_("__value_");
|
||||
|
||||
if (m_count != UINT32_MAX)
|
||||
return m_count;
|
||||
|
@ -227,7 +228,22 @@ size_t lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::
|
|||
ValueObjectSP m_item(m_tree->GetChildMemberWithName(g___pair3_, true));
|
||||
if (!m_item)
|
||||
return 0;
|
||||
m_item = m_item->GetChildMemberWithName(g___first_, true);
|
||||
|
||||
switch (m_item->GetCompilerType().GetNumDirectBaseClasses()) {
|
||||
case 1:
|
||||
// Assume a pre llvm r300140 __compressed_pair implementation:
|
||||
m_item = m_item->GetChildMemberWithName(g___first_, true);
|
||||
break;
|
||||
case 2: {
|
||||
// Assume a post llvm r300140 __compressed_pair implementation:
|
||||
ValueObjectSP first_elem_parent = m_item->GetChildAtIndex(0, true);
|
||||
m_item = first_elem_parent->GetChildMemberWithName(g___value_, true);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_item)
|
||||
return 0;
|
||||
m_count = m_item->GetValueAsUnsigned(0);
|
||||
|
|
|
@ -94,9 +94,30 @@ lldb::ValueObjectSP lldb_private::formatters::
|
|||
node_sp->GetChildMemberWithName(ConstString("__hash_"), true);
|
||||
if (!hash_sp || !value_sp) {
|
||||
if (!m_element_type) {
|
||||
auto first_sp = m_backend.GetChildAtNamePath({ConstString("__table_"),
|
||||
ConstString("__p1_"),
|
||||
ConstString("__first_")});
|
||||
auto p1_sp = m_backend.GetChildAtNamePath({ConstString("__table_"),
|
||||
ConstString("__p1_")});
|
||||
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(ConstString("__first_"),
|
||||
true);
|
||||
break;
|
||||
case 2: {
|
||||
// Assume a post llvm r300140 __compressed_pair implementation:
|
||||
ValueObjectSP first_elem_parent_sp =
|
||||
p1_sp->GetChildAtIndex(0, true);
|
||||
first_sp = p1_sp->GetChildMemberWithName(ConstString("__value_"),
|
||||
true);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (!first_sp)
|
||||
return nullptr;
|
||||
m_element_type = first_sp->GetCompilerType();
|
||||
|
@ -152,22 +173,39 @@ bool lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::
|
|||
m_backend.GetChildMemberWithName(ConstString("__table_"), true);
|
||||
if (!table_sp)
|
||||
return false;
|
||||
ValueObjectSP num_elements_sp = table_sp->GetChildAtNamePath(
|
||||
{ConstString("__p2_"), ConstString("__first_")});
|
||||
|
||||
ValueObjectSP p2_sp = table_sp->GetChildMemberWithName(
|
||||
ConstString("__p2_"), true);
|
||||
ValueObjectSP num_elements_sp = nullptr;
|
||||
llvm::SmallVector<ConstString, 3> next_path;
|
||||
switch (p2_sp->GetCompilerType().GetNumDirectBaseClasses()) {
|
||||
case 1:
|
||||
// Assume a pre llvm r300140 __compressed_pair implementation:
|
||||
num_elements_sp = p2_sp->GetChildMemberWithName(
|
||||
ConstString("__first_"), true);
|
||||
next_path.append({ConstString("__p1_"), ConstString("__first_"),
|
||||
ConstString("__next_")});
|
||||
break;
|
||||
case 2: {
|
||||
// Assume a post llvm r300140 __compressed_pair implementation:
|
||||
ValueObjectSP first_elem_parent = p2_sp->GetChildAtIndex(0, true);
|
||||
num_elements_sp = first_elem_parent->GetChildMemberWithName(
|
||||
ConstString("__value_"), true);
|
||||
next_path.append({ConstString("__p1_"), ConstString("__value_"),
|
||||
ConstString("__next_")});
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!num_elements_sp)
|
||||
return false;
|
||||
m_num_elements = num_elements_sp->GetValueAsUnsigned(0);
|
||||
m_tree =
|
||||
table_sp
|
||||
->GetChildAtNamePath({ConstString("__p1_"), ConstString("__first_"),
|
||||
ConstString("__next_")})
|
||||
.get();
|
||||
m_tree = table_sp->GetChildAtNamePath(next_path).get();
|
||||
if (m_num_elements > 0)
|
||||
m_next_element =
|
||||
table_sp
|
||||
->GetChildAtNamePath({ConstString("__p1_"), ConstString("__first_"),
|
||||
ConstString("__next_")})
|
||||
.get();
|
||||
table_sp->GetChildAtNamePath(next_path).get();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -127,8 +127,25 @@ bool lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::Update() {
|
|||
m_backend.GetChildMemberWithName(ConstString("__end_cap_"), true));
|
||||
if (!data_type_finder_sp)
|
||||
return false;
|
||||
data_type_finder_sp = data_type_finder_sp->GetChildMemberWithName(
|
||||
|
||||
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(
|
||||
ConstString("__first_"), true);
|
||||
break;
|
||||
case 2: {
|
||||
// Assume a post llvm r300140 __compressed_pair implementation:
|
||||
ValueObjectSP first_elem_parent_sp =
|
||||
data_type_finder_sp->GetChildAtIndex(0, true);
|
||||
data_type_finder_sp = first_elem_parent_sp->GetChildMemberWithName(
|
||||
ConstString("__value_"), true);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!data_type_finder_sp)
|
||||
return false;
|
||||
m_element_type = data_type_finder_sp->GetCompilerType().GetPointeeType();
|
||||
|
|
Loading…
Reference in New Issue