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
