Reenable gdb pretty printers, and update them.

Libcxx gdb pretty printers were disabled due to an old version
of gdb in the release testing. This reenables them, and fixes
various bit rot issues from not running them.
This commit is contained in:
Sterling Augustine 2022-10-10 15:26:14 -07:00
parent 2b2afb2529
commit e4d5daaf91
2 changed files with 36 additions and 13 deletions

View File

@ -11,9 +11,6 @@
// UNSUPPORTED: no-localization
// UNSUPPORTED: c++03
// TODO: Investigate this failure, which happens only with the Bootstrapping build.
// UNSUPPORTED: clang-14, clang-15, clang-16
// TODO: Investigate this failure on GCC 12 (in Ubuntu Jammy)
// UNSUPPORTED: gcc-12

View File

@ -64,6 +64,36 @@ def _remove_generics(typename):
return match.group(1)
def _cc_field(node):
"""Previous versions of libcxx had inconsistent field naming naming. Handle
both types.
"""
try:
return node["__value_"]["__cc_"]
except:
return node["__value_"]["__cc"]
def _data_field(node):
"""Previous versions of libcxx had inconsistent field naming naming. Handle
both types.
"""
try:
return node["__data_"]
except:
return node["__data"]
def _size_field(node):
"""Previous versions of libcxx had inconsistent field naming naming. Handle
both types.
"""
try:
return node["__size_"]
except:
return node["__size"]
# Some common substitutions on the types to reduce visual clutter (A user who
# wants to see the actual details can always use print/r).
_common_substitutions = [
@ -197,12 +227,9 @@ class StdStringPrinter(object):
def to_string(self):
"""Build a python string from the data whether stored inline or separately."""
value_field = _value_of_pair_first(self.val["__r_"])
short_field = value_field["__s"]
short_size = short_field["__size_"]
if short_size == 0:
return ""
if short_field["__is_long_"]:
long_field = value_field["__l"]
data = long_field["__data_"]
@ -228,9 +255,9 @@ class StdStringViewPrinter(object):
def to_string(self): # pylint: disable=g-bad-name
"""GDB calls this to compute the pretty-printed form."""
ptr = self.val["__data"]
ptr = _data_field(self.val)
ptr = ptr.cast(ptr.type.target().strip_typedefs().pointer())
size = self.val["__size"]
size = _size_field(self.val)
return ptr.lazy_string(length=size)
@ -667,8 +694,7 @@ class StdMapPrinter(AbstractRBTreePrinter):
return "map"
def _get_key_value(self, node):
key_value = node.cast(self.util.cast_type).dereference()[
"__value_"]["__cc"]
key_value = _cc_field(node.cast(self.util.cast_type).dereference())
return [key_value["first"], key_value["second"]]
@ -734,7 +760,7 @@ class MapIteratorPrinter(AbstractRBTreeIteratorPrinter):
_remove_generics(_prettify_typename(val.type)))
def _get_node_value(self, node):
return node["__value_"]["__cc"]
return _cc_field(node)
class SetIteratorPrinter(AbstractRBTreeIteratorPrinter):
@ -821,7 +847,7 @@ class StdUnorderedMapPrinter(AbstractUnorderedCollectionPrinter):
"""Print a std::unordered_(multi)map."""
def _get_key_value(self, node):
key_value = node["__value_"]["__cc"]
key_value = _cc_field(node)
return [key_value["first"], key_value["second"]]
def display_hint(self):
@ -877,7 +903,7 @@ class StdUnorderedMapIteratorPrinter(AbstractHashMapIteratorPrinter):
self._initialize(val, val["__i_"]["__node_"])
def _get_key_value(self):
key_value = self.node["__value_"]["__cc"]
key_value = _cc_field(self.node)
return [key_value["first"], key_value["second"]]
def display_hint(self):