Author: Sergei Druzhkov Date: 2026-01-08T21:13:23+03:00 New Revision: 8ab6b38dab63fda49e6294e3b0d847ae491d7701
URL: https://github.com/llvm/llvm-project/commit/8ab6b38dab63fda49e6294e3b0d847ae491d7701 DIFF: https://github.com/llvm/llvm-project/commit/8ab6b38dab63fda49e6294e3b0d847ae491d7701.diff LOG: [lldb] Add std::*_ordering summary providers (#174195) I want to propose adding summary providers for `std::*_ordering` types introduced in `C++20`. GDB already has pretty-printers for [them](https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/python/libstdcxx/v6/printers.py#L1788), so I think it will be useful. Added: lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/ordering/Makefile lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/ordering/TestDataFormatterStdOrdering.py lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/ordering/main.cpp 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 5c431e2faf0e4..bdc67a004b06c 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -1506,6 +1506,23 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { lldb_private::formatters::StdlibCoroutineHandleSummaryProvider, "libstdc++ std::coroutine_handle summary provider", libstdcpp_std_coroutine_handle_regex, stl_summary_flags, true); + + AddCXXSummary( + cpp_category_sp, + lldb_private::formatters::LibStdcppPartialOrderingSummaryProvider, + "libstdc++ std::partial_ordering summary provider", + "std::partial_ordering", eTypeOptionHideChildren | eTypeOptionHideValue, + false); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibStdcppWeakOrderingSummaryProvider, + "libstdc++ std::weak_ordering summary provider", + "std::weak_ordering", + eTypeOptionHideChildren | eTypeOptionHideValue, false); + AddCXXSummary( + cpp_category_sp, + lldb_private::formatters::LibStdcppStrongOrderingSummaryProvider, + "libstdc++ std::strong_ordering summary provider", "std::strong_ordering", + eTypeOptionHideChildren | eTypeOptionHideValue, false); } static lldb_private::SyntheticChildrenFrontEnd * diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp index 650f2332b9d23..c06f50c1ca65d 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp @@ -494,3 +494,82 @@ bool formatters::LibStdcppVariantSummaryProvider( stream << " Active Type = " << active_type.GetDisplayTypeName() << " "; return true; } + +static std::optional<int64_t> +LibStdcppExtractOrderingValue(ValueObject &valobj) { + lldb::ValueObjectSP value_sp = valobj.GetChildMemberWithName("_M_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::LibStdcppPartialOrderingSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + std::optional<int64_t> value = LibStdcppExtractOrderingValue(valobj); + if (!value) + return false; + switch (*value) { + case -1: + stream << "less"; + break; + case 0: + stream << "equivalent"; + break; + case 1: + stream << "greater"; + break; + case -128: + case 2: + stream << "unordered"; + break; + default: + return false; + } + return true; +} + +bool lldb_private::formatters::LibStdcppWeakOrderingSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + std::optional<int64_t> value = LibStdcppExtractOrderingValue(valobj); + if (!value) + return false; + 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::LibStdcppStrongOrderingSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + std::optional<int64_t> value = LibStdcppExtractOrderingValue(valobj); + if (!value) + return false; + switch (*value) { + case -1: + stream << "less"; + break; + case 0: + stream << "equal"; + break; + case 1: + stream << "greater"; + break; + default: + return false; + } + return true; +} diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.h b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.h index ffa5ea7bb084e..bc67885787bc2 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.h +++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.h @@ -44,6 +44,18 @@ bool LibStdcppVariantSummaryProvider( ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); // libstdc++ std::variant<> +bool LibStdcppPartialOrderingSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); // libstdc++ std::partial_ordering + +bool LibStdcppWeakOrderingSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); // libstdc++ std::weak_ordering + +bool LibStdcppStrongOrderingSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); // libstdc++ std::strong_ordering + SyntheticChildrenFrontEnd * LibstdcppMapIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP); diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/ordering/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/ordering/Makefile new file mode 100644 index 0000000000000..4f79c0a900c3a --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/ordering/Makefile @@ -0,0 +1,4 @@ +CXX_SOURCES := main.cpp +CXXFLAGS_EXTRAS := -std=c++20 + +include Makefile.rules diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/ordering/TestDataFormatterStdOrdering.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/ordering/TestDataFormatterStdOrdering.py new file mode 100644 index 0000000000000..deaa76459cc8e --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/ordering/TestDataFormatterStdOrdering.py @@ -0,0 +1,50 @@ +""" +Test std::*_ordering summary. +""" + +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + + +class StdOrderingTestCase(TestBase): + def do_test(self): + lldbutil.run_to_source_breakpoint( + self, "// break here", lldb.SBFileSpec("main.cpp") + ) + + self.expect( + "frame variable", + substrs=[ + "(std::partial_ordering) po_less = less", + "(std::partial_ordering) po_equivalent = equivalent", + "(std::partial_ordering) po_greater = greater", + "(std::partial_ordering) po_unordered = unordered", + "(std::weak_ordering) wo_less = less", + "(std::weak_ordering) wo_equivalent = equivalent", + "(std::weak_ordering) wo_greater = greater", + "(std::strong_ordering) so_less = less", + "(std::strong_ordering) so_equal = equal", + "(std::strong_ordering) so_equivalent = equal", + "(std::strong_ordering) so_greater = greater", + ], + ) + + frame = self.frame() + self.assertEqual(frame.FindVariable("po_less").summary, "less") + self.assertEqual(frame.FindVariable("po_equivalent").summary, "equivalent") + self.assertEqual(frame.FindVariable("po_greater").summary, "greater") + self.assertEqual(frame.FindVariable("po_unordered").summary, "unordered") + self.assertEqual(frame.FindVariable("wo_less").summary, "less") + self.assertEqual(frame.FindVariable("wo_equivalent").summary, "equivalent") + self.assertEqual(frame.FindVariable("wo_greater").summary, "greater") + self.assertEqual(frame.FindVariable("so_less").summary, "less") + self.assertEqual(frame.FindVariable("so_equal").summary, "equal") + self.assertEqual(frame.FindVariable("so_equivalent").summary, "equal") + self.assertEqual(frame.FindVariable("so_greater").summary, "greater") + + @add_test_categories(["libstdcxx"]) + def test_libstdcxx(self): + self.build(dictionary={"USE_LIBSTDCPP": 1}) + self.do_test() diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/ordering/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/ordering/main.cpp new file mode 100644 index 0000000000000..2135d5558c1e7 --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/ordering/main.cpp @@ -0,0 +1,16 @@ +#include <compare> + +int main() { + auto po_less = std::partial_ordering::less; + auto po_equivalent = std::partial_ordering::equivalent; + auto po_greater = std::partial_ordering::greater; + auto po_unordered = std::partial_ordering::unordered; + auto wo_less = std::weak_ordering::less; + auto wo_equivalent = std::weak_ordering::equivalent; + auto wo_greater = std::weak_ordering::greater; + auto so_less = std::strong_ordering::less; + auto so_equal = std::strong_ordering::equal; + auto so_equivalent = std::strong_ordering::equivalent; + auto so_greater = std::strong_ordering::greater; + return 0; // break here +} _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
