Skip to content

Commit

Permalink
Reenable gdb pretty printers, and update them.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Sterling-Augustine committed Oct 11, 2022
1 parent 2b2afb2 commit e4d5daa
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 13 deletions.
3 changes: 0 additions & 3 deletions libcxx/test/libcxx/gdb/gdb_pretty_printer_test.sh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
46 changes: 36 additions & 10 deletions libcxx/utils/gdb/libcxx/printers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = [
Expand Down Expand Up @@ -197,12 +227,9 @@ def __init__(self, val):

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_"]
Expand All @@ -228,9 +255,9 @@ def display_hint(self):
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)


Expand Down Expand Up @@ -667,8 +694,7 @@ def display_hint(self):
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"]]


Expand Down Expand Up @@ -734,7 +760,7 @@ def __init__(self, val):
_remove_generics(_prettify_typename(val.type)))

def _get_node_value(self, node):
return node["__value_"]["__cc"]
return _cc_field(node)


class SetIteratorPrinter(AbstractRBTreeIteratorPrinter):
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -877,7 +903,7 @@ def __init__(self, val):
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):
Expand Down

0 comments on commit e4d5daa

Please sign in to comment.