diff options
author | Siva Chandra <sivachandra@google.com> | 2015-03-18 22:01:45 +0000 |
---|---|---|
committer | Siva Chandra <sivachandra@google.com> | 2015-03-18 22:01:45 +0000 |
commit | 05fd66d2f8b406e1e117c54ee64ceebfa6c9427e (patch) | |
tree | e2a5c16b8085b6bf5402ac9829ed7fcb8c95dd8a | |
parent | e45f94b148fc101c9c5330387528f21c8fb08b7e (diff) | |
download | bcm5719-llvm-05fd66d2f8b406e1e117c54ee64ceebfa6c9427e.tar.gz bcm5719-llvm-05fd66d2f8b406e1e117c54ee64ceebfa6c9427e.zip |
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 <clang|gcc> -p TestDataFormatterStdMap
Reviewers: clayborg, vharron, granata.enrico
Subscribers: lldb-commits
Differential Revision: http://reviews.llvm.org/D8424
llvm-svn: 232678
-rw-r--r-- | lldb/examples/synthetic/gnu_libstdcpp.py | 44 | ||||
-rw-r--r-- | lldb/test/functionalities/data-formatter/data-formatter-stl/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 710783ef78f..ca2d2a0eb42 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<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') 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 a349168d849..c7cc5ae2146 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 |