From dabaf6d903591032a3bec7e30b777b7e3220f84f Mon Sep 17 00:00:00 2001 From: Patrick Wuttke Date: Fri, 10 Nov 2023 14:04:08 +0100 Subject: [PATCH] Added simple gdb pretty-printer (only StrideSpan and StrideSpanIterator for now). --- extra/gdb_pretty_printer.py | 86 +++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 extra/gdb_pretty_printer.py diff --git a/extra/gdb_pretty_printer.py b/extra/gdb_pretty_printer.py new file mode 100644 index 0000000..8e1928d --- /dev/null +++ b/extra/gdb_pretty_printer.py @@ -0,0 +1,86 @@ + +import gdb +import gdb.printing + +if hasattr(gdb, 'ValuePrinter'): + printer_base = gdb.ValuePrinter +else: + printer_base = object + + +class MijinStrideSpanIteratorPrinter(printer_base): + """Print a mijin::StrideSpanIterator.""" + class _iterator: + def __init__(self, val): + self._val = val + + def __iter__(self): + return self + + def __next__(self): + if self._val is None: + raise StopIteration + self._val, val = None, self._val + return ('ele', val.dereference()) + + def __init__(self, val): + self._val = val + + def children(self): + return self._iterator(self._val['ele_']) + + def to_string(self): + t = self._val.type.template_argument(0) + return 'mijin::StrideSpanIterator<%s> with stride %d' % (str(t), self._val['strideBytes_']) + + def display_hint(self): + return None # 'array' + +class MijinStrideSpanPrinter(printer_base): + """Print a mijin::StrideSpan.""" + + class _iterator: + def __init__(self, start, finish, stride_bytes): + self._stride_bytes = stride_bytes + self._item = start + self._finish = finish + self._count = 0 + + def __iter__(self): + return self + + def __next__(self): + count = self._count + self._count = self._count + 1 + if self._item == self._finish: + raise StopIteration + elt = self._item.dereference() + self._item = (self._item.cast(gdb.lookup_type('size_t')) + self._stride_bytes).cast(self._finish.type) + return ('[%d]' % count, elt) + + def __init__(self, val): + self._typename = str(val.type) + self._val = val + + def children(self): + return self._iterator(self._val['begin_'], + self._val['end_'], + self._val['strideBytes_']) + + def to_string(self): + start = self._val['begin_'] + finish = self._val['end_'] + strideBytes = self._val['strideBytes_'] + return ('%s of length %d, stride %d' + % (self._typename, int(finish - start) / strideBytes, strideBytes)) + + def display_hint(self): + return 'array' + +def build_pretty_printer(): + printer = gdb.printing.gdb.printing.RegexpCollectionPrettyPrinter('mijin_pp') + printer.add_printer('mijin::StrideSpan', r"^mijin::StrideSpan<.*>$", MijinStrideSpanPrinter) + printer.add_printer('mijin::StrideSpanIterator', r"^mijin::StrideSpanIterator<.*>$", MijinStrideSpanIteratorPrinter) + return printer + +gdb.printing.register_pretty_printer(gdb.current_objfile(), build_pretty_printer()) \ No newline at end of file