Skip to content

Commit da7c51b

Browse files
committed
[lldb][DataFormatter][NFC] Use GetFirstValueOfLibCXXCompressedPair throughout formatters
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.
1 parent 0129ff1 commit da7c51b

File tree

3 files changed

+22
-73
lines changed

3 files changed

+22
-73
lines changed

lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -213,30 +213,20 @@ size_t lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::
213213
CalculateNumChildren() {
214214
if (m_count != UINT32_MAX)
215215
return m_count;
216+
216217
if (m_tree == nullptr)
217218
return 0;
218-
ValueObjectSP m_item(m_tree->GetChildMemberWithName("__pair3_"));
219-
if (!m_item)
219+
220+
ValueObjectSP size_node(m_tree->GetChildMemberWithName("__pair3_"));
221+
if (!size_node)
220222
return 0;
221223

222-
switch (m_item->GetCompilerType().GetNumDirectBaseClasses()) {
223-
case 1:
224-
// Assume a pre llvm r300140 __compressed_pair implementation:
225-
m_item = m_item->GetChildMemberWithName("__first_");
226-
break;
227-
case 2: {
228-
// Assume a post llvm r300140 __compressed_pair implementation:
229-
ValueObjectSP first_elem_parent = m_item->GetChildAtIndex(0);
230-
m_item = first_elem_parent->GetChildMemberWithName("__value_");
231-
break;
232-
}
233-
default:
234-
return false;
235-
}
224+
size_node = GetFirstValueOfLibCXXCompressedPair(*size_node);
236225

237-
if (!m_item)
226+
if (!size_node)
238227
return 0;
239-
m_count = m_item->GetValueAsUnsigned(0);
228+
229+
m_count = size_node->GetValueAsUnsigned(0);
240230
return m_count;
241231
}
242232

lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp

Lines changed: 11 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -116,25 +116,10 @@ lldb::ValueObjectSP lldb_private::formatters::
116116
if (!p1_sp)
117117
return nullptr;
118118

119-
ValueObjectSP first_sp = nullptr;
120-
switch (p1_sp->GetCompilerType().GetNumDirectBaseClasses()) {
121-
case 1:
122-
// Assume a pre llvm r300140 __compressed_pair implementation:
123-
first_sp = p1_sp->GetChildMemberWithName("__first_");
124-
break;
125-
case 2: {
126-
// Assume a post llvm r300140 __compressed_pair implementation:
127-
ValueObjectSP first_elem_parent_sp =
128-
p1_sp->GetChildAtIndex(0);
129-
first_sp = p1_sp->GetChildMemberWithName("__value_");
130-
break;
131-
}
132-
default:
133-
return nullptr;
134-
}
135-
119+
ValueObjectSP first_sp = GetFirstValueOfLibCXXCompressedPair(*p1_sp);
136120
if (!first_sp)
137121
return nullptr;
122+
138123
m_element_type = first_sp->GetCompilerType();
139124
m_element_type = m_element_type.GetTypeTemplateArgument(0);
140125
m_element_type = m_element_type.GetPointeeType();
@@ -218,37 +203,26 @@ bool lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::
218203
return false;
219204

220205
ValueObjectSP p2_sp = table_sp->GetChildMemberWithName("__p2_");
221-
ValueObjectSP num_elements_sp = nullptr;
222-
llvm::SmallVector<llvm::StringRef, 3> next_path;
223-
switch (p2_sp->GetCompilerType().GetNumDirectBaseClasses()) {
224-
case 1:
225-
// Assume a pre llvm r300140 __compressed_pair implementation:
226-
num_elements_sp = p2_sp->GetChildMemberWithName("__first_");
227-
next_path.append({"__p1_", "__first_", "__next_"});
228-
break;
229-
case 2: {
230-
// Assume a post llvm r300140 __compressed_pair implementation:
231-
ValueObjectSP first_elem_parent = p2_sp->GetChildAtIndex(0);
232-
num_elements_sp = first_elem_parent->GetChildMemberWithName("__value_");
233-
next_path.append({"__p1_", "__value_", "__next_"});
234-
break;
235-
}
236-
default:
206+
if (!p2_sp)
237207
return false;
238-
}
239208

209+
ValueObjectSP num_elements_sp = GetFirstValueOfLibCXXCompressedPair(*p2_sp);
240210
if (!num_elements_sp)
241211
return false;
242212

243-
m_tree = table_sp->GetChildAtNamePath(next_path).get();
213+
ValueObjectSP p1_sp = table_sp->GetChildMemberWithName("__p1_");
214+
if (!p1_sp)
215+
return false;
216+
217+
m_tree = GetFirstValueOfLibCXXCompressedPair(*p1_sp).get();
244218
if (m_tree == nullptr)
245219
return false;
246220

247221
m_num_elements = num_elements_sp->GetValueAsUnsigned(0);
248222

249223
if (m_num_elements > 0)
250-
m_next_element =
251-
table_sp->GetChildAtNamePath(next_path).get();
224+
m_next_element = m_tree;
225+
252226
return false;
253227
}
254228

lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "lldb/Core/ValueObject.h"
1212
#include "lldb/DataFormatters/FormattersHelpers.h"
1313
#include "lldb/Utility/ConstString.h"
14+
#include <iterator>
1415
#include <optional>
1516

1617
using namespace lldb;
@@ -123,26 +124,10 @@ bool lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::Update() {
123124
if (!data_type_finder_sp)
124125
return false;
125126

126-
switch (data_type_finder_sp->GetCompilerType().GetNumDirectBaseClasses()) {
127-
case 1:
128-
// Assume a pre llvm r300140 __compressed_pair implementation:
129-
data_type_finder_sp =
130-
data_type_finder_sp->GetChildMemberWithName("__first_");
131-
break;
132-
case 2: {
133-
// Assume a post llvm r300140 __compressed_pair implementation:
134-
ValueObjectSP first_elem_parent_sp =
135-
data_type_finder_sp->GetChildAtIndex(0);
136-
data_type_finder_sp =
137-
first_elem_parent_sp->GetChildMemberWithName("__value_");
138-
break;
139-
}
140-
default:
141-
return false;
142-
}
143-
127+
data_type_finder_sp = GetFirstValueOfLibCXXCompressedPair(*data_type_finder_sp);
144128
if (!data_type_finder_sp)
145129
return false;
130+
146131
m_element_type = data_type_finder_sp->GetCompilerType().GetPointeeType();
147132
if (std::optional<uint64_t> size = m_element_type.GetByteSize(nullptr)) {
148133
m_element_size = *size;

0 commit comments

Comments
 (0)