From 8c493ead6366b552adee796de296936b78f34c5a Mon Sep 17 00:00:00 2001 From: Ben Cheng Date: Sat, 17 May 2014 17:03:43 -0700 Subject: [4.9] Refresh GCC 4.9 to the 20140514 snapshot. For critical bug fixes including devirtualization and codegen. Change-Id: I8138d3dc408fc12db5eecb01d2753d39219712f2 --- .../libstdc++-v3/python/libstdcxx/v6/printers.py | 25 +++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'gcc-4.9/libstdc++-v3/python/libstdcxx/v6') diff --git a/gcc-4.9/libstdc++-v3/python/libstdcxx/v6/printers.py b/gcc-4.9/libstdc++-v3/python/libstdcxx/v6/printers.py index 05da17b61..1f1f860a5 100644 --- a/gcc-4.9/libstdc++-v3/python/libstdcxx/v6/printers.py +++ b/gcc-4.9/libstdc++-v3/python/libstdcxx/v6/printers.py @@ -375,6 +375,22 @@ class RbtreeIterator: self.node = node return result +def get_value_from_Rb_tree_node(node): + """Returns the value held in an _Rb_tree_node<_Val>""" + try: + member = node.type.fields()[1].name + if member == '_M_value_field': + # C++03 implementation, node contains the value as a member + return node['_M_value_field'] + elif member == '_M_storage': + # C++11 implementation, node stores value in __aligned_buffer + p = node['_M_storage']['_M_storage'].address + p = p.cast(node.type.template_argument(0).pointer()) + return p.dereference() + except: + pass + raise ValueError, "Unsupported implementation for %s" % str(node.type) + # This is a pretty printer for std::_Rb_tree_iterator (which is # std::map::iterator), and has nothing to do with the RbtreeIterator # class above. @@ -387,7 +403,8 @@ class StdRbtreeIteratorPrinter: def to_string (self): typename = str(self.val.type.strip_typedefs()) + '::_Link_type' nodetype = gdb.lookup_type(typename).strip_typedefs() - return self.val.cast(nodetype).dereference()['_M_value_field'] + node = self.val.cast(nodetype).dereference() + return get_value_from_Rb_tree_node(node) class StdDebugIteratorPrinter: "Print a debug enabled version of an iterator" @@ -417,7 +434,8 @@ class StdMapPrinter: def next(self): if self.count % 2 == 0: n = self.rbiter.next() - n = n.cast(self.type).dereference()['_M_value_field'] + n = n.cast(self.type).dereference() + n = get_value_from_Rb_tree_node(n) self.pair = n item = n['first'] else: @@ -458,7 +476,8 @@ class StdSetPrinter: def next(self): item = self.rbiter.next() - item = item.cast(self.type).dereference()['_M_value_field'] + item = item.cast(self.type).dereference() + item = get_value_from_Rb_tree_node(item) # FIXME: this is weird ... what to do? # Maybe a 'set' display hint? result = ('[%d]' % self.count, item) -- cgit v1.2.3