From 23ef0a092cac742df90127ec4c6e0f1932d6947a Mon Sep 17 00:00:00 2001 From: Nerixyz Date: Tue, 1 Jul 2025 18:00:57 +0200 Subject: [PATCH] [LLDB] Simplify libstdc++ string summaries --- .../Language/CPlusPlus/CPlusPlusLanguage.cpp | 29 ++--- .../Plugins/Language/CPlusPlus/LibStdcpp.cpp | 120 +----------------- .../Plugins/Language/CPlusPlus/LibStdcpp.h | 6 +- 3 files changed, 17 insertions(+), 138 deletions(-) diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 7ae2e141a63e0..f96fd0f0bcd30 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -1344,38 +1344,31 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { .SetShowMembersOneLiner(false) .SetHideItemNames(false); - lldb::TypeSummaryImplSP std_string_summary_sp( - new StringSummaryFormat(stl_summary_flags, "${var._M_dataplus._M_p}")); - - lldb::TypeSummaryImplSP cxx11_string_summary_sp(new CXXFunctionSummaryFormat( + lldb::TypeSummaryImplSP string_summary_sp(new CXXFunctionSummaryFormat( stl_summary_flags, LibStdcppStringSummaryProvider, - "libstdc++ c++11 std::string summary provider")); - lldb::TypeSummaryImplSP cxx11_wstring_summary_sp(new CXXFunctionSummaryFormat( - stl_summary_flags, LibStdcppWStringSummaryProvider, - "libstdc++ c++11 std::wstring summary provider")); + "libstdc++ std::(w)string summary provider")); cpp_category_sp->AddTypeSummary("std::string", eFormatterMatchExact, - std_string_summary_sp); + string_summary_sp); cpp_category_sp->AddTypeSummary("std::basic_string", - eFormatterMatchExact, std_string_summary_sp); + eFormatterMatchExact, string_summary_sp); cpp_category_sp->AddTypeSummary( "std::basic_string,std::allocator >", - eFormatterMatchExact, std_string_summary_sp); + eFormatterMatchExact, string_summary_sp); cpp_category_sp->AddTypeSummary( "std::basic_string, std::allocator >", - eFormatterMatchExact, std_string_summary_sp); + eFormatterMatchExact, string_summary_sp); cpp_category_sp->AddTypeSummary("std::__cxx11::string", eFormatterMatchExact, - cxx11_string_summary_sp); + string_summary_sp); cpp_category_sp->AddTypeSummary( "std::__cxx11::basic_string, " "std::allocator >", - eFormatterMatchExact, cxx11_string_summary_sp); + eFormatterMatchExact, string_summary_sp); cpp_category_sp->AddTypeSummary("std::__cxx11::basic_string, " "std::allocator >", - eFormatterMatchExact, - cxx11_string_summary_sp); + eFormatterMatchExact, string_summary_sp); // making sure we force-pick the summary for printing wstring (_M_p is a // wchar_t*) @@ -1395,11 +1388,11 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { eFormatterMatchExact, std_wstring_summary_sp); cpp_category_sp->AddTypeSummary("std::__cxx11::wstring", eFormatterMatchExact, - cxx11_wstring_summary_sp); + string_summary_sp); cpp_category_sp->AddTypeSummary( "std::__cxx11::basic_string, " "std::allocator >", - eFormatterMatchExact, cxx11_wstring_summary_sp); + eFormatterMatchExact, string_summary_sp); SyntheticChildren::Flags stl_synth_flags; stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences( diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp index 77e0755607a06..28b7c01ab1b5b 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp @@ -239,122 +239,12 @@ VectorIteratorSyntheticFrontEnd::GetIndexOfChildWithName(ConstString name) { bool lldb_private::formatters::LibStdcppStringSummaryProvider( ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { - const bool scalar_is_load_addr = true; - auto [addr_of_string, addr_type] = - valobj.IsPointerOrReferenceType() - ? valobj.GetPointerValue() - : valobj.GetAddressOf(scalar_is_load_addr); - if (addr_of_string != LLDB_INVALID_ADDRESS) { - switch (addr_type) { - case eAddressTypeLoad: { - ProcessSP process_sp(valobj.GetProcessSP()); - if (!process_sp) - return false; - - StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); - Status error; - lldb::addr_t addr_of_data = - process_sp->ReadPointerFromMemory(addr_of_string, error); - if (error.Fail() || addr_of_data == 0 || - addr_of_data == LLDB_INVALID_ADDRESS) - return false; - options.SetLocation(addr_of_data); - options.SetTargetSP(valobj.GetTargetSP()); - options.SetStream(&stream); - options.SetNeedsZeroTermination(false); - options.SetBinaryZeroIsTerminator(true); - lldb::addr_t size_of_data = process_sp->ReadPointerFromMemory( - addr_of_string + process_sp->GetAddressByteSize(), error); - if (error.Fail()) - return false; - options.SetSourceSize(size_of_data); - options.SetHasSourceSize(true); - - if (!StringPrinter::ReadStringAndDumpToStream< - StringPrinter::StringElementType::UTF8>(options)) { - stream.Printf("Summary Unavailable"); - return true; - } else - return true; - } break; - case eAddressTypeHost: - break; - case eAddressTypeInvalid: - case eAddressTypeFile: - break; - } - } - return false; -} + ValueObjectSP ptr = valobj.GetChildAtNamePath({"_M_dataplus", "_M_p"}); + if (!ptr) + return false; -bool lldb_private::formatters::LibStdcppWStringSummaryProvider( - ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { - const bool scalar_is_load_addr = true; - auto [addr_of_string, addr_type] = valobj.GetAddressOf(scalar_is_load_addr); - if (addr_of_string != LLDB_INVALID_ADDRESS) { - switch (addr_type) { - case eAddressTypeLoad: { - ProcessSP process_sp(valobj.GetProcessSP()); - if (!process_sp) - return false; - - CompilerType wchar_compiler_type = - valobj.GetCompilerType().GetBasicTypeFromAST(lldb::eBasicTypeWChar); - - if (!wchar_compiler_type) - return false; - - // Safe to pass nullptr for exe_scope here. - std::optional size = - llvm::expectedToOptional(wchar_compiler_type.GetBitSize(nullptr)); - if (!size) - return false; - const uint32_t wchar_size = *size; - - StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); - Status error; - lldb::addr_t addr_of_data = - process_sp->ReadPointerFromMemory(addr_of_string, error); - if (error.Fail() || addr_of_data == 0 || - addr_of_data == LLDB_INVALID_ADDRESS) - return false; - options.SetLocation(addr_of_data); - options.SetTargetSP(valobj.GetTargetSP()); - options.SetStream(&stream); - options.SetNeedsZeroTermination(false); - options.SetBinaryZeroIsTerminator(false); - lldb::addr_t size_of_data = process_sp->ReadPointerFromMemory( - addr_of_string + process_sp->GetAddressByteSize(), error); - if (error.Fail()) - return false; - options.SetSourceSize(size_of_data); - options.SetHasSourceSize(true); - options.SetPrefixToken("L"); - - switch (wchar_size) { - case 8: - return StringPrinter::ReadStringAndDumpToStream< - StringPrinter::StringElementType::UTF8>(options); - case 16: - return StringPrinter::ReadStringAndDumpToStream< - StringPrinter::StringElementType::UTF16>(options); - case 32: - return StringPrinter::ReadStringAndDumpToStream< - StringPrinter::StringElementType::UTF32>(options); - default: - stream.Printf("size for wchar_t is not valid"); - return true; - } - return true; - } break; - case eAddressTypeHost: - break; - case eAddressTypeInvalid: - case eAddressTypeFile: - break; - } - } - return false; + stream << ptr->GetSummaryAsCString(); + return true; } LibStdcppSharedPtrSyntheticFrontEnd::LibStdcppSharedPtrSyntheticFrontEnd( diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.h b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.h index c7b2130275ad8..8d4d777edee88 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.h +++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.h @@ -18,11 +18,7 @@ namespace lldb_private { namespace formatters { bool LibStdcppStringSummaryProvider( ValueObject &valobj, Stream &stream, - const TypeSummaryOptions &options); // libcstdc++ c++11 std::string - -bool LibStdcppWStringSummaryProvider( - ValueObject &valobj, Stream &stream, - const TypeSummaryOptions &options); // libcstdc++ c++11 std::wstring + const TypeSummaryOptions &options); // libstdc++ std::string bool LibStdcppSmartPointerSummaryProvider( ValueObject &valobj, Stream &stream,