[Lldb-commits] [PATCH] Cleanup to simplify the formatter for std::map of libstdc++.
Siva Chandra
sivachandra at google.com
Wed Mar 18 15:04:25 PDT 2015
REPOSITORY
rL LLVM
http://reviews.llvm.org/D8424
Files:
lldb/trunk/examples/synthetic/gnu_libstdcpp.py
lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/TestDataFormatterStdMap.py
Index: lldb/trunk/examples/synthetic/gnu_libstdcpp.py
===================================================================
--- lldb/trunk/examples/synthetic/gnu_libstdcpp.py
+++ lldb/trunk/examples/synthetic/gnu_libstdcpp.py
@@ -325,39 +325,17 @@
if map_type.IsReferenceType():
logger >> "Dereferencing type"
map_type = map_type.GetDereferencedType()
-
- map_arg_0 = str(map_type.GetTemplateArgumentType(0).GetName())
- map_arg_1 = str(map_type.GetTemplateArgumentType(1).GetName())
-
- logger >> "map has args " + str(map_arg_0) + " and " + str(map_arg_1)
-
- map_arg_0,fixed_0 = self.fixup_class_name(map_arg_0)
- map_arg_1,fixed_1 = self.fixup_class_name(map_arg_1)
-
- logger >> "arg_0 has become: " + str(map_arg_0) + " (fixed: " + str(fixed_0) + ")"
- logger >> "arg_1 has become: " + str(map_arg_1) + " (fixed: " + str(fixed_1) + ")"
-
- # HACK: this is related to the above issue with the typename for std::string
- # being shortened by clang - the changes to typename display and searching to honor
- # namespaces make it so that we go looking for std::pair<const std::basic_string<char>, ...>
- # but when we find a type for this, we then compare it against the fully-qualified
- # std::pair<const std::basic_string<char, std::char_traits... and of course fail
- # the way to bypass this problem is to avoid using the std:: prefix in this specific case
- if fixed_0 or fixed_1:
- map_arg_type = "pair<const " + map_arg_0 + ", " + map_arg_1
- else:
- map_arg_type = "std::pair<const " + map_arg_0 + ", " + map_arg_1
-
- if map_arg_1[-1] == '>':
- map_arg_type = map_arg_type + " >"
- else:
- map_arg_type = map_arg_type + ">"
-
- logger >> "final contents datatype is: " + str(map_arg_type)
-
- self.data_type = self.valobj.GetTarget().FindFirstType(map_arg_type)
-
- logger >> "and the SBType is: " + str(self.data_type)
+
+ # Get the type of std::pair<key, value>. It is the first template
+ # argument type of the 4th template argument to std::map.
+ allocator_type = map_type.GetTemplateArgumentType(3)
+ self.data_type = allocator_type.GetTemplateArgumentType(0)
+ if not self.data_type:
+ # GCC does not emit DW_TAG_template_type_parameter for
+ # std::allocator<...>. For such a case, get the type of
+ # std::pair from a member of std::map.
+ rep_type = self.valobj.GetChildMemberWithName('_M_t').GetType()
+ self.data_type = rep_type.GetTypedefedType().GetTemplateArgumentType(1)
# from libstdc++ implementation of _M_root for rbtree
self.Mroot = self.Mheader.GetChildMemberWithName('_M_parent')
Index: lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/TestDataFormatterStdMap.py
===================================================================
--- lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/TestDataFormatterStdMap.py
+++ lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/TestDataFormatterStdMap.py
@@ -19,8 +19,6 @@
self.buildDsym()
self.data_formatter_commands()
- @skipIfGcc # llvm.org/pr15036: When built with GCC, this test causes lldb to crash with
- # assert DeclCXX.h:554 queried property of class with no definition
@expectedFailureIcc # llvm.org/pr15301: LLDB prints incorrect size of
# libstdc++ containers
@skipIfFreeBSD
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D8424.22215.patch
Type: text/x-patch
Size: 3458 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20150318/6995b060/attachment.bin>
More information about the lldb-commits
mailing list