[Lldb-commits] [lldb] [LLDB] Add MSVC STL bitset formatter (PR #175570)
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)
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)
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)
@@ -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)
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)
@@ -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)
@@ -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)
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)
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)
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)
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)
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
