diff --git a/tools/zig-gdb.py b/tools/zig-gdb.py new file mode 100644 index 0000000000..f0efef9d2f --- /dev/null +++ b/tools/zig-gdb.py @@ -0,0 +1,39 @@ +# pretty printing for stage1 +# put "source /path/to/zig-gdb.py" in ~/.gdbinit to load it automatically + +import gdb.printing + +class ZigListPrinter: + def __init__(self, val): + self.val = val + + def to_string(self): + return '%s of length %d, capacity %d' % (self.val.type.name, int(self.val['length']), int(self.val['capacity'])) + + def children(self): + def it(ziglist): + for i in range(int(ziglist.val['length'])): + item = ziglist.val['items'] + i + yield ('[%d]' % i, item.dereference()) + return it(self) + + def display_hint(self): + return 'array' + +# handle both Buf and ZigList because Buf* doesn't work otherwise (gdb bug?) +class BufPrinter: + def __init__(self, val): + self.val = val['list'] if val.type.name == 'Buf' else val + + def to_string(self): + return self.val['items'].string(length=int(self.val['length'])) + + def display_hint(self): + return 'string' + +pp = gdb.printing.RegexpCollectionPrettyPrinter('zig') +pp.add_printer('Buf', '^Buf$', BufPrinter) +pp.add_printer('ZigList', '^ZigList$', BufPrinter) +pp.add_printer('ZigList', '^ZigList<.*>$', ZigListPrinter) + +gdb.printing.register_pretty_printer(gdb.current_objfile(), pp)