aboutsummaryrefslogtreecommitdiff
path: root/lldb/source
diff options
context:
space:
mode:
authorAdrian Prantl <aprantl@apple.com>2022-09-09 15:58:14 -0700
committerAdrian Prantl <aprantl@apple.com>2022-09-09 15:58:55 -0700
commit2f4a66eed68804929efa1ad3c10fc040a67fb3ff (patch)
treefa6a892a172af2b3c9e82edcc3512c098efff011 /lldb/source
parent058f17d3afdf77474936b78a3611fe897f9890f8 (diff)
downloadllvm-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')
-rw-r--r--lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp29
-rw-r--r--lldb/source/Plugins/Language/CPlusPlus/LibCxx.h5
-rw-r--r--lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp10
-rw-r--r--lldb/source/Plugins/Language/CPlusPlus/LibCxxSpan.cpp8
-rw-r--r--lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.cpp27
-rw-r--r--lldb/source/Plugins/Language/CPlusPlus/LibCxxVariant.h3
-rw-r--r--lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp17
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)