[Lldb-commits] [lldb] [LLDB] Run MSVC STL deque tests with PDB (PR #172360)
via lldb-commits
lldb-commits at lists.llvm.org
Tue Dec 16 10:34:19 PST 2025
https://github.com/Nerixyz updated https://github.com/llvm/llvm-project/pull/172360
>From a898ac2e2987085420d68806388be4bf1e26aeb2 Mon Sep 17 00:00:00 2001
From: Nerixyz <nerixdev at outlook.de>
Date: Thu, 6 Nov 2025 20:56:27 +0100
Subject: [PATCH 1/3] [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 <nerixdev at outlook.de>
Date: Tue, 16 Dec 2025 19:32:24 +0100
Subject: [PATCH 2/3] 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;
>From 248f7fd0bfbf883580dbc1173a973e49c7b42e13 Mon Sep 17 00:00:00 2001
From: Nerixyz <nerixdev at outlook.de>
Date: Tue, 16 Dec 2025 19:34:05 +0100
Subject: [PATCH 3/3] chore: add comment about PDB
---
lldb/source/Plugins/Language/CPlusPlus/MsvcStlDeque.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/lldb/source/Plugins/Language/CPlusPlus/MsvcStlDeque.cpp b/lldb/source/Plugins/Language/CPlusPlus/MsvcStlDeque.cpp
index aa313abb04be2..5330f692bd7a9 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/MsvcStlDeque.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/MsvcStlDeque.cpp
@@ -133,6 +133,7 @@ lldb_private::formatters::MsvcStlDequeSyntheticFrontEnd::Update() {
auto element_type = deque_type.GetTypeTemplateArgument(0);
if (!element_type) {
+ // PDB doesn't have the template type, so use the type of _Map (T**).
element_type = map_sp->GetCompilerType().GetPointeeType().GetPointeeType();
if (!element_type)
return lldb::eRefetch;
More information about the lldb-commits
mailing list