aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
diff options
context:
space:
mode:
authornerix <nerixdev@outlook.de>2025-07-22 15:16:50 +0200
committerGitHub <noreply@github.com>2025-07-22 14:16:50 +0100
commit287b9447cc128d2218d148062d545a8633e37a4b (patch)
tree66237f67305591db4c739073b58d1edb96f93894 /lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
parent38318dd05615a2f38abdeeae99e7423165308902 (diff)
downloadllvm-287b9447cc128d2218d148062d545a8633e37a4b.zip
llvm-287b9447cc128d2218d148062d545a8633e37a4b.tar.gz
llvm-287b9447cc128d2218d148062d545a8633e37a4b.tar.bz2
[LLDB] Add formatters for MSVC STL unordered containers (#149519)
Adds formatters for MSVC STL's unordered containers. This one is relatively simple, because it can reuse the `std::list` synthetic children. The unordered containers (aka [`_Hash`](https://github.com/microsoft/STL/blob/313964b78a8fd5a52e7965e13781f735bcce13c5/stl/inc/xhash#L327)) contain a [`_List`](https://github.com/microsoft/STL/blob/313964b78a8fd5a52e7965e13781f735bcce13c5/stl/inc/xhash#L2012) which contains all elements (and is used for iterating through the container). Towards https://github.com/llvm/llvm-project/issues/24834.
Diffstat (limited to 'lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp')
-rw-r--r--lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp28
1 files changed, 24 insertions, 4 deletions
diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
index 1a101ce..80dc460 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -1434,8 +1434,7 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
stl_deref_flags,
"lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
cpp_category_sp->AddTypeSynthetic(
- "^std::(__debug::)?unordered_(multi)?(map|set)<.+> >$",
- eFormatterMatchRegex,
+ "^std::__debug::unordered_(multi)?(map|set)<.+> >$", eFormatterMatchRegex,
SyntheticChildrenSP(new ScriptedSyntheticChildren(
stl_deref_flags,
"lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider")));
@@ -1490,8 +1489,8 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
AddCXXSummary(cpp_category_sp,
lldb_private::formatters::ContainerSizeSummaryProvider,
- "libstdc++ std unordered container summary provider",
- "^std::(__debug::)?unordered_(multi)?(map|set)<.+> >$",
+ "libstdc++ debug std unordered container summary provider",
+ "^std::__debug::unordered_(multi)?(map|set)<.+> >$",
stl_summary_flags, true);
AddCXXSummary(
@@ -1660,6 +1659,19 @@ static bool GenericVariantSummaryProvider(ValueObject &valobj, Stream &stream,
return LibStdcppVariantSummaryProvider(valobj, stream, options);
}
+static SyntheticChildrenFrontEnd *
+GenericUnorderedSyntheticFrontEndCreator(CXXSyntheticChildren *children,
+ ValueObjectSP valobj_sp) {
+ if (!valobj_sp)
+ return nullptr;
+
+ if (IsMsvcStlUnordered(*valobj_sp))
+ return MsvcStlUnorderedSyntheticFrontEndCreator(children, valobj_sp);
+ return new ScriptedSyntheticChildren::FrontEnd(
+ "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider",
+ *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)
@@ -1727,6 +1739,10 @@ static void LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
AddCXXSynthetic(cpp_category_sp, GenericVariantSyntheticFrontEndCreator,
"std::variant synthetic children", "^std::variant<.*>$",
stl_synth_flags, true);
+ AddCXXSynthetic(cpp_category_sp, GenericUnorderedSyntheticFrontEndCreator,
+ "std::unordered container synthetic children",
+ "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_synth_flags,
+ true);
SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
stl_deref_flags.SetFrontEndWantsDereference();
@@ -1766,6 +1782,10 @@ static void LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
AddCXXSummary(cpp_category_sp, GenericVariantSummaryProvider,
"MSVC STL/libstdc++ std::variant summary provider",
"^std::variant<.*>$", stl_summary_flags, true);
+ AddCXXSummary(cpp_category_sp, ContainerSizeSummaryProvider,
+ "MSVC STL/libstdc++ std unordered container summary provider",
+ "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_summary_flags,
+ true);
}
static void LoadMsvcStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {