[Lldb-commits] [lldb] 4c7a706 - [LLDB] Simplify libstdc++ string summaries (#146562)
via lldb-commits
lldb-commits at lists.llvm.org
Wed Jul 2 03:21:34 PDT 2025
Author: nerix
Date: 2025-07-02T11:21:31+01:00
New Revision: 4c7a706589ca97101972c88d90449d27275b3ab5
URL: https://github.com/llvm/llvm-project/commit/4c7a706589ca97101972c88d90449d27275b3ab5
DIFF: https://github.com/llvm/llvm-project/commit/4c7a706589ca97101972c88d90449d27275b3ab5.diff
LOG: [LLDB] Simplify libstdc++ string summaries (#146562)
>From #143177. This combines the summaries for the pre- and post C++ 11
`std::string` as well as `std::wstring`. In all cases, the data pointer
is reachable through `_M_dataplus._M_p`. It has the correct type (i.e.
`char*`/`wchar_t*`) and it's null terminated, so LLDB knows how to
format it as expected when using `GetSummaryAsCString`.
Added:
Modified:
lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp
lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.h
Removed:
################################################################################
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<char>",
- eFormatterMatchExact, std_string_summary_sp);
+ eFormatterMatchExact, string_summary_sp);
cpp_category_sp->AddTypeSummary(
"std::basic_string<char,std::char_traits<char>,std::allocator<char> >",
- eFormatterMatchExact, std_string_summary_sp);
+ eFormatterMatchExact, string_summary_sp);
cpp_category_sp->AddTypeSummary(
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >",
- 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<char, std::char_traits<char>, "
"std::allocator<char> >",
- eFormatterMatchExact, cxx11_string_summary_sp);
+ eFormatterMatchExact, string_summary_sp);
cpp_category_sp->AddTypeSummary("std::__cxx11::basic_string<unsigned char, "
"std::char_traits<unsigned char>, "
"std::allocator<unsigned char> >",
- 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<wchar_t, std::char_traits<wchar_t>, "
"std::allocator<wchar_t> >",
- 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<uint64_t> 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,
More information about the lldb-commits
mailing list