https://github.com/DrSergei created 
https://github.com/llvm/llvm-project/pull/164251

This patch adds small workaround for 
[issue](https://github.com/llvm/llvm-project/issues/152504). It looks like code 
compiled with gcc has lack of some important debug information (e.g. 
DW_TAG_template_type_parameter for allocator).

Example code:
```cpp
#include <unordered_map>

int main() {
    std::unordered_map<int, int> map = {
        {1, 2}
    };
    return 0;
}
```

Output from `llvm-dwarfdump` for code compiled by GCC or Clang.

GCC:
```
0x00001fcd:     DW_TAG_class_type
                  DW_AT_name    ("allocator<std::pair<int const, int> >")
                  DW_AT_byte_size       (0x01)
                  DW_AT_decl_file       ("/usr/include/c++/13/bits/allocator.h")
                  DW_AT_decl_line       (130)
                  DW_AT_decl_column     (11)
                  DW_AT_sibling (0x0000207c)

0x00001fda:       DW_TAG_inheritance
                    DW_AT_type  (0x00001d0a "std::__new_allocator<std::pair<int 
const, int> >")
                    DW_AT_data_member_location  (0)
                    DW_AT_accessibility (DW_ACCESS_public)

0x00001fe0:       DW_TAG_subprogram
                    DW_AT_external      (true)
                    DW_AT_name  ("allocator")
                    DW_AT_decl_file     ("/usr/include/c++/13/bits/allocator.h")
                    DW_AT_decl_line     (163)
                    DW_AT_decl_column   (7)
                    DW_AT_linkage_name  ("_ZNSaISt4pairIKiiEEC4Ev")
                    DW_AT_accessibility (DW_ACCESS_public)
                    DW_AT_declaration   (true)
                    DW_AT_object_pointer        (0x00001ff4)
                    DW_AT_sibling       (0x00001ffa)

0x00001ff4:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00004eb9 
"std::allocator<std::pair<int const, int> > *")
                      DW_AT_artificial  (true)

0x00001ff9:         NULL

0x00001ffa:       DW_TAG_subprogram
                    DW_AT_external      (true)
                    DW_AT_name  ("allocator")
                    DW_AT_decl_file     ("/usr/include/c++/13/bits/allocator.h")
                    DW_AT_decl_line     (167)
                    DW_AT_decl_column   (7)
                    DW_AT_linkage_name  ("_ZNSaISt4pairIKiiEEC4ERKS2_")
                    DW_AT_accessibility (DW_ACCESS_public)
                    DW_AT_declaration   (true)
                    DW_AT_object_pointer        (0x0000200e)
                    DW_AT_sibling       (0x00002019)

0x0000200e:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00004eb9 
"std::allocator<std::pair<int const, int> > *")
                      DW_AT_artificial  (true)

0x00002013:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00004ec3 "const 
std::allocator<std::pair<int const, int> > &")

0x00002018:         NULL

0x00002019:       DW_TAG_subprogram
                    DW_AT_external      (true)
                    DW_AT_name  ("operator=")
                    DW_AT_decl_file     ("/usr/include/c++/13/bits/allocator.h")
                    DW_AT_decl_line     (172)
                    DW_AT_decl_column   (18)
                    DW_AT_linkage_name  ("_ZNSaISt4pairIKiiEEaSERKS2_")
                    DW_AT_type  (0x00004ec8 "std::allocator<std::pair<int 
const, int> > &")
                    DW_AT_accessibility (DW_ACCESS_public)
                    DW_AT_declaration   (true)
                    DW_AT_defaulted     (DW_DEFAULTED_in_class)
                    DW_AT_object_pointer        (0x00002031)
                    DW_AT_sibling       (0x0000203c)

0x00002031:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00004eb9 
"std::allocator<std::pair<int const, int> > *")
                      DW_AT_artificial  (true)

0x00002036:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00004ec3 "const 
std::allocator<std::pair<int const, int> > &")

0x0000203b:         NULL

0x0000203c:       DW_TAG_subprogram
                    DW_AT_external      (true)
                    DW_AT_name  ("~allocator")
                    DW_AT_decl_file     ("/usr/include/c++/13/bits/allocator.h")
                    DW_AT_decl_line     (184)
                    DW_AT_decl_column   (7)
                    DW_AT_linkage_name  ("_ZNSaISt4pairIKiiEED4Ev")
                    DW_AT_accessibility (DW_ACCESS_public)
                    DW_AT_declaration   (true)
                    DW_AT_object_pointer        (0x00002050)
                    DW_AT_sibling       (0x0000205b)

0x00002050:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00004eb9 
"std::allocator<std::pair<int const, int> > *")
                      DW_AT_artificial  (true)

0x00002055:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00004cab "int")
                      DW_AT_artificial  (true)

0x0000205a:         NULL
```

Clang:
```
0x00001a6e:     DW_TAG_class_type
                  DW_AT_calling_convention      (DW_CC_pass_by_reference)
                  DW_AT_name    ("allocator<std::pair<const int, int> >")
                  DW_AT_byte_size       (0x01)
                  DW_AT_decl_file       
("/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/allocator.h")
                  DW_AT_decl_line       (130)

0x00001a74:       DW_TAG_template_type_parameter
                    DW_AT_type  (0x00000dec "std::pair<const int, int>")
                    DW_AT_name  ("_Tp")

0x00001a7a:       DW_TAG_inheritance
                    DW_AT_type  (0x00001ad5 
"std::__allocator_base<std::pair<const int, int> >")
                    DW_AT_data_member_location  (0x00)
                    DW_AT_accessibility (DW_ACCESS_public)

0x00001a81:       DW_TAG_subprogram
                    DW_AT_name  ("allocator")
                    DW_AT_decl_file     
("/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/allocator.h")
                    DW_AT_decl_line     (163)
                    DW_AT_declaration   (true)
                    DW_AT_external      (true)
                    DW_AT_accessibility (DW_ACCESS_public)

0x00001a86:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00002dd1 
"std::allocator<std::pair<const int, int> > *")
                      DW_AT_artificial  (true)

0x00001a8b:         NULL

0x00001a8c:       DW_TAG_subprogram
                    DW_AT_name  ("allocator")
                    DW_AT_decl_file     
("/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/allocator.h")
                    DW_AT_decl_line     (167)
                    DW_AT_declaration   (true)
                    DW_AT_external      (true)
                    DW_AT_accessibility (DW_ACCESS_public)

0x00001a91:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00002dd1 
"std::allocator<std::pair<const int, int> > *")
                      DW_AT_artificial  (true)

0x00001a96:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00002dd6 "const 
std::allocator<std::pair<const int, int> > &")

0x00001a9b:         NULL

0x00001a9c:       DW_TAG_subprogram
                    DW_AT_linkage_name  ("_ZNSaISt4pairIKiiEEaSERKS2_")
                    DW_AT_name  ("operator=")
                    DW_AT_decl_file     
("/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/allocator.h")
                    DW_AT_decl_line     (172)
                    DW_AT_type  (0x00002de0 "std::allocator<std::pair<const 
int, int> > &")
                    DW_AT_declaration   (true)
                    DW_AT_external      (true)
                    DW_AT_accessibility (DW_ACCESS_public)

0x00001aa6:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00002dd1 
"std::allocator<std::pair<const int, int> > *")
                      DW_AT_artificial  (true)

0x00001aab:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00002dd6 "const 
std::allocator<std::pair<const int, int> > &")

0x00001ab0:         NULL

0x00001ab1:       DW_TAG_subprogram
                    DW_AT_name  ("~allocator")
                    DW_AT_decl_file     
("/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/allocator.h")
                    DW_AT_decl_line     (184)
                    DW_AT_declaration   (true)
                    DW_AT_external      (true)
                    DW_AT_accessibility (DW_ACCESS_public)

0x00001ab6:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00002dd1 
"std::allocator<std::pair<const int, int> > *")
                      DW_AT_artificial  (true)

0x00001abb:         NULL
```

I propose to add fallback implementation based on type of `_M_h`.

>From e63e7da9d66e4700af8a7e3eb26b38314d0c0171 Mon Sep 17 00:00:00 2001
From: Druzhkov Sergei <[email protected]>
Date: Mon, 20 Oct 2025 15:45:30 +0300
Subject: [PATCH] [lldb] Fix StdUnorderedMapSynthProvider for GCC

---
 lldb/examples/synthetic/gnu_libstdcpp.py | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/lldb/examples/synthetic/gnu_libstdcpp.py 
b/lldb/examples/synthetic/gnu_libstdcpp.py
index f42a009c21f48..54d6248185fda 100644
--- a/lldb/examples/synthetic/gnu_libstdcpp.py
+++ b/lldb/examples/synthetic/gnu_libstdcpp.py
@@ -68,6 +68,11 @@ def extract_type(self):
         template_arg_num = type.GetNumberOfTemplateArguments() - 1
         allocator_type = type.GetTemplateArgumentType(template_arg_num)
         data_type = allocator_type.GetTemplateArgumentType(0)
+        if data_type.IsValid():
+            return data_type
+        type = self.head.GetType()
+        head_type = type.GetTypedefedType().GetTypedefedType()
+        data_type = head_type.GetTemplateArgumentType(1)
         return data_type
 
     def update(self):

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

Reply via email to