https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/147340
>From dba291d4b0b5ac6e62cfc084340cc0524d15d51c Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Mon, 7 Jul 2025 14:45:59 +0100 Subject: [PATCH 1/2] [lldb][Formatters] Consistently unwrap pointer element_type in std::shared_ptr formatters --- .../lldb/DataFormatters/FormattersHelpers.h | 5 +++++ lldb/source/DataFormatters/FormattersHelpers.cpp | 13 +++++++++++++ lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp | 14 +++++++------- .../Plugins/Language/CPlusPlus/LibStdcpp.cpp | 12 ++++++------ .../shared_ptr/TestDataFormatterStdSharedPtr.py | 4 ++++ 5 files changed, 35 insertions(+), 13 deletions(-) diff --git a/lldb/include/lldb/DataFormatters/FormattersHelpers.h b/lldb/include/lldb/DataFormatters/FormattersHelpers.h index 6a47cf37eac64..c7ce199452e1d 100644 --- a/lldb/include/lldb/DataFormatters/FormattersHelpers.h +++ b/lldb/include/lldb/DataFormatters/FormattersHelpers.h @@ -63,6 +63,11 @@ void DumpCxxSmartPtrPointerSummary(Stream &stream, ValueObject &ptr, bool ContainerSizeSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); +/// Return the ValueObjectSP of the underlying pointer member whose type +/// is a desugared 'std::shared_ptr::element_type *'. +lldb::ValueObjectSP GetCxxSmartPtrElementPointerType(ValueObject &ptr, + ValueObject &container); + Address GetArrayAddressOrPointerValue(ValueObject &valobj); time_t GetOSXEpoch(); diff --git a/lldb/source/DataFormatters/FormattersHelpers.cpp b/lldb/source/DataFormatters/FormattersHelpers.cpp index 028fc5da73dc0..104c2ce6f1c0a 100644 --- a/lldb/source/DataFormatters/FormattersHelpers.cpp +++ b/lldb/source/DataFormatters/FormattersHelpers.cpp @@ -151,3 +151,16 @@ bool lldb_private::formatters::ContainerSizeSummaryProvider( return FormatEntity::FormatStringRef("size=${svar%#}", stream, nullptr, nullptr, nullptr, &valobj, false, false); } + +ValueObjectSP lldb_private::formatters::GetCxxSmartPtrElementPointerType( + ValueObject &ptr, ValueObject &container) { + auto container_type = container.GetCompilerType().GetNonReferenceType(); + if (!container_type) + return nullptr; + + auto arg = container_type.GetTypeTemplateArgument(0); + if (!arg) + return nullptr; + + return ptr.Cast(arg.GetPointerType()); +} diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp index 3079de4936a85..f73a77836034f 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp @@ -264,11 +264,7 @@ lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::GetChildAtIndex( if (idx == 1) { Status status; - auto value_type_sp = valobj_sp->GetCompilerType() - .GetTypeTemplateArgument(0) - .GetPointerType(); - ValueObjectSP cast_ptr_sp = m_ptr_obj->Cast(value_type_sp); - ValueObjectSP value_sp = cast_ptr_sp->Dereference(status); + ValueObjectSP value_sp = m_ptr_obj->Dereference(status); if (status.Success()) return value_sp; } @@ -293,7 +289,11 @@ lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::Update() { if (!ptr_obj_sp) return lldb::ChildCacheState::eRefetch; - m_ptr_obj = ptr_obj_sp->Clone(ConstString("pointer")).get(); + auto cast_ptr_sp = GetCxxSmartPtrElementPointerType(*ptr_obj_sp, *valobj_sp); + if (!cast_ptr_sp) + return lldb::ChildCacheState::eRefetch; + + m_ptr_obj = cast_ptr_sp->Clone(ConstString("pointer")).get(); lldb::ValueObjectSP cntrl_sp(valobj_sp->GetChildMemberWithName("__cntrl_")); @@ -305,7 +305,7 @@ lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::Update() { llvm::Expected<size_t> lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { - if (name == "__ptr_" || name == "pointer") + if (name == "pointer") return 0; if (name == "object" || name == "$$dereference$$") diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp index 84442273aebd4..d66b8339809be 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp @@ -273,11 +273,7 @@ LibStdcppSharedPtrSyntheticFrontEnd::GetChildAtIndex(uint32_t idx) { return nullptr; Status status; - auto value_type_sp = valobj_sp->GetCompilerType() - .GetTypeTemplateArgument(0) - .GetPointerType(); - ValueObjectSP cast_ptr_sp = m_ptr_obj->Cast(value_type_sp); - ValueObjectSP value_sp = cast_ptr_sp->Dereference(status); + ValueObjectSP value_sp = m_ptr_obj->Dereference(status); if (status.Success()) return value_sp; } @@ -297,7 +293,11 @@ lldb::ChildCacheState LibStdcppSharedPtrSyntheticFrontEnd::Update() { if (!ptr_obj_sp) return lldb::ChildCacheState::eRefetch; - m_ptr_obj = ptr_obj_sp->Clone(ConstString("pointer")).get(); + auto cast_ptr_sp = GetCxxSmartPtrElementPointerType(*ptr_obj_sp, *valobj_sp); + if (!cast_ptr_sp) + return lldb::ChildCacheState::eRefetch; + + m_ptr_obj = cast_ptr_sp->Clone(ConstString("pointer")).get(); return lldb::ChildCacheState::eRefetch; } diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/shared_ptr/TestDataFormatterStdSharedPtr.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/shared_ptr/TestDataFormatterStdSharedPtr.py index 8b641c9643958..3d8569da0332e 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/shared_ptr/TestDataFormatterStdSharedPtr.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/shared_ptr/TestDataFormatterStdSharedPtr.py @@ -99,6 +99,10 @@ def do_test(self): "wie", type="std::weak_ptr<int>", summary="nullptr strong=2 weak=2" ) + self.expect_var_path("si.pointer", type="int *") + self.expect_var_path("*si.pointer", type="int", value="47") + self.expect_var_path("si.object", type="int", value="47") + self.runCmd("settings set target.experimental.use-DIL true") self.expect_var_path("ptr_node->value", value="1") self.expect_var_path("ptr_node->next->value", value="2") >From 8abf398247fc0d77efb980903ae6e84fb17215d8 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Tue, 8 Jul 2025 10:03:56 +0100 Subject: [PATCH 2/2] fixup! move helper into CPlusPlus plugin --- .../lldb/DataFormatters/FormattersHelpers.h | 5 ----- .../DataFormatters/FormattersHelpers.cpp | 13 ----------- .../Plugins/Language/CPlusPlus/CMakeLists.txt | 1 + .../Plugins/Language/CPlusPlus/Generic.cpp | 22 +++++++++++++++++++ .../Plugins/Language/CPlusPlus/Generic.h | 5 +++++ .../Plugins/Language/CPlusPlus/LibCxx.cpp | 1 + .../Plugins/Language/CPlusPlus/LibStdcpp.cpp | 1 + 7 files changed, 30 insertions(+), 18 deletions(-) create mode 100644 lldb/source/Plugins/Language/CPlusPlus/Generic.cpp diff --git a/lldb/include/lldb/DataFormatters/FormattersHelpers.h b/lldb/include/lldb/DataFormatters/FormattersHelpers.h index c7ce199452e1d..6a47cf37eac64 100644 --- a/lldb/include/lldb/DataFormatters/FormattersHelpers.h +++ b/lldb/include/lldb/DataFormatters/FormattersHelpers.h @@ -63,11 +63,6 @@ void DumpCxxSmartPtrPointerSummary(Stream &stream, ValueObject &ptr, bool ContainerSizeSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); -/// Return the ValueObjectSP of the underlying pointer member whose type -/// is a desugared 'std::shared_ptr::element_type *'. -lldb::ValueObjectSP GetCxxSmartPtrElementPointerType(ValueObject &ptr, - ValueObject &container); - Address GetArrayAddressOrPointerValue(ValueObject &valobj); time_t GetOSXEpoch(); diff --git a/lldb/source/DataFormatters/FormattersHelpers.cpp b/lldb/source/DataFormatters/FormattersHelpers.cpp index 104c2ce6f1c0a..028fc5da73dc0 100644 --- a/lldb/source/DataFormatters/FormattersHelpers.cpp +++ b/lldb/source/DataFormatters/FormattersHelpers.cpp @@ -151,16 +151,3 @@ bool lldb_private::formatters::ContainerSizeSummaryProvider( return FormatEntity::FormatStringRef("size=${svar%#}", stream, nullptr, nullptr, nullptr, &valobj, false, false); } - -ValueObjectSP lldb_private::formatters::GetCxxSmartPtrElementPointerType( - ValueObject &ptr, ValueObject &container) { - auto container_type = container.GetCompilerType().GetNonReferenceType(); - if (!container_type) - return nullptr; - - auto arg = container_type.GetTypeTemplateArgument(0); - if (!arg) - return nullptr; - - return ptr.Cast(arg.GetPointerType()); -} diff --git a/lldb/source/Plugins/Language/CPlusPlus/CMakeLists.txt b/lldb/source/Plugins/Language/CPlusPlus/CMakeLists.txt index 5ba2567c80cc3..e2be1705d5529 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CMakeLists.txt +++ b/lldb/source/Plugins/Language/CPlusPlus/CMakeLists.txt @@ -12,6 +12,7 @@ add_lldb_library(lldbPluginCPlusPlusLanguage PLUGIN CPlusPlusLanguage.cpp CPlusPlusNameParser.cpp CxxStringTypes.cpp + Generic.cpp GenericBitset.cpp GenericOptional.cpp LibCxx.cpp diff --git a/lldb/source/Plugins/Language/CPlusPlus/Generic.cpp b/lldb/source/Plugins/Language/CPlusPlus/Generic.cpp new file mode 100644 index 0000000000000..40260b784efb9 --- /dev/null +++ b/lldb/source/Plugins/Language/CPlusPlus/Generic.cpp @@ -0,0 +1,22 @@ +//===-- Generic.cpp ------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// + +#include "Generic.h" + +lldb::ValueObjectSP lldb_private::formatters::GetCxxSmartPtrElementPointerType( + ValueObject &ptr, ValueObject &container) { + auto container_type = container.GetCompilerType().GetNonReferenceType(); + if (!container_type) + return nullptr; + + auto arg = container_type.GetTypeTemplateArgument(0); + if (!arg) + return nullptr; + + return ptr.Cast(arg.GetPointerType()); +} diff --git a/lldb/source/Plugins/Language/CPlusPlus/Generic.h b/lldb/source/Plugins/Language/CPlusPlus/Generic.h index 34efef9e82e5c..717c1ecdaec80 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/Generic.h +++ b/lldb/source/Plugins/Language/CPlusPlus/Generic.h @@ -19,6 +19,11 @@ namespace formatters { bool GenericOptionalSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); +/// Return the ValueObjectSP of the underlying pointer member whose type +/// is a desugared 'std::shared_ptr::element_type *'. +lldb::ValueObjectSP GetCxxSmartPtrElementPointerType(ValueObject &ptr, + ValueObject &container); + } // namespace formatters } // namespace lldb_private diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp index f73a77836034f..41c4a4952c802 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp @@ -25,6 +25,7 @@ #include "lldb/ValueObject/ValueObjectConstResult.h" #include "Plugins/Language/CPlusPlus/CxxStringTypes.h" +#include "Plugins/Language/CPlusPlus/Generic.h" #include "Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.h" #include "Plugins/TypeSystem/Clang/TypeSystemClang.h" #include "lldb/lldb-enumerations.h" diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp index d66b8339809be..4654ca91489fc 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp @@ -9,6 +9,7 @@ #include "LibStdcpp.h" #include "LibCxx.h" +#include "Plugins/Language/CPlusPlus/Generic.h" #include "Plugins/TypeSystem/Clang/TypeSystemClang.h" #include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/DataFormatters/StringPrinter.h" _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits