Author: Michael Buch Date: 2025-07-07T12:08:24+01:00 New Revision: 40fb90efed7be2dc0e9ca37a5dc4ecc0e0ae8622
URL: https://github.com/llvm/llvm-project/commit/40fb90efed7be2dc0e9ca37a5dc4ecc0e0ae8622 DIFF: https://github.com/llvm/llvm-project/commit/40fb90efed7be2dc0e9ca37a5dc4ecc0e0ae8622.diff LOG: [lldb][Formatters] Add shared/weak count to libstdc++ std::shared_ptr summary (#147166) Depends on https://github.com/llvm/llvm-project/pull/147165 This adds weak/strong counts to the std::shared_ptr summary of the libstdcxx formatters. We already do this for libcxx. This will make it easier to consolidate the tests into a generic one (see https://github.com/llvm/llvm-project/pull/147141). Added: Modified: lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/smart_ptr/TestDataFormatterStdSmartPtr.py Removed: ################################################################################ diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp index 7668a87ce447e..84442273aebd4 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp @@ -10,6 +10,7 @@ #include "LibCxx.h" #include "Plugins/TypeSystem/Clang/TypeSystemClang.h" +#include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/DataFormatters/StringPrinter.h" #include "lldb/DataFormatters/VectorIterator.h" #include "lldb/Target/Target.h" @@ -330,29 +331,37 @@ bool lldb_private::formatters::LibStdcppSmartPointerSummaryProvider( if (!ptr_sp) return false; - ValueObjectSP usecount_sp( - valobj_sp->GetChildAtNamePath({"_M_refcount", "_M_pi", "_M_use_count"})); - if (!usecount_sp) + DumpCxxSmartPtrPointerSummary(stream, *ptr_sp, options); + + ValueObjectSP pi_sp = valobj_sp->GetChildAtNamePath({"_M_refcount", "_M_pi"}); + if (!pi_sp) return false; - if (ptr_sp->GetValueAsUnsigned(0) == 0 || - usecount_sp->GetValueAsUnsigned(0) == 0) { - stream.Printf("nullptr"); + bool success; + uint64_t pi_addr = pi_sp->GetValueAsUnsigned(0, &success); + // Empty control field. We're done. + if (!success || pi_addr == 0) return true; + + int64_t shared_count = 0; + if (auto count_sp = pi_sp->GetChildMemberWithName("_M_use_count")) { + bool success; + shared_count = count_sp->GetValueAsSigned(0, &success); + if (!success) + return false; + + stream.Printf(" strong=%" PRId64, shared_count); } - Status error; - ValueObjectSP pointee_sp = ptr_sp->Dereference(error); - if (pointee_sp && error.Success()) { - if (pointee_sp->DumpPrintableRepresentation( - stream, ValueObject::eValueObjectRepresentationStyleSummary, - lldb::eFormatInvalid, - ValueObject::PrintableRepresentationSpecialCases::eDisable, - false)) { - return true; - } + // _M_weak_count is the number of weak references + (_M_use_count != 0). + if (auto weak_count_sp = pi_sp->GetChildMemberWithName("_M_weak_count")) { + bool success; + int64_t count = weak_count_sp->GetValueAsUnsigned(0, &success); + if (!success) + return false; + + stream.Printf(" weak=%" PRId64, count - (shared_count != 0)); } - stream.Printf("ptr = 0x%" PRIx64, ptr_sp->GetValueAsUnsigned(0)); return true; } diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/smart_ptr/TestDataFormatterStdSmartPtr.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/smart_ptr/TestDataFormatterStdSmartPtr.py index a6856177858a3..785fd03169224 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/smart_ptr/TestDataFormatterStdSmartPtr.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/smart_ptr/TestDataFormatterStdSmartPtr.py @@ -2,7 +2,6 @@ Test lldb data formatter subsystem. """ - import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * @@ -48,5 +47,7 @@ def test_with_run_command(self): self.expect("frame variable ssp", substrs=["ssp = nullptr"]) self.expect("frame variable nwp", substrs=["nwp = nullptr"]) - self.expect("frame variable iwp", substrs=["iwp = nullptr"]) - self.expect("frame variable swp", substrs=["swp = nullptr"]) + + # FIXME: these weak_ptr's should also be reset to nullptr. + self.expect("frame variable iwp", substrs=["iwp = ", "strong=0 weak=1"]) + self.expect("frame variable swp", substrs=["swp = ", "strong=0 weak=1"]) _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits