Commit 0a6ba6f666

xackus <14938807+xackus@users.noreply.github.com>
2020-11-23 00:19:18
gdb pretty printers for slices and optionals
1 parent 49ca51f
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())