https://github.com/DrSergei created 
https://github.com/llvm/llvm-project/pull/175070

Added summary providers for std::*_ordering from MSVC STL

>From 6161cc1cce9e70d023ef3a6ef10502c712c14d80 Mon Sep 17 00:00:00 2001
From: Sergei Druzhkov <[email protected]>
Date: Sun, 4 Jan 2026 11:40:55 +0300
Subject: [PATCH] [lldb] Add MSVC STL std::*_ordering summary providers

---
 .../Language/CPlusPlus/CPlusPlusLanguage.cpp  | 53 ++++++++----
 .../Plugins/Language/CPlusPlus/MsvcStl.cpp    | 83 +++++++++++++++++++
 .../Plugins/Language/CPlusPlus/MsvcStl.h      | 15 ++++
 .../ordering/TestDataFormatterStdOrdering.py  |  7 ++
 4 files changed, 141 insertions(+), 17 deletions(-)

diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
index bdc67a004b06c..23c95d4d0874a 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -1506,23 +1506,6 @@ 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 *
@@ -1690,6 +1673,30 @@ GenericSpanSyntheticFrontEndCreator(CXXSyntheticChildren 
*children,
   return LibStdcppSpanSyntheticFrontEndCreator(children, valobj_sp);
 }
 
+static bool
+GenericPartialOrderingSummaryProvider(ValueObject &valobj, Stream &stream,
+                                      const TypeSummaryOptions &options) {
+  if (IsMsvcStlOrdering(valobj))
+    return MsvcStlPartialOrderingSummaryProvider(valobj, stream, options);
+  return LibStdcppPartialOrderingSummaryProvider(valobj, stream, options);
+}
+
+static bool
+GenericWeakOrderingSummaryProvider(ValueObject &valobj, Stream &stream,
+                                   const TypeSummaryOptions &options) {
+  if (IsMsvcStlOrdering(valobj))
+    return MsvcStlWeakOrderingSummaryProvider(valobj, stream, options);
+  return LibStdcppWeakOrderingSummaryProvider(valobj, stream, options);
+}
+
+static bool
+GenericStrongOrderingSummaryProvider(ValueObject &valobj, Stream &stream,
+                                     const TypeSummaryOptions &options) {
+  if (IsMsvcStlSmartPointer(valobj))
+    return MsvcStlStrongOrderingSummaryProvider(valobj, stream, options);
+  return LibStdcppStrongOrderingSummaryProvider(valobj, stream, options);
+}
+
 /// Load formatters that are formatting types from more than one STL
 static void LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   if (!cpp_category_sp)
@@ -1900,6 +1907,18 @@ static void 
LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   AddCXXSummary(cpp_category_sp, ContainerSizeSummaryProvider,
                 "MSVC STL/libstd++ std::span summary provider",
                 "^std::span<.+>$", stl_summary_flags, true);
+  AddCXXSummary(cpp_category_sp, GenericPartialOrderingSummaryProvider,
+                "MSVC STL/libstdc++ std::partial_ordering summary provider",
+                "std::partial_ordering",
+                eTypeOptionHideChildren | eTypeOptionHideValue, false);
+  AddCXXSummary(cpp_category_sp, GenericWeakOrderingSummaryProvider,
+                "MSVC STL/libstdc++ std::weak_ordering summary provider",
+                "std::weak_ordering",
+                eTypeOptionHideChildren | eTypeOptionHideValue, false);
+  AddCXXSummary(cpp_category_sp, GenericStrongOrderingSummaryProvider,
+                "MSVC STL/libstdc++ std::strong_ordering summary provider",
+                "std::strong_ordering",
+                eTypeOptionHideChildren | eTypeOptionHideValue, false);
 }
 
 static void LoadMsvcStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
diff --git a/lldb/source/Plugins/Language/CPlusPlus/MsvcStl.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/MsvcStl.cpp
index 61d615417bcba..93a01acdc0f0a 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/MsvcStl.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/MsvcStl.cpp
@@ -222,3 +222,86 @@ bool 
lldb_private::formatters::MsvcStlStringViewSummaryProvider<
   return formatStringViewImpl<StringElementType::UTF32>(valobj, stream,
                                                         summary_options, "U");
 }
+
+bool lldb_private::formatters::IsMsvcStlOrdering(ValueObject &valobj) {
+  std::vector<uint32_t> indexes;
+  return valobj.GetCompilerType().GetIndexOfChildMemberWithName("_Value", true,
+                                                                indexes) > 0;
+}
+
+static std::optional<int64_t> MsvcStlExtractOrderingValue(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::MsvcStlPartialOrderingSummaryProvider(
+    ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
+  std::optional<int64_t> value = MsvcStlExtractOrderingValue(valobj);
+  if (!value)
+    return false;
+  switch (*value) {
+  case -1:
+    stream << "less";
+    break;
+  case 0:
+    stream << "equivalent";
+    break;
+  case 1:
+    stream << "greater";
+    break;
+  case -128:
+    stream << "unordered";
+    break;
+  default:
+    return false;
+  }
+  return true;
+}
+
+bool lldb_private::formatters::MsvcStlWeakOrderingSummaryProvider(
+    ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
+  std::optional<int64_t> value = MsvcStlExtractOrderingValue(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::MsvcStlStrongOrderingSummaryProvider(
+    ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
+  std::optional<int64_t> value = MsvcStlExtractOrderingValue(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/MsvcStl.h 
b/lldb/source/Plugins/Language/CPlusPlus/MsvcStl.h
index b25005914e36e..0bdd548dd99e3 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/MsvcStl.h
+++ b/lldb/source/Plugins/Language/CPlusPlus/MsvcStl.h
@@ -40,6 +40,21 @@ bool MsvcStlWStringViewSummaryProvider(
     ValueObject &valobj, Stream &stream,
     const TypeSummaryOptions &options); // std::wstring_view
 
+// MSVC STL std::*_ordering
+bool IsMsvcStlOrdering(ValueObject &valobj);
+
+bool MsvcStlPartialOrderingSummaryProvider(
+    ValueObject &valobj, Stream &stream,
+    const TypeSummaryOptions &options); // std::partial_ordering
+
+bool MsvcStlWeakOrderingSummaryProvider(
+    ValueObject &valobj, Stream &stream,
+    const TypeSummaryOptions &options); // std::weak_ordering
+
+bool MsvcStlStrongOrderingSummaryProvider(
+    ValueObject &valobj, Stream &stream,
+    const TypeSummaryOptions &options); // std::strong_ordering
+
 // MSVC STL std::shared_ptr<> and std::weak_ptr<>
 bool IsMsvcStlSmartPointer(ValueObject &valobj);
 bool MsvcStlSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream,
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
index deaa76459cc8e..43d2e13d7d79b 100644
--- 
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
@@ -9,6 +9,8 @@
 
 
 class StdOrderingTestCase(TestBase):
+    TEST_WITH_PDB_DEBUG_INFO = True
+
     def do_test(self):
         lldbutil.run_to_source_breakpoint(
             self, "// break here", lldb.SBFileSpec("main.cpp")
@@ -48,3 +50,8 @@ def do_test(self):
     def test_libstdcxx(self):
         self.build(dictionary={"USE_LIBSTDCPP": 1})
         self.do_test()
+
+    @add_test_categories(["msvcstl"])
+    def test_msvcstl(self):
+        self.build()
+        self.do_test()

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to