diff options
author | Adrian Prantl <aprantl@apple.com> | 2022-09-09 15:58:14 -0700 |
---|---|---|
committer | Adrian Prantl <aprantl@apple.com> | 2022-09-09 15:58:55 -0700 |
commit | 2f4a66eed68804929efa1ad3c10fc040a67fb3ff (patch) | |
tree | fa6a892a172af2b3c9e82edcc3512c098efff011 /lldb/source | |
parent | 058f17d3afdf77474936b78a3611fe897f9890f8 (diff) | |
download | llvm-2f4a66eed68804929efa1ad3c10fc040a67fb3ff.zip llvm-2f4a66eed68804929efa1ad3c10fc040a67fb3ff.tar.gz llvm-2f4a66eed68804929efa1ad3c10fc040a67fb3ff.tar.bz2 |
Adapt LLDB dataformatters for libcxx change D129386
Differential Revision: https://reviews.llvm.org/D133618
Diffstat (limited to 'lldb/source')
7 files changed, 57 insertions, 42 deletions
diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp index 3b04b3a..2480dbf 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp @@ -34,6 +34,17 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; +lldb::ValueObjectSP lldb_private::formatters::GetChildMemberWithName( + ValueObject &obj, llvm::ArrayRef<ConstString> alternative_names) { + for (ConstString name : alternative_names) { + lldb::ValueObjectSP child_sp = obj.GetChildMemberWithName(name, true); + + if (child_sp) + return child_sp; + } + return {}; +} + bool lldb_private::formatters::LibcxxOptionalSummaryProvider( ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { ValueObjectSP valobj_sp(valobj.GetNonSyntheticValue()); @@ -538,12 +549,9 @@ lldb_private::formatters::LibCxxUnorderedMapIteratorSyntheticFrontEndCreator( SyntheticChildrenFrontEnd * lldb_private::formatters::LibCxxVectorIteratorSyntheticFrontEndCreator( CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { - static ConstString g_item_name; - if (!g_item_name) - g_item_name.SetCString("__i"); - return (valobj_sp - ? new VectorIteratorSyntheticFrontEnd(valobj_sp, g_item_name) - : nullptr); + return (valobj_sp ? new VectorIteratorSyntheticFrontEnd( + valobj_sp, {ConstString("__i_"), ConstString("__i")}) + : nullptr); } lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd:: @@ -992,11 +1000,10 @@ bool lldb_private::formatters::LibcxxStringSummaryProviderUTF32( static std::tuple<bool, ValueObjectSP, size_t> LibcxxExtractStringViewData(ValueObject& valobj) { - ConstString g_data_name("__data"); - ConstString g_size_name("__size"); - auto dataobj = valobj.GetChildMemberWithName(g_data_name, true); - auto sizeobj = valobj.GetChildMemberWithName(g_size_name, true); - + auto dataobj = GetChildMemberWithName( + valobj, {ConstString("__data_"), ConstString("__data")}); + auto sizeobj = GetChildMemberWithName( + valobj, {ConstString("__size_"), ConstString("__size")}); if (!dataobj || !sizeobj) return std::make_tuple<bool,ValueObjectSP,size_t>(false, {}, {}); diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h index b5ade4a..96b4c10 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h @@ -18,6 +18,11 @@ namespace lldb_private { namespace formatters { +/// Find a child member of \c obj_sp, trying all alternative names in order. +lldb::ValueObjectSP +GetChildMemberWithName(ValueObject &obj, + llvm::ArrayRef<ConstString> alternative_names); + bool LibcxxStringSummaryProviderASCII( ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options); // libc++ std::string diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp index ca6f92d..04033df 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp @@ -328,7 +328,7 @@ void lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetValueOffset( lldb::ValueObjectSP lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetChildAtIndex( size_t idx) { - static ConstString g_cc("__cc"); + static ConstString g_cc_("__cc_"), g_cc("__cc"); static ConstString g_nc("__nc"); static ConstString g_value_("__value_"); @@ -414,15 +414,17 @@ lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetChildAtIndex( switch (potential_child_sp->GetNumChildren()) { case 1: { auto child0_sp = potential_child_sp->GetChildAtIndex(0, true); - if (child0_sp && child0_sp->GetName() == g_cc) + if (child0_sp && + (child0_sp->GetName() == g_cc_ || child0_sp->GetName() == g_cc)) potential_child_sp = child0_sp->Clone(ConstString(name.GetString())); break; } case 2: { auto child0_sp = potential_child_sp->GetChildAtIndex(0, true); auto child1_sp = potential_child_sp->GetChildAtIndex(1, true); - if (child0_sp && child0_sp->GetName() == g_cc && child1_sp && - child1_sp->GetName() == g_nc) + if (child0_sp && + (child0_sp->GetName() == g_cc_ || child0_sp->GetName() == g_cc) && + child1_sp && child1_sp->GetName() == g_nc) potential_child_sp = child0_sp->Clone(ConstString(name.GetString())); break; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxSpan.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxSpan.cpp index 0379ba2..8cd035c 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxSpan.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxSpan.cpp @@ -94,8 +94,8 @@ lldb_private::formatters::LibcxxStdSpanSyntheticFrontEnd::GetChildAtIndex( bool lldb_private::formatters::LibcxxStdSpanSyntheticFrontEnd::Update() { // Get element type. - ValueObjectSP data_type_finder_sp( - m_backend.GetChildMemberWithName(ConstString("__data"), true)); + ValueObjectSP data_type_finder_sp = GetChildMemberWithName( + m_backend, {ConstString("__data_"), ConstString("__data")}); if (!data_type_finder_sp) return false; @@ -111,8 +111,8 @@ bool lldb_private::formatters::LibcxxStdSpanSyntheticFrontEnd::Update() { } // Get number of elements. - if (auto size_sp = - m_backend.GetChildMemberWithName(ConstString("__size"), true)) { + if (auto size_sp = GetChildMemberWithName( + m_backend, {ConstString("__size_"), ConstString("__size")})) { m_num_elements = size_sp->GetValueAsUnsigned(0); } else if (auto arg = m_backend.GetCompilerType().GetIntegralTemplateArgument(1)) { diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.cpp index 951bf28..8f90c568 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "LibCxxVariant.h" +#include "LibCxx.h" #include "lldb/DataFormatters/FormattersHelpers.h" #include "llvm/ADT/Optional.h" @@ -121,8 +122,8 @@ bool LibcxxVariantSummaryProvider(ValueObject &valobj, Stream &stream, if (!valobj_sp) return false; - ValueObjectSP impl_sp( - valobj_sp->GetChildMemberWithName(ConstString("__impl"), true)); + ValueObjectSP impl_sp = GetChildMemberWithName( + *valobj_sp, {ConstString("__impl_"), ConstString("__impl")}); if (!impl_sp) return false; @@ -189,8 +190,8 @@ private: bool VariantFrontEnd::Update() { m_size = 0; - ValueObjectSP impl_sp( - m_backend.GetChildMemberWithName(ConstString("__impl"), true)); + ValueObjectSP impl_sp = formatters::GetChildMemberWithName( + m_backend, {ConstString("__impl_"), ConstString("__impl")}); if (!impl_sp) return false; @@ -209,38 +210,40 @@ bool VariantFrontEnd::Update() { ValueObjectSP VariantFrontEnd::GetChildAtIndex(size_t idx) { if (idx >= m_size) - return ValueObjectSP(); + return {}; - ValueObjectSP impl_sp( - m_backend.GetChildMemberWithName(ConstString("__impl"), true)); + ValueObjectSP impl_sp = formatters::GetChildMemberWithName( + m_backend, {ConstString("__impl_"), ConstString("__impl")}); + if (!impl_sp) + return {}; auto optional_index_value = LibcxxVariantIndexValue(impl_sp); if (!optional_index_value) - return ValueObjectSP(); + return {}; uint64_t index_value = *optional_index_value; ValueObjectSP nth_head = LibcxxVariantGetNthHead(impl_sp, index_value); if (!nth_head) - return ValueObjectSP(); + return {}; CompilerType head_type = nth_head->GetCompilerType(); if (!head_type) - return ValueObjectSP(); + return {}; CompilerType template_type = head_type.GetTypeTemplateArgument(1); if (!template_type) - return ValueObjectSP(); + return {}; ValueObjectSP head_value( nth_head->GetChildMemberWithName(ConstString("__value"), true)); if (!head_value) - return ValueObjectSP(); + return {}; return head_value->Clone(ConstString("Value")); } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.h b/lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.h index b4c27cc..9488d94 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.h +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.h @@ -1,5 +1,4 @@ -//===-- LibCxxVariant.h -------------------------------------------*- C++ -//-*-===// +//===-- LibCxxVariant.h ----------------------------------------*- C++ -*--===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp index d862364..6aa80f4 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "LibStdcpp.h" +#include "LibCxx.h" #include "Plugins/TypeSystem/Clang/TypeSystemClang.h" #include "lldb/Core/ValueObject.h" @@ -169,19 +170,16 @@ lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEndCreator( SyntheticChildrenFrontEnd * lldb_private::formatters::LibStdcppVectorIteratorSyntheticFrontEndCreator( CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { - static ConstString g_item_name; - if (!g_item_name) - g_item_name.SetCString("_M_current"); - return (valobj_sp - ? new VectorIteratorSyntheticFrontEnd(valobj_sp, g_item_name) - : nullptr); + return (valobj_sp ? new VectorIteratorSyntheticFrontEnd( + valobj_sp, {ConstString("_M_current")}) + : nullptr); } lldb_private::formatters::VectorIteratorSyntheticFrontEnd:: VectorIteratorSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp, - ConstString item_name) + llvm::ArrayRef<ConstString> item_names) : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), - m_item_name(item_name), m_item_sp() { + m_item_names(item_names), m_item_sp() { if (valobj_sp) Update(); } @@ -196,7 +194,8 @@ bool VectorIteratorSyntheticFrontEnd::Update() { if (!valobj_sp) return false; - ValueObjectSP item_ptr(valobj_sp->GetChildMemberWithName(m_item_name, true)); + ValueObjectSP item_ptr = + formatters::GetChildMemberWithName(*valobj_sp, m_item_names); if (!item_ptr) return false; if (item_ptr->GetValueAsUnsigned(0) == 0) |