From 05fd66d2f8b406e1e117c54ee64ceebfa6c9427e Mon Sep 17 00:00:00 2001 From: Siva Chandra Date: Wed, 18 Mar 2015 22:01:45 +0000 Subject: [PATCH] Cleanup to simplify the formatter for std::map of libstdc++. Summary: GCC does not emit some DWARF required for the simplified formatter to work. A workaround for it has been incorporated in the formatter. The corresponding test TestDataFormatterStdMap has also been enabled for GCC. Test Plan: dotest.py -C -p TestDataFormatterStdMap Reviewers: clayborg, vharron, granata.enrico Subscribers: lldb-commits Differential Revision: http://reviews.llvm.org/D8424 llvm-svn: 232678 --- lldb/examples/synthetic/gnu_libstdcpp.py | 44 ++++++---------------- .../libstdcpp/map/TestDataFormatterStdMap.py | 2 - 2 files changed, 11 insertions(+), 35 deletions(-) diff --git a/lldb/examples/synthetic/gnu_libstdcpp.py b/lldb/examples/synthetic/gnu_libstdcpp.py index 710783e..ca2d2a0 100644 --- a/lldb/examples/synthetic/gnu_libstdcpp.py +++ b/lldb/examples/synthetic/gnu_libstdcpp.py @@ -325,39 +325,17 @@ class StdMapSynthProvider: 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, ...> - # but when we find a type for this, we then compare it against the fully-qualified - # std::pair': - 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. 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') diff --git a/lldb/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/TestDataFormatterStdMap.py b/lldb/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/TestDataFormatterStdMap.py index a349168..c7cc5ae 100644 --- a/lldb/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/TestDataFormatterStdMap.py +++ b/lldb/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/TestDataFormatterStdMap.py @@ -19,8 +19,6 @@ class StdMapDataFormatterTestCase(TestBase): 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 -- 2.7.4