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/3] [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/3] 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"

>From 5f0b003133aba97962309aa3e272a2a526a1b5a4 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuc...@gmail.com>
Date: Tue, 8 Jul 2025 14:31:48 +0100
Subject: [PATCH 3/3] fixup! GetCxxSmartPtrElementPointerType ->
 GetDesugaredSmartPointerValue

---
 lldb/source/Plugins/Language/CPlusPlus/Generic.cpp   | 2 +-
 lldb/source/Plugins/Language/CPlusPlus/Generic.h     | 4 ++--
 lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp    | 2 +-
 lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp | 2 +-
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/lldb/source/Plugins/Language/CPlusPlus/Generic.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/Generic.cpp
index 40260b784efb9..b237a8a27090c 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/Generic.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/Generic.cpp
@@ -8,7 +8,7 @@
 
 #include "Generic.h"
 
-lldb::ValueObjectSP lldb_private::formatters::GetCxxSmartPtrElementPointerType(
+lldb::ValueObjectSP lldb_private::formatters::GetDesugaredSmartPointerValue(
     ValueObject &ptr, ValueObject &container) {
   auto container_type = container.GetCompilerType().GetNonReferenceType();
   if (!container_type)
diff --git a/lldb/source/Plugins/Language/CPlusPlus/Generic.h 
b/lldb/source/Plugins/Language/CPlusPlus/Generic.h
index 717c1ecdaec80..f3946225ed48d 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/Generic.h
+++ b/lldb/source/Plugins/Language/CPlusPlus/Generic.h
@@ -21,8 +21,8 @@ bool GenericOptionalSummaryProvider(ValueObject &valobj, 
Stream &stream,
 
 /// 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);
+lldb::ValueObjectSP GetDesugaredSmartPointerValue(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 41c4a4952c802..a7874047942c4 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp
@@ -290,7 +290,7 @@ 
lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::Update() {
   if (!ptr_obj_sp)
     return lldb::ChildCacheState::eRefetch;
 
-  auto cast_ptr_sp = GetCxxSmartPtrElementPointerType(*ptr_obj_sp, *valobj_sp);
+  auto cast_ptr_sp = GetDesugaredSmartPointerValue(*ptr_obj_sp, *valobj_sp);
   if (!cast_ptr_sp)
     return lldb::ChildCacheState::eRefetch;
 
diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp
index 4654ca91489fc..c80a52d0f9ed6 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp
@@ -294,7 +294,7 @@ lldb::ChildCacheState 
LibStdcppSharedPtrSyntheticFrontEnd::Update() {
   if (!ptr_obj_sp)
     return lldb::ChildCacheState::eRefetch;
 
-  auto cast_ptr_sp = GetCxxSmartPtrElementPointerType(*ptr_obj_sp, *valobj_sp);
+  auto cast_ptr_sp = GetDesugaredSmartPointerValue(*ptr_obj_sp, *valobj_sp);
   if (!cast_ptr_sp)
     return lldb::ChildCacheState::eRefetch;
 

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to