https://github.com/DrSergei created https://github.com/llvm/llvm-project/pull/174227
Depends on #174195 >From 645677acf488eb9fc97bb8a836598c76973cdac8 Mon Sep 17 00:00:00 2001 From: Sergei Druzhkov <[email protected]> Date: Fri, 2 Jan 2026 20:51:28 +0300 Subject: [PATCH] [lldb] Add libcxx std::*_ordering summary providers --- .../Language/CPlusPlus/CPlusPlusLanguage.cpp | 16 ++++ .../Plugins/Language/CPlusPlus/LibCxx.cpp | 83 +++++++++++++++++++ .../Plugins/Language/CPlusPlus/LibCxx.h | 12 +++ 3 files changed, 111 insertions(+) diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index dd3b84e47dec3..f808447d58df3 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -1286,6 +1286,22 @@ static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { TypeSummaryImplSP(new StringSummaryFormat( eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__y_} ${var.__m_} ${var.__wdl_}"))); + + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibcxxPartialOrderingSummaryProvider, + "libc++ std::partial_ordering summary provider", + "^std::__[[:alnum:]]+::partial_ordering$", + eTypeOptionHideChildren | eTypeOptionHideValue, true); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibcxxWeakOrderingSummaryProvider, + "libc++ std::weak_ordering summary provider", + "^std::__[[:alnum:]]+::weak_ordering$", + eTypeOptionHideChildren | eTypeOptionHideValue, true); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibcxxStrongOrderingSummaryProvider, + "libc++ std::strong_ordering summary provider", + "^std::__[[:alnum:]]+::strong_ordering$", + eTypeOptionHideChildren | eTypeOptionHideValue, true); } static void RegisterStdStringSummaryProvider( diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp index 141c5c9a2caf9..8b36d527982d5 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp @@ -256,6 +256,89 @@ bool lldb_private::formatters::LibcxxUniquePointerSummaryProvider( return true; } +static std::optional<int64_t> LibcxxExtractOrderingValue(ValueObject &valobj) { + lldb::ValueObjectSP value_sp = valobj.GetChildMemberWithName("__value_"); + if (!value_sp) + return std::nullopt; + bool success; + int64_t value = value_sp->GetValueAsSigned(0, &success); + if (!success) + return std::nullopt; + return value; +} + +bool lldb_private::formatters::LibcxxPartialOrderingSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + std::optional<int64_t> value = LibcxxExtractOrderingValue(valobj); + if (!value) { + stream << "Summary Unavailable"; + return true; + } + switch (*value) { + case -1: + stream << "less"; + break; + case 0: + stream << "equivalent"; + break; + case 1: + stream << "greater"; + break; + case -127: + stream << "unordered"; + break; + default: + return false; + } + return true; +} + +bool lldb_private::formatters::LibcxxWeakOrderingSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + std::optional<int64_t> value = LibcxxExtractOrderingValue(valobj); + if (!value) { + stream << "Summary Unavailable"; + return true; + } + switch (*value) { + case -1: + stream << "less"; + break; + case 0: + stream << "equivalent"; + break; + case 1: + stream << "greater"; + break; + default: + return false; + } + return true; +} + +bool lldb_private::formatters::LibcxxStrongOrderingSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + std::optional<int64_t> value = LibcxxExtractOrderingValue(valobj); + if (!value) { + stream << "Summary Unavailable"; + return true; + } + switch (*value) { + case -1: + stream << "less"; + break; + case 0: + stream << "equal"; + break; + case 1: + stream << "greater"; + break; + default: + return false; + } + return true; +} + /* (lldb) fr var ibeg --raw --ptr-depth 1 -T (std::__1::__wrap_iter<int *>) ibeg = { diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h index 8fd29288da35f..69cca8ee621d9 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h @@ -92,6 +92,18 @@ bool LibcxxFunctionSummaryProvider( ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); // libc++ std::function<> +bool LibcxxPartialOrderingSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); // libc++ std::partial_ordering + +bool LibcxxWeakOrderingSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); // libc++ std::weak_ordering + +bool LibcxxStrongOrderingSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); // libc++ std::strong_ordering + SyntheticChildrenFrontEnd * LibcxxVectorBoolSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP); _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
