Commit 0a6ba6f666
Changed files (2)
tools/zig-gdb.py
@@ -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)
tools/zig_gdb_pretty_printers.py
@@ -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())