Added simple gdb pretty-printer (only StrideSpan and StrideSpanIterator for now).

This commit is contained in:
Patrick 2023-11-10 14:04:08 +01:00
parent 938135768b
commit dabaf6d903

View File

@ -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())