llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-lldb

Author: Sergei Druzhkov (DrSergei)

<details>
<summary>Changes</summary>

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 &lt;unordered_map&gt;

int main() {
    std::unordered_map&lt;int, int&gt; 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&lt;std::pair&lt;int const, int&gt; 
&gt;")
                  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&lt;std::pair&lt;int const, int&gt; &gt;")
                    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&lt;std::pair&lt;int const, int&gt; &gt; *")
                      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&lt;std::pair&lt;int const, int&gt; &gt; *")
                      DW_AT_artificial  (true)

0x00002013:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00004ec3 "const 
std::allocator&lt;std::pair&lt;int const, int&gt; &gt; &amp;")

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&lt;std::pair&lt;int 
const, int&gt; &gt; &amp;")
                    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&lt;std::pair&lt;int const, int&gt; &gt; *")
                      DW_AT_artificial  (true)

0x00002036:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00004ec3 "const 
std::allocator&lt;std::pair&lt;int const, int&gt; &gt; &amp;")

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&lt;std::pair&lt;int const, int&gt; &gt; *")
                      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&lt;std::pair&lt;const int, int&gt; 
&gt;")
                  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&lt;const int, int&gt;")
                    DW_AT_name  ("_Tp")

0x00001a7a:       DW_TAG_inheritance
                    DW_AT_type  (0x00001ad5 
"std::__allocator_base&lt;std::pair&lt;const int, int&gt; &gt;")
                    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&lt;std::pair&lt;const int, int&gt; &gt; *")
                      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&lt;std::pair&lt;const int, int&gt; &gt; *")
                      DW_AT_artificial  (true)

0x00001a96:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00002dd6 "const 
std::allocator&lt;std::pair&lt;const int, int&gt; &gt; &amp;")

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&lt;std::pair&lt;const int, int&gt; &gt; &amp;")
                    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&lt;std::pair&lt;const int, int&gt; &gt; *")
                      DW_AT_artificial  (true)

0x00001aab:         DW_TAG_formal_parameter
                      DW_AT_type        (0x00002dd6 "const 
std::allocator&lt;std::pair&lt;const int, int&gt; &gt; &amp;")

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&lt;std::pair&lt;const int, int&gt; &gt; *")
                      DW_AT_artificial  (true)

0x00001abb:         NULL
```

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

---
Full diff: https://github.com/llvm/llvm-project/pull/164251.diff


1 Files Affected:

- (modified) lldb/examples/synthetic/gnu_libstdcpp.py (+5) 


``````````diff
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):

``````````

</details>


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

Reply via email to