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

Reply via email to