[Lldb-commits] [lldb] [LLDB] Add MSVC STL bitset formatter (PR #175570)

2026-01-26 Thread via lldb-commits

https://github.com/Nerixyz updated 
https://github.com/llvm/llvm-project/pull/175570

>From 9b5f77b5b05e1c57cc279e1704a131392a9f855d Mon Sep 17 00:00:00 2001
From: Nerixyz 
Date: Mon, 12 Jan 2026 16:36:21 +0100
Subject: [PATCH 1/4] [LLDB] Add MSVC STL bitset formatter

---
 .../Language/CPlusPlus/CPlusPlusLanguage.cpp  | 27 +++---
 .../Language/CPlusPlus/GenericBitset.cpp  | 30 
 .../Plugins/Language/CPlusPlus/MsvcStl.h  |  6 
 .../bitset/TestDataFormatterGenericBitset.py  | 36 ---
 4 files changed, 81 insertions(+), 18 deletions(-)

diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
index bdc67a004b06c..09c5e578b2150 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -1419,10 +1419,10 @@ static void 
LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   stl_summary_flags.SetDontShowChildren(false);
   stl_summary_flags.SetSkipPointers(false);
 
-  AddCXXSummary(
-  cpp_category_sp, lldb_private::formatters::ContainerSizeSummaryProvider,
-  "libstdc++ std::bitset summary provider",
-  "^std::(__debug::)?bitset<.+>(( )?&)?$", stl_summary_flags, true);
+  AddCXXSummary(cpp_category_sp,
+lldb_private::formatters::ContainerSizeSummaryProvider,
+"libstdc++ std::bitset summary provider",
+"^std::__debug::bitset<.+>(( )?&)?$", stl_summary_flags, true);
 
   AddCXXSummary(cpp_category_sp,
 lldb_private::formatters::ContainerSizeSummaryProvider,
@@ -1499,7 +1499,7 @@ static void 
LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   AddCXXSynthetic(
   cpp_category_sp,
   lldb_private::formatters::LibStdcppBitsetSyntheticFrontEndCreator,
-  "std::bitset synthetic child", "^std::(__debug::)?bitset<.+>(( )?&)?$",
+  "std::bitset synthetic child", "^std::__debug::bitset<.+>(( )?&)?$",
   stl_deref_flags, true);
 
   AddCXXSummary(cpp_category_sp,
@@ -1690,6 +1690,17 @@ GenericSpanSyntheticFrontEndCreator(CXXSyntheticChildren 
*children,
   return LibStdcppSpanSyntheticFrontEndCreator(children, valobj_sp);
 }
 
+static SyntheticChildrenFrontEnd *
+GenericBitsetSyntheticFrontEndCreator(CXXSyntheticChildren *children,
+  ValueObjectSP valobj_sp) {
+  if (!valobj_sp)
+return nullptr;
+
+  if (IsMsvcStlBitset(*valobj_sp))
+return MsvcStlBitsetSyntheticFrontEndCreator(children, valobj_sp);
+  return LibStdcppBitsetSyntheticFrontEndCreator(children, valobj_sp);
+}
+
 /// Load formatters that are formatting types from more than one STL
 static void LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   if (!cpp_category_sp)
@@ -1850,6 +1861,9 @@ static void 
LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   "std::(multi)?map/set synthetic children",
   "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_synth_flags,
   true);
+  AddCXXSynthetic(cpp_category_sp, GenericBitsetSyntheticFrontEndCreator,
+  "std::bitset synthetic children", "^std::bitset<.+>(( 
)?&)?$",
+  stl_deref_flags, true);
 
   AddCXXSummary(cpp_category_sp, ContainerSizeSummaryProvider,
 "std::initializer_list summary provider",
@@ -1900,6 +1914,9 @@ 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, ContainerSizeSummaryProvider,
+"MSVC STL/libstdc++ std::bitset summary provider",
+"^std::bitset<.+>(( )?&)?$", stl_summary_flags, true);
 }
 
 static void LoadMsvcStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
diff --git a/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
index f2521ec750875..5f905006dfbcb 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
@@ -8,6 +8,7 @@
 
 #include "LibCxx.h"
 #include "LibStdcpp.h"
+#include "MsvcStl.h"
 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
 #include "lldb/DataFormatters/FormattersHelpers.h"
 #include "lldb/Target/Target.h"
@@ -24,6 +25,7 @@ class GenericBitsetFrontEnd : public 
SyntheticChildrenFrontEnd {
   enum class StdLib {
 LibCxx,
 LibStdcpp,
+MsvcStl,
   };
 
   GenericBitsetFrontEnd(ValueObject &valobj, StdLib stdlib);
@@ -75,11 +77,14 @@ GenericBitsetFrontEnd::GenericBitsetFrontEnd(ValueObject 
&valobj, StdLib stdlib)
 llvm::StringRef GenericBitsetFrontEnd::GetDataContainerMemberName() {
   static constexpr llvm::StringLiter

[Lldb-commits] [lldb] [LLDB] Add MSVC STL bitset formatter (PR #175570)

2026-01-13 Thread via lldb-commits

https://github.com/Nerixyz updated 
https://github.com/llvm/llvm-project/pull/175570

>From 9b5f77b5b05e1c57cc279e1704a131392a9f855d Mon Sep 17 00:00:00 2001
From: Nerixyz 
Date: Mon, 12 Jan 2026 16:36:21 +0100
Subject: [PATCH 1/4] [LLDB] Add MSVC STL bitset formatter

---
 .../Language/CPlusPlus/CPlusPlusLanguage.cpp  | 27 +++---
 .../Language/CPlusPlus/GenericBitset.cpp  | 30 
 .../Plugins/Language/CPlusPlus/MsvcStl.h  |  6 
 .../bitset/TestDataFormatterGenericBitset.py  | 36 ---
 4 files changed, 81 insertions(+), 18 deletions(-)

diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
index bdc67a004b06c..09c5e578b2150 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -1419,10 +1419,10 @@ static void 
LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   stl_summary_flags.SetDontShowChildren(false);
   stl_summary_flags.SetSkipPointers(false);
 
-  AddCXXSummary(
-  cpp_category_sp, lldb_private::formatters::ContainerSizeSummaryProvider,
-  "libstdc++ std::bitset summary provider",
-  "^std::(__debug::)?bitset<.+>(( )?&)?$", stl_summary_flags, true);
+  AddCXXSummary(cpp_category_sp,
+lldb_private::formatters::ContainerSizeSummaryProvider,
+"libstdc++ std::bitset summary provider",
+"^std::__debug::bitset<.+>(( )?&)?$", stl_summary_flags, true);
 
   AddCXXSummary(cpp_category_sp,
 lldb_private::formatters::ContainerSizeSummaryProvider,
@@ -1499,7 +1499,7 @@ static void 
LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   AddCXXSynthetic(
   cpp_category_sp,
   lldb_private::formatters::LibStdcppBitsetSyntheticFrontEndCreator,
-  "std::bitset synthetic child", "^std::(__debug::)?bitset<.+>(( )?&)?$",
+  "std::bitset synthetic child", "^std::__debug::bitset<.+>(( )?&)?$",
   stl_deref_flags, true);
 
   AddCXXSummary(cpp_category_sp,
@@ -1690,6 +1690,17 @@ GenericSpanSyntheticFrontEndCreator(CXXSyntheticChildren 
*children,
   return LibStdcppSpanSyntheticFrontEndCreator(children, valobj_sp);
 }
 
+static SyntheticChildrenFrontEnd *
+GenericBitsetSyntheticFrontEndCreator(CXXSyntheticChildren *children,
+  ValueObjectSP valobj_sp) {
+  if (!valobj_sp)
+return nullptr;
+
+  if (IsMsvcStlBitset(*valobj_sp))
+return MsvcStlBitsetSyntheticFrontEndCreator(children, valobj_sp);
+  return LibStdcppBitsetSyntheticFrontEndCreator(children, valobj_sp);
+}
+
 /// Load formatters that are formatting types from more than one STL
 static void LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   if (!cpp_category_sp)
@@ -1850,6 +1861,9 @@ static void 
LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   "std::(multi)?map/set synthetic children",
   "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_synth_flags,
   true);
+  AddCXXSynthetic(cpp_category_sp, GenericBitsetSyntheticFrontEndCreator,
+  "std::bitset synthetic children", "^std::bitset<.+>(( 
)?&)?$",
+  stl_deref_flags, true);
 
   AddCXXSummary(cpp_category_sp, ContainerSizeSummaryProvider,
 "std::initializer_list summary provider",
@@ -1900,6 +1914,9 @@ 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, ContainerSizeSummaryProvider,
+"MSVC STL/libstdc++ std::bitset summary provider",
+"^std::bitset<.+>(( )?&)?$", stl_summary_flags, true);
 }
 
 static void LoadMsvcStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
diff --git a/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
index f2521ec750875..5f905006dfbcb 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
@@ -8,6 +8,7 @@
 
 #include "LibCxx.h"
 #include "LibStdcpp.h"
+#include "MsvcStl.h"
 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
 #include "lldb/DataFormatters/FormattersHelpers.h"
 #include "lldb/Target/Target.h"
@@ -24,6 +25,7 @@ class GenericBitsetFrontEnd : public 
SyntheticChildrenFrontEnd {
   enum class StdLib {
 LibCxx,
 LibStdcpp,
+MsvcStl,
   };
 
   GenericBitsetFrontEnd(ValueObject &valobj, StdLib stdlib);
@@ -75,11 +77,14 @@ GenericBitsetFrontEnd::GenericBitsetFrontEnd(ValueObject 
&valobj, StdLib stdlib)
 llvm::StringRef GenericBitsetFrontEnd::GetDataContainerMemberName() {
   static constexpr llvm::StringLiter

[Lldb-commits] [lldb] [LLDB] Add MSVC STL bitset formatter (PR #175570)

2026-01-13 Thread Michael Buch via lldb-commits

https://github.com/Michael137 edited 
https://github.com/llvm/llvm-project/pull/175570
___
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [lldb] [LLDB] Add MSVC STL bitset formatter (PR #175570)

2026-01-13 Thread Michael Buch via lldb-commits


@@ -96,6 +101,17 @@ lldb::ChildCacheState GenericBitsetFrontEnd::Update() {
 
   if (auto arg = m_backend.GetCompilerType().GetIntegralTemplateArgument(0))
 size = arg->value.GetAPSInt().getLimitedValue();
+  else {
+// PDB doesn't create template types. Instead, the type is a (non-template)
+// struct with the name "bitset".
+ConstString type_name =
+m_backend.GetCompilerType().GetTypeName(/*BaseOnly=*/true);
+llvm::StringRef size_str = type_name.GetStringRef();
+size_str.consume_front("bitset<");
+size_str.consume_back(">");
+if (size_str.getAsInteger(10, size))

Michael137 wrote:

Yea that happens for nested templates. The size argument to a `bitset` is a 
`size_t`, and thus could never be a template.

I'd prefer not adding the `trim` until we have a concrete use-case, to avoid 
confusing future readers

https://github.com/llvm/llvm-project/pull/175570
___
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [lldb] [LLDB] Add MSVC STL bitset formatter (PR #175570)

2026-01-13 Thread Ebuka Ezike via lldb-commits

https://github.com/da-viper approved this pull request.


https://github.com/llvm/llvm-project/pull/175570
___
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [lldb] [LLDB] Add MSVC STL bitset formatter (PR #175570)

2026-01-13 Thread Ebuka Ezike via lldb-commits


@@ -96,6 +101,17 @@ lldb::ChildCacheState GenericBitsetFrontEnd::Update() {
 
   if (auto arg = m_backend.GetCompilerType().GetIntegralTemplateArgument(0))
 size = arg->value.GetAPSInt().getLimitedValue();
+  else {
+// PDB doesn't create template types. Instead, the type is a (non-template)
+// struct with the name "bitset".
+ConstString type_name =
+m_backend.GetCompilerType().GetTypeName(/*BaseOnly=*/true);
+llvm::StringRef size_str = type_name.GetStringRef();
+size_str.consume_front("bitset<");
+size_str.consume_back(">");
+if (size_str.getAsInteger(10, size))

da-viper wrote:

I am not sure if it is possible in this case, but we sometimes have spaces at 
the end in templates. something like
`__cxx11::basic_string, std::allocator >` 

https://github.com/llvm/llvm-project/pull/175570
___
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [lldb] [LLDB] Add MSVC STL bitset formatter (PR #175570)

2026-01-12 Thread Michael Buch via lldb-commits


@@ -96,6 +101,17 @@ lldb::ChildCacheState GenericBitsetFrontEnd::Update() {
 
   if (auto arg = m_backend.GetCompilerType().GetIntegralTemplateArgument(0))
 size = arg->value.GetAPSInt().getLimitedValue();
+  else {
+// PDB doesn't create template types. Instead, the type is a (non-template)
+// struct with the name "bitset".
+ConstString type_name =
+m_backend.GetCompilerType().GetTypeName(/*BaseOnly=*/true);
+llvm::StringRef size_str = type_name.GetStringRef();
+size_str.consume_front("bitset<");
+size_str.consume_back(">");
+if (size_str.getAsInteger(10, size))

Michael137 wrote:

In what situations would we have a space here?

https://github.com/llvm/llvm-project/pull/175570
___
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [lldb] [LLDB] Add MSVC STL bitset formatter (PR #175570)

2026-01-12 Thread via lldb-commits

https://github.com/Nerixyz updated 
https://github.com/llvm/llvm-project/pull/175570

>From 9b5f77b5b05e1c57cc279e1704a131392a9f855d Mon Sep 17 00:00:00 2001
From: Nerixyz 
Date: Mon, 12 Jan 2026 16:36:21 +0100
Subject: [PATCH 1/3] [LLDB] Add MSVC STL bitset formatter

---
 .../Language/CPlusPlus/CPlusPlusLanguage.cpp  | 27 +++---
 .../Language/CPlusPlus/GenericBitset.cpp  | 30 
 .../Plugins/Language/CPlusPlus/MsvcStl.h  |  6 
 .../bitset/TestDataFormatterGenericBitset.py  | 36 ---
 4 files changed, 81 insertions(+), 18 deletions(-)

diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
index bdc67a004b06c..09c5e578b2150 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -1419,10 +1419,10 @@ static void 
LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   stl_summary_flags.SetDontShowChildren(false);
   stl_summary_flags.SetSkipPointers(false);
 
-  AddCXXSummary(
-  cpp_category_sp, lldb_private::formatters::ContainerSizeSummaryProvider,
-  "libstdc++ std::bitset summary provider",
-  "^std::(__debug::)?bitset<.+>(( )?&)?$", stl_summary_flags, true);
+  AddCXXSummary(cpp_category_sp,
+lldb_private::formatters::ContainerSizeSummaryProvider,
+"libstdc++ std::bitset summary provider",
+"^std::__debug::bitset<.+>(( )?&)?$", stl_summary_flags, true);
 
   AddCXXSummary(cpp_category_sp,
 lldb_private::formatters::ContainerSizeSummaryProvider,
@@ -1499,7 +1499,7 @@ static void 
LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   AddCXXSynthetic(
   cpp_category_sp,
   lldb_private::formatters::LibStdcppBitsetSyntheticFrontEndCreator,
-  "std::bitset synthetic child", "^std::(__debug::)?bitset<.+>(( )?&)?$",
+  "std::bitset synthetic child", "^std::__debug::bitset<.+>(( )?&)?$",
   stl_deref_flags, true);
 
   AddCXXSummary(cpp_category_sp,
@@ -1690,6 +1690,17 @@ GenericSpanSyntheticFrontEndCreator(CXXSyntheticChildren 
*children,
   return LibStdcppSpanSyntheticFrontEndCreator(children, valobj_sp);
 }
 
+static SyntheticChildrenFrontEnd *
+GenericBitsetSyntheticFrontEndCreator(CXXSyntheticChildren *children,
+  ValueObjectSP valobj_sp) {
+  if (!valobj_sp)
+return nullptr;
+
+  if (IsMsvcStlBitset(*valobj_sp))
+return MsvcStlBitsetSyntheticFrontEndCreator(children, valobj_sp);
+  return LibStdcppBitsetSyntheticFrontEndCreator(children, valobj_sp);
+}
+
 /// Load formatters that are formatting types from more than one STL
 static void LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   if (!cpp_category_sp)
@@ -1850,6 +1861,9 @@ static void 
LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   "std::(multi)?map/set synthetic children",
   "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_synth_flags,
   true);
+  AddCXXSynthetic(cpp_category_sp, GenericBitsetSyntheticFrontEndCreator,
+  "std::bitset synthetic children", "^std::bitset<.+>(( 
)?&)?$",
+  stl_deref_flags, true);
 
   AddCXXSummary(cpp_category_sp, ContainerSizeSummaryProvider,
 "std::initializer_list summary provider",
@@ -1900,6 +1914,9 @@ 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, ContainerSizeSummaryProvider,
+"MSVC STL/libstdc++ std::bitset summary provider",
+"^std::bitset<.+>(( )?&)?$", stl_summary_flags, true);
 }
 
 static void LoadMsvcStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
diff --git a/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
index f2521ec750875..5f905006dfbcb 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
@@ -8,6 +8,7 @@
 
 #include "LibCxx.h"
 #include "LibStdcpp.h"
+#include "MsvcStl.h"
 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
 #include "lldb/DataFormatters/FormattersHelpers.h"
 #include "lldb/Target/Target.h"
@@ -24,6 +25,7 @@ class GenericBitsetFrontEnd : public 
SyntheticChildrenFrontEnd {
   enum class StdLib {
 LibCxx,
 LibStdcpp,
+MsvcStl,
   };
 
   GenericBitsetFrontEnd(ValueObject &valobj, StdLib stdlib);
@@ -75,11 +77,14 @@ GenericBitsetFrontEnd::GenericBitsetFrontEnd(ValueObject 
&valobj, StdLib stdlib)
 llvm::StringRef GenericBitsetFrontEnd::GetDataContainerMemberName() {
   static constexpr llvm::StringLiter

[Lldb-commits] [lldb] [LLDB] Add MSVC STL bitset formatter (PR #175570)

2026-01-12 Thread via lldb-commits

https://github.com/Nerixyz updated 
https://github.com/llvm/llvm-project/pull/175570

>From 9b5f77b5b05e1c57cc279e1704a131392a9f855d Mon Sep 17 00:00:00 2001
From: Nerixyz 
Date: Mon, 12 Jan 2026 16:36:21 +0100
Subject: [PATCH 1/2] [LLDB] Add MSVC STL bitset formatter

---
 .../Language/CPlusPlus/CPlusPlusLanguage.cpp  | 27 +++---
 .../Language/CPlusPlus/GenericBitset.cpp  | 30 
 .../Plugins/Language/CPlusPlus/MsvcStl.h  |  6 
 .../bitset/TestDataFormatterGenericBitset.py  | 36 ---
 4 files changed, 81 insertions(+), 18 deletions(-)

diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
index bdc67a004b06c..09c5e578b2150 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -1419,10 +1419,10 @@ static void 
LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   stl_summary_flags.SetDontShowChildren(false);
   stl_summary_flags.SetSkipPointers(false);
 
-  AddCXXSummary(
-  cpp_category_sp, lldb_private::formatters::ContainerSizeSummaryProvider,
-  "libstdc++ std::bitset summary provider",
-  "^std::(__debug::)?bitset<.+>(( )?&)?$", stl_summary_flags, true);
+  AddCXXSummary(cpp_category_sp,
+lldb_private::formatters::ContainerSizeSummaryProvider,
+"libstdc++ std::bitset summary provider",
+"^std::__debug::bitset<.+>(( )?&)?$", stl_summary_flags, true);
 
   AddCXXSummary(cpp_category_sp,
 lldb_private::formatters::ContainerSizeSummaryProvider,
@@ -1499,7 +1499,7 @@ static void 
LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   AddCXXSynthetic(
   cpp_category_sp,
   lldb_private::formatters::LibStdcppBitsetSyntheticFrontEndCreator,
-  "std::bitset synthetic child", "^std::(__debug::)?bitset<.+>(( )?&)?$",
+  "std::bitset synthetic child", "^std::__debug::bitset<.+>(( )?&)?$",
   stl_deref_flags, true);
 
   AddCXXSummary(cpp_category_sp,
@@ -1690,6 +1690,17 @@ GenericSpanSyntheticFrontEndCreator(CXXSyntheticChildren 
*children,
   return LibStdcppSpanSyntheticFrontEndCreator(children, valobj_sp);
 }
 
+static SyntheticChildrenFrontEnd *
+GenericBitsetSyntheticFrontEndCreator(CXXSyntheticChildren *children,
+  ValueObjectSP valobj_sp) {
+  if (!valobj_sp)
+return nullptr;
+
+  if (IsMsvcStlBitset(*valobj_sp))
+return MsvcStlBitsetSyntheticFrontEndCreator(children, valobj_sp);
+  return LibStdcppBitsetSyntheticFrontEndCreator(children, valobj_sp);
+}
+
 /// Load formatters that are formatting types from more than one STL
 static void LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   if (!cpp_category_sp)
@@ -1850,6 +1861,9 @@ static void 
LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   "std::(multi)?map/set synthetic children",
   "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_synth_flags,
   true);
+  AddCXXSynthetic(cpp_category_sp, GenericBitsetSyntheticFrontEndCreator,
+  "std::bitset synthetic children", "^std::bitset<.+>(( 
)?&)?$",
+  stl_deref_flags, true);
 
   AddCXXSummary(cpp_category_sp, ContainerSizeSummaryProvider,
 "std::initializer_list summary provider",
@@ -1900,6 +1914,9 @@ 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, ContainerSizeSummaryProvider,
+"MSVC STL/libstdc++ std::bitset summary provider",
+"^std::bitset<.+>(( )?&)?$", stl_summary_flags, true);
 }
 
 static void LoadMsvcStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
diff --git a/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
index f2521ec750875..5f905006dfbcb 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
@@ -8,6 +8,7 @@
 
 #include "LibCxx.h"
 #include "LibStdcpp.h"
+#include "MsvcStl.h"
 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
 #include "lldb/DataFormatters/FormattersHelpers.h"
 #include "lldb/Target/Target.h"
@@ -24,6 +25,7 @@ class GenericBitsetFrontEnd : public 
SyntheticChildrenFrontEnd {
   enum class StdLib {
 LibCxx,
 LibStdcpp,
+MsvcStl,
   };
 
   GenericBitsetFrontEnd(ValueObject &valobj, StdLib stdlib);
@@ -75,11 +77,14 @@ GenericBitsetFrontEnd::GenericBitsetFrontEnd(ValueObject 
&valobj, StdLib stdlib)
 llvm::StringRef GenericBitsetFrontEnd::GetDataContainerMemberName() {
   static constexpr llvm::StringLiter

[Lldb-commits] [lldb] [LLDB] Add MSVC STL bitset formatter (PR #175570)

2026-01-12 Thread via lldb-commits

github-actions[bot] wrote:




:warning: Python code formatter, darker found issues in your code. :warning:



You can test this locally with the following command:


``bash
darker --check --diff -r origin/main...HEAD 
lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/bitset/TestDataFormatterGenericBitset.py
``

:warning:
The reproduction instructions above might return results for more than one PR
in a stack if you are using a stacked PR workflow. You can limit the results by
changing `origin/main` to the base branch/commit you want to compare against.
:warning:





View the diff from darker here.


``diff
--- TestDataFormatterGenericBitset.py   2026-01-12 15:48:55.00 +
+++ TestDataFormatterGenericBitset.py   2026-01-12 15:51:31.227106 +
@@ -64,16 +64,16 @@
 self.check("medium", 70, VALUE)
 self.check("large", 1000, VALUE)
 
 @add_test_categories(["libstdcxx"])
 def test_value_libstdcpp(self):
-self.build(dictionary={'USE_LIBSTDCPP': "1"})
+self.build(dictionary={"USE_LIBSTDCPP": "1"})
 self.do_test_value()
 
 @add_test_categories(["libc++"])
 def test_value_libcpp(self):
-self.build(dictionary={'USE_LIBCPP': "1"})
+self.build(dictionary={"USE_LIBCPP": "1"})
 self.do_test_value()
 
 @add_test_categories(["msvcstl"])
 def test_value_msvcstl(self):
 self.build()
@@ -98,16 +98,16 @@
 self.check("ref", 1000, REFERENCE)
 self.check("ptr", 1000, POINTER)
 
 @add_test_categories(["libstdcxx"])
 def test_ptr_and_ref_libstdcpp(self):
-self.build(dictionary={'USE_LIBSTDCPP': "1"})
+self.build(dictionary={"USE_LIBSTDCPP": "1"})
 self.do_test_ptr_and_ref()
 
 @add_test_categories(["libc++"])
 def test_ptr_and_ref_libcpp(self):
-self.build(dictionary={'USE_LIBCPP': "1"})
+self.build(dictionary={"USE_LIBCPP": "1"})
 self.do_test_ptr_and_ref()
 
 @add_test_categories(["msvcstl"])
 def test_ptr_and_ref_msvcstl(self):
 self.build()

``




https://github.com/llvm/llvm-project/pull/175570
___
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [lldb] [LLDB] Add MSVC STL bitset formatter (PR #175570)

2026-01-12 Thread via lldb-commits

llvmbot wrote:




@llvm/pr-subscribers-lldb

Author: Nerixyz (Nerixyz)


Changes

This PR adds a formatter for MSVC STL's `std::bitset`. Most of the code is 
already in `GenericBitset`. To add support, only `GetDataContainerMemberName` 
has to be modified. However, to get the size of the set, the template parameter 
is read. This doesn't work with PDB. Unfortunately, there's no static member 
that mirrors the template parameter value, so we have to parse the type name to 
get the size.

---
Full diff: https://github.com/llvm/llvm-project/pull/175570.diff


4 Files Affected:

- (modified) lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp 
(+22-5) 
- (modified) lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp (+30) 
- (modified) lldb/source/Plugins/Language/CPlusPlus/MsvcStl.h (+6) 
- (modified) 
lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/bitset/TestDataFormatterGenericBitset.py
 (+23-13) 


``diff
diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
index bdc67a004b06c..09c5e578b2150 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -1419,10 +1419,10 @@ static void 
LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   stl_summary_flags.SetDontShowChildren(false);
   stl_summary_flags.SetSkipPointers(false);
 
-  AddCXXSummary(
-  cpp_category_sp, lldb_private::formatters::ContainerSizeSummaryProvider,
-  "libstdc++ std::bitset summary provider",
-  "^std::(__debug::)?bitset<.+>(( )?&)?$", stl_summary_flags, true);
+  AddCXXSummary(cpp_category_sp,
+lldb_private::formatters::ContainerSizeSummaryProvider,
+"libstdc++ std::bitset summary provider",
+"^std::__debug::bitset<.+>(( )?&)?$", stl_summary_flags, true);
 
   AddCXXSummary(cpp_category_sp,
 lldb_private::formatters::ContainerSizeSummaryProvider,
@@ -1499,7 +1499,7 @@ static void 
LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   AddCXXSynthetic(
   cpp_category_sp,
   lldb_private::formatters::LibStdcppBitsetSyntheticFrontEndCreator,
-  "std::bitset synthetic child", "^std::(__debug::)?bitset<.+>(( )?&)?$",
+  "std::bitset synthetic child", "^std::__debug::bitset<.+>(( )?&)?$",
   stl_deref_flags, true);
 
   AddCXXSummary(cpp_category_sp,
@@ -1690,6 +1690,17 @@ GenericSpanSyntheticFrontEndCreator(CXXSyntheticChildren 
*children,
   return LibStdcppSpanSyntheticFrontEndCreator(children, valobj_sp);
 }
 
+static SyntheticChildrenFrontEnd *
+GenericBitsetSyntheticFrontEndCreator(CXXSyntheticChildren *children,
+  ValueObjectSP valobj_sp) {
+  if (!valobj_sp)
+return nullptr;
+
+  if (IsMsvcStlBitset(*valobj_sp))
+return MsvcStlBitsetSyntheticFrontEndCreator(children, valobj_sp);
+  return LibStdcppBitsetSyntheticFrontEndCreator(children, valobj_sp);
+}
+
 /// Load formatters that are formatting types from more than one STL
 static void LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   if (!cpp_category_sp)
@@ -1850,6 +1861,9 @@ static void 
LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   "std::(multi)?map/set synthetic children",
   "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_synth_flags,
   true);
+  AddCXXSynthetic(cpp_category_sp, GenericBitsetSyntheticFrontEndCreator,
+  "std::bitset synthetic children", "^std::bitset<.+>(( 
)?&)?$",
+  stl_deref_flags, true);
 
   AddCXXSummary(cpp_category_sp, ContainerSizeSummaryProvider,
 "std::initializer_list summary provider",
@@ -1900,6 +1914,9 @@ 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, ContainerSizeSummaryProvider,
+"MSVC STL/libstdc++ std::bitset summary provider",
+"^std::bitset<.+>(( )?&)?$", stl_summary_flags, true);
 }
 
 static void LoadMsvcStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
diff --git a/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
index f2521ec750875..5f905006dfbcb 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
@@ -8,6 +8,7 @@
 
 #include "LibCxx.h"
 #include "LibStdcpp.h"
+#include "MsvcStl.h"
 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
 #include "lldb/DataFormatters/FormattersHelpers.h"
 #include "lldb/Target/Target.h"
@@ -24,6 +25,7 @@ class GenericBitsetFrontEnd : public 

[Lldb-commits] [lldb] [LLDB] Add MSVC STL bitset formatter (PR #175570)

2026-01-12 Thread via lldb-commits

https://github.com/Nerixyz created 
https://github.com/llvm/llvm-project/pull/175570

This PR adds a formatter for MSVC STL's `std::bitset`. Most of the code is 
already in `GenericBitset`. To add support, only `GetDataContainerMemberName` 
has to be modified. However, to get the size of the set, the template parameter 
is read. This doesn't work with PDB. Unfortunately, there's no static member 
that mirrors the template parameter value, so we have to parse the type name to 
get the size.

>From 9b5f77b5b05e1c57cc279e1704a131392a9f855d Mon Sep 17 00:00:00 2001
From: Nerixyz 
Date: Mon, 12 Jan 2026 16:36:21 +0100
Subject: [PATCH] [LLDB] Add MSVC STL bitset formatter

---
 .../Language/CPlusPlus/CPlusPlusLanguage.cpp  | 27 +++---
 .../Language/CPlusPlus/GenericBitset.cpp  | 30 
 .../Plugins/Language/CPlusPlus/MsvcStl.h  |  6 
 .../bitset/TestDataFormatterGenericBitset.py  | 36 ---
 4 files changed, 81 insertions(+), 18 deletions(-)

diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
index bdc67a004b06c..09c5e578b2150 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -1419,10 +1419,10 @@ static void 
LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   stl_summary_flags.SetDontShowChildren(false);
   stl_summary_flags.SetSkipPointers(false);
 
-  AddCXXSummary(
-  cpp_category_sp, lldb_private::formatters::ContainerSizeSummaryProvider,
-  "libstdc++ std::bitset summary provider",
-  "^std::(__debug::)?bitset<.+>(( )?&)?$", stl_summary_flags, true);
+  AddCXXSummary(cpp_category_sp,
+lldb_private::formatters::ContainerSizeSummaryProvider,
+"libstdc++ std::bitset summary provider",
+"^std::__debug::bitset<.+>(( )?&)?$", stl_summary_flags, true);
 
   AddCXXSummary(cpp_category_sp,
 lldb_private::formatters::ContainerSizeSummaryProvider,
@@ -1499,7 +1499,7 @@ static void 
LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   AddCXXSynthetic(
   cpp_category_sp,
   lldb_private::formatters::LibStdcppBitsetSyntheticFrontEndCreator,
-  "std::bitset synthetic child", "^std::(__debug::)?bitset<.+>(( )?&)?$",
+  "std::bitset synthetic child", "^std::__debug::bitset<.+>(( )?&)?$",
   stl_deref_flags, true);
 
   AddCXXSummary(cpp_category_sp,
@@ -1690,6 +1690,17 @@ GenericSpanSyntheticFrontEndCreator(CXXSyntheticChildren 
*children,
   return LibStdcppSpanSyntheticFrontEndCreator(children, valobj_sp);
 }
 
+static SyntheticChildrenFrontEnd *
+GenericBitsetSyntheticFrontEndCreator(CXXSyntheticChildren *children,
+  ValueObjectSP valobj_sp) {
+  if (!valobj_sp)
+return nullptr;
+
+  if (IsMsvcStlBitset(*valobj_sp))
+return MsvcStlBitsetSyntheticFrontEndCreator(children, valobj_sp);
+  return LibStdcppBitsetSyntheticFrontEndCreator(children, valobj_sp);
+}
+
 /// Load formatters that are formatting types from more than one STL
 static void LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   if (!cpp_category_sp)
@@ -1850,6 +1861,9 @@ static void 
LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   "std::(multi)?map/set synthetic children",
   "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_synth_flags,
   true);
+  AddCXXSynthetic(cpp_category_sp, GenericBitsetSyntheticFrontEndCreator,
+  "std::bitset synthetic children", "^std::bitset<.+>(( 
)?&)?$",
+  stl_deref_flags, true);
 
   AddCXXSummary(cpp_category_sp, ContainerSizeSummaryProvider,
 "std::initializer_list summary provider",
@@ -1900,6 +1914,9 @@ 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, ContainerSizeSummaryProvider,
+"MSVC STL/libstdc++ std::bitset summary provider",
+"^std::bitset<.+>(( )?&)?$", stl_summary_flags, true);
 }
 
 static void LoadMsvcStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
diff --git a/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
index f2521ec750875..5f905006dfbcb 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/GenericBitset.cpp
@@ -8,6 +8,7 @@
 
 #include "LibCxx.h"
 #include "LibStdcpp.h"
+#include "MsvcStl.h"
 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
 #include "lldb/DataFormatters/FormattersHelpers.h"
 #include "lldb/Target/Target.h"
@@ -24,6 +25,7 @@ class