https://github.com/Nerixyz updated https://github.com/llvm/llvm-project/pull/172360
>From a898ac2e2987085420d68806388be4bf1e26aeb2 Mon Sep 17 00:00:00 2001 From: Nerixyz <[email protected]> Date: Thu, 6 Nov 2025 20:56:27 +0100 Subject: [PATCH 1/2] [LLDB] Run MSVC STL deque tests with PDB --- .../Language/CPlusPlus/MsvcStlDeque.cpp | 58 ++++++++++++++----- .../deque/TestDataFormatterGenericDeque.py | 2 + 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/lldb/source/Plugins/Language/CPlusPlus/MsvcStlDeque.cpp b/lldb/source/Plugins/Language/CPlusPlus/MsvcStlDeque.cpp index 873354381a6da..66fd547bda6a0 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/MsvcStlDeque.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/MsvcStlDeque.cpp @@ -90,6 +90,38 @@ lldb_private::formatters::MsvcStlDequeSyntheticFrontEnd::GetChildAtIndex( m_element_type); } +static std::optional<size_t> +getBlockSize(const lldb_private::CompilerType &deque_type) { + auto block_size_decl = deque_type.GetStaticFieldWithName("_Block_size"); + if (block_size_decl) { + auto block_size = block_size_decl.GetConstantValue(); + if (block_size.IsValid()) + return block_size.ULongLong(); + } + + // MSVC doesn't include static members like _Block_size. As a workaround, the + // STL has enum { _EEN_DS = _Block_size }; + // This is named "<unnamed-enum-_EEN_DS>" in PDB. + auto enum_type = + deque_type.GetDirectNestedTypeWithName("<unnamed-enum-_EEN_DS>"); + if (!enum_type) + return std::nullopt; + + std::optional<size_t> value; + enum_type.ForEachEnumerator( + [&](const lldb_private::CompilerType &integer_type, + lldb_private::ConstString name, const llvm::APSInt &ap_value) { + if (name != "_EEN_DS") + return true; // keep iterating + + int64_t signed_value = ap_value.getExtValue(); + if (signed_value > 0) + value.emplace(static_cast<uint64_t>(signed_value)); + return false; + }); + return value; +} + lldb::ChildCacheState lldb_private::formatters::MsvcStlDequeSyntheticFrontEnd::Update() { m_size = 0; @@ -104,18 +136,8 @@ lldb_private::formatters::MsvcStlDequeSyntheticFrontEnd::Update() { if (!deque_type) return lldb::eRefetch; - auto block_size_decl = deque_type.GetStaticFieldWithName("_Block_size"); - if (!block_size_decl) - return lldb::eRefetch; - auto block_size = block_size_decl.GetConstantValue(); - if (!block_size.IsValid()) - return lldb::eRefetch; - - auto element_type = deque_type.GetTypeTemplateArgument(0); - if (!element_type) - return lldb::eRefetch; - auto element_size = element_type.GetByteSize(nullptr); - if (!element_size) + auto block_size = getBlockSize(deque_type); + if (!block_size) return lldb::eRefetch; auto offset_sp = storage_sp->GetChildMemberWithName("_Myoff"); @@ -138,9 +160,19 @@ lldb_private::formatters::MsvcStlDequeSyntheticFrontEnd::Update() { if (!ok) return lldb::eRefetch; + auto element_type = deque_type.GetTypeTemplateArgument(0); + if (!element_type) { + element_type = map_sp->GetCompilerType().GetPointeeType().GetPointeeType(); + if (!element_type) + return lldb::eRefetch; + } + auto element_size = element_type.GetByteSize(nullptr); + if (!element_size) + return lldb::eRefetch; + m_map = map_sp.get(); m_exe_ctx_ref = m_backend.GetExecutionContextRef(); - m_block_size = block_size.ULongLong(); + m_block_size = *block_size; m_offset = offset; m_map_size = map_size; m_element_size = *element_size; diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/TestDataFormatterGenericDeque.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/TestDataFormatterGenericDeque.py index 2332eff7b10dd..2b22281a87318 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/TestDataFormatterGenericDeque.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/TestDataFormatterGenericDeque.py @@ -5,6 +5,8 @@ class GenericDequeDataFormatterTestCase(TestBase): + TEST_WITH_PDB_DEBUG_INFO = True + def findVariable(self, name): var = self.frame().FindVariable(name) self.assertTrue(var.IsValid()) >From 376cb2cc643ad7795f5da55b316cc1be8d7f6f54 Mon Sep 17 00:00:00 2001 From: Nerixyz <[email protected]> Date: Tue, 16 Dec 2025 19:32:24 +0100 Subject: [PATCH 2/2] fix: remove MSVC workaround here --- .../Language/CPlusPlus/MsvcStlDeque.cpp | 41 +++---------------- 1 file changed, 6 insertions(+), 35 deletions(-) diff --git a/lldb/source/Plugins/Language/CPlusPlus/MsvcStlDeque.cpp b/lldb/source/Plugins/Language/CPlusPlus/MsvcStlDeque.cpp index 66fd547bda6a0..aa313abb04be2 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/MsvcStlDeque.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/MsvcStlDeque.cpp @@ -90,38 +90,6 @@ lldb_private::formatters::MsvcStlDequeSyntheticFrontEnd::GetChildAtIndex( m_element_type); } -static std::optional<size_t> -getBlockSize(const lldb_private::CompilerType &deque_type) { - auto block_size_decl = deque_type.GetStaticFieldWithName("_Block_size"); - if (block_size_decl) { - auto block_size = block_size_decl.GetConstantValue(); - if (block_size.IsValid()) - return block_size.ULongLong(); - } - - // MSVC doesn't include static members like _Block_size. As a workaround, the - // STL has enum { _EEN_DS = _Block_size }; - // This is named "<unnamed-enum-_EEN_DS>" in PDB. - auto enum_type = - deque_type.GetDirectNestedTypeWithName("<unnamed-enum-_EEN_DS>"); - if (!enum_type) - return std::nullopt; - - std::optional<size_t> value; - enum_type.ForEachEnumerator( - [&](const lldb_private::CompilerType &integer_type, - lldb_private::ConstString name, const llvm::APSInt &ap_value) { - if (name != "_EEN_DS") - return true; // keep iterating - - int64_t signed_value = ap_value.getExtValue(); - if (signed_value > 0) - value.emplace(static_cast<uint64_t>(signed_value)); - return false; - }); - return value; -} - lldb::ChildCacheState lldb_private::formatters::MsvcStlDequeSyntheticFrontEnd::Update() { m_size = 0; @@ -136,8 +104,11 @@ lldb_private::formatters::MsvcStlDequeSyntheticFrontEnd::Update() { if (!deque_type) return lldb::eRefetch; - auto block_size = getBlockSize(deque_type); - if (!block_size) + auto block_size_decl = deque_type.GetStaticFieldWithName("_Block_size"); + if (!block_size_decl) + return lldb::eRefetch; + auto block_size = block_size_decl.GetConstantValue(); + if (!block_size.IsValid()) return lldb::eRefetch; auto offset_sp = storage_sp->GetChildMemberWithName("_Myoff"); @@ -172,7 +143,7 @@ lldb_private::formatters::MsvcStlDequeSyntheticFrontEnd::Update() { m_map = map_sp.get(); m_exe_ctx_ref = m_backend.GetExecutionContextRef(); - m_block_size = *block_size; + m_block_size = block_size.ULongLong(); m_offset = offset; m_map_size = map_size; m_element_size = *element_size; _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
