gdb pretty printers for slices and optionals

This commit is contained in:
xackus 2020-11-23 00:19:18 +01:00 committed by Veikka Tuominen
parent 49ca51fc3a
commit 0a6ba6f666
2 changed files with 65 additions and 1 deletions

View file

@ -31,7 +31,7 @@ class BufPrinter:
def display_hint(self):
return 'string'
pp = gdb.printing.RegexpCollectionPrettyPrinter('zig')
pp = gdb.printing.RegexpCollectionPrettyPrinter('Zig stage1 compiler')
pp.add_printer('Buf', '^Buf$', BufPrinter)
pp.add_printer('ZigList<char>', '^ZigList<char>$', BufPrinter)
pp.add_printer('ZigList', '^ZigList<.*>$', ZigListPrinter)

View file

@ -0,0 +1,64 @@
# gdb pretty printers for Zig language constructs
import gdb.printing
class ZigPrettyPrinter(gdb.printing.PrettyPrinter):
def __init__(self):
super().__init__('Zig')
def __call__(self, val):
tag = val.type.tag
if(tag is None):
return None
if(tag == '[]u8'):
return StringPrinter(val)
if(tag.startswith('[]')):
return SlicePrinter(val)
if(tag.startswith('?')):
return OptionalPrinter(val)
return None
class SlicePrinter:
def __init__(self, val):
self.val = val
def to_string(self):
return f"{self.val['len']} items at {self.val['ptr']}"
def children(self):
def it(val):
for i in range(int(val['len'])):
item = val['ptr'] + i
yield (f'[{i}]', item.dereference())
return it(self.val)
def display_hint(self):
return 'array'
class StringPrinter:
def __init__(self, val):
self.val = val
def to_string(self):
return self.val['ptr'].string(length=int(self.val['len']))
def display_hint(self):
return 'string'
class OptionalPrinter:
def __init__(self, val):
self.val = val
def to_string(self):
if(self.val['maybe']):
return None # printed by children()
else:
return 'null'
def children(self):
def it(val):
if(val['maybe']):
yield ('payload', val['val'])
return it(self.val)
gdb.printing.register_pretty_printer(gdb.current_objfile(), ZigPrettyPrinter())