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/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 <[email protected]>
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 <[email protected]>
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;

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to