[Lldb-commits] [lldb] 8ab6b38 - [lldb] Add std::*_ordering summary providers (#174195)
via lldb-commits
lldb-commits at lists.llvm.org
Thu Jan 8 10:13:28 PST 2026
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
+}
More information about the lldb-commits
mailing list