Commit 5776d8f270

Jacob Young <jacobly0@users.noreply.github.com>
2024-12-20 22:37:25
lldb: add pretty printer for cau and nav indices
1 parent 5c76e08
Changed files (2)
src/InternPool.zig
@@ -470,6 +470,8 @@ pub const Cau = struct {
                     _ => @enumFromInt(@intFromEnum(opt)),
                 };
             }
+
+            const debug_state = InternPool.debug_state;
         };
         pub fn toOptional(i: Cau.Index) Optional {
             return @enumFromInt(@intFromEnum(i));
@@ -491,6 +493,8 @@ pub const Cau = struct {
                 .index = @intFromEnum(cau_index) & ip.getIndexMask(u31),
             };
         }
+
+        const debug_state = InternPool.debug_state;
     };
 };
 
@@ -568,6 +572,8 @@ pub const Nav = struct {
                     _ => @enumFromInt(@intFromEnum(opt)),
                 };
             }
+
+            const debug_state = InternPool.debug_state;
         };
         pub fn toOptional(i: Nav.Index) Optional {
             return @enumFromInt(@intFromEnum(i));
@@ -589,6 +595,8 @@ pub const Nav = struct {
                 .index = @intFromEnum(nav_index) & ip.getIndexMask(u32),
             };
         }
+
+        const debug_state = InternPool.debug_state;
     };
 
     /// The compact in-memory representation of a `Nav`.
@@ -5271,17 +5279,26 @@ pub const Tag = enum(u8) {
 
         .type_int_signed = .{ .summary = .@"i{.data%value}", .data = u32 },
         .type_int_unsigned = .{ .summary = .@"u{.data%value}", .data = u32 },
-        .type_array_big = .{ .summary = .@"[{.payload.len1%value} << 32 | {.payload.len0%value}:{.payload.sentinel%summary}]{.payload.child%summary}", .payload = Array },
+        .type_array_big = .{
+            .summary = .@"[{.payload.len1%value} << 32 | {.payload.len0%value}:{.payload.sentinel%summary}]{.payload.child%summary}",
+            .payload = Array,
+        },
         .type_array_small = .{ .summary = .@"[{.payload.len%value}]{.payload.child%summary}", .payload = Vector },
         .type_vector = .{ .summary = .@"@Vector({.payload.len%value}, {.payload.child%summary})", .payload = Vector },
         .type_pointer = .{ .summary = .@"*... {.payload.child%summary}", .payload = TypePointer },
         .type_slice = .{ .summary = .@"[]... {.data.unwrapped.payload.child%summary}", .data = Index },
         .type_optional = .{ .summary = .@"?{.data%summary}", .data = Index },
         .type_anyframe = .{ .summary = .@"anyframe->{.data%summary}", .data = Index },
-        .type_error_union = .{ .summary = .@"{.payload.error_set_type%summary}!{.payload.payload_type%summary}", .payload = ErrorUnionType },
+        .type_error_union = .{
+            .summary = .@"{.payload.error_set_type%summary}!{.payload.payload_type%summary}",
+            .payload = ErrorUnionType,
+        },
         .type_anyerror_union = .{ .summary = .@"anyerror!{.data%summary}", .data = Index },
         .type_error_set = .{ .summary = .@"error{...}", .payload = ErrorSet },
-        .type_inferred_error_set = .{ .summary = .@"@typeInfo(@typeInfo(@TypeOf({.data%summary})).@\"fn\".return_type.?).error_union.error_set", .data = Index },
+        .type_inferred_error_set = .{
+            .summary = .@"@typeInfo(@typeInfo(@TypeOf({.data%summary})).@\"fn\".return_type.?).error_union.error_set",
+            .data = Index,
+        },
         .type_enum_auto = .{
             .summary = .@"{.payload.name%summary#\"}",
             .payload = EnumAuto,
@@ -5307,12 +5324,8 @@ pub const Tag = enum(u8) {
         .type_opaque = .{
             .summary = .@"{.payload.name%summary#\"}",
             .payload = TypeOpaque,
-            .trailing = struct {
-                captures: []CaptureValue,
-            },
-            .config = .{
-                .@"trailing.captures.len" = .@"payload.captures_len",
-            },
+            .trailing = struct { captures: []CaptureValue },
+            .config = .{ .@"trailing.captures.len" = .@"payload.captures_len" },
         },
         .type_struct = .{
             .summary = .@"{.payload.name%summary#\"}",
@@ -5438,17 +5451,50 @@ pub const Tag = enum(u8) {
 
         .undef = .{ .summary = .@"@as({.data%summary}, undefined)", .data = Index },
         .simple_value = .{ .summary = .@"{.index%value#.}", .index = SimpleValue },
-        .ptr_nav = .{ .payload = PtrNav },
-        .ptr_comptime_alloc = .{ .payload = PtrComptimeAlloc },
-        .ptr_uav = .{ .payload = PtrUav },
-        .ptr_uav_aligned = .{ .payload = PtrUavAligned },
-        .ptr_comptime_field = .{ .payload = PtrComptimeField },
-        .ptr_int = .{ .payload = PtrInt },
-        .ptr_eu_payload = .{ .payload = PtrBase },
-        .ptr_opt_payload = .{ .payload = PtrBase },
-        .ptr_elem = .{ .payload = PtrBaseIndex },
-        .ptr_field = .{ .payload = PtrBaseIndex },
-        .ptr_slice = .{ .payload = PtrSlice },
+        .ptr_nav = .{
+            .summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(&{.payload.nav.fqn%summary#\"}) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
+            .payload = PtrNav,
+        },
+        .ptr_comptime_alloc = .{
+            .summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(&comptime_allocs[{.payload.index%summary}]) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
+            .payload = PtrComptimeAlloc,
+        },
+        .ptr_uav = .{
+            .summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(&{.payload.val%summary}) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
+            .payload = PtrUav,
+        },
+        .ptr_uav_aligned = .{
+            .summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(@as({.payload.orig_ty%summary}, &{.payload.val%summary})) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
+            .payload = PtrUavAligned,
+        },
+        .ptr_comptime_field = .{
+            .summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(&{.payload.field_val%summary}) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
+            .payload = PtrComptimeField,
+        },
+        .ptr_int = .{
+            .summary = .@"@as({.payload.ty%summary}, @ptrFromInt({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value}))",
+            .payload = PtrInt,
+        },
+        .ptr_eu_payload = .{
+            .summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(&({.payload.base%summary} catch unreachable)) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
+            .payload = PtrBase,
+        },
+        .ptr_opt_payload = .{
+            .summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(&{.payload.base%summary}.?) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
+            .payload = PtrBase,
+        },
+        .ptr_elem = .{
+            .summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(&{.payload.base%summary}[{.payload.index%summary}]) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
+            .payload = PtrBaseIndex,
+        },
+        .ptr_field = .{
+            .summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(&{.payload.base%summary}[{.payload.index%summary}]) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
+            .payload = PtrBaseIndex,
+        },
+        .ptr_slice = .{
+            .summary = .@"{.payload.ptr%summary}[0..{.payload.len%summary}]",
+            .payload = PtrSlice,
+        },
         .opt_payload = .{ .summary = .@"@as({.payload.ty%summary}, {.payload.val%summary})", .payload = TypeValue },
         .opt_null = .{ .summary = .@"@as({.data%summary}, null)", .data = Index },
         .int_u8 = .{ .summary = .@"@as(u8, {.data%value})", .data = u8 },
@@ -5476,18 +5522,16 @@ pub const Tag = enum(u8) {
         .float_c_longdouble_f80 = .{ .summary = .@"@as(c_longdouble, {.payload%value})", .payload = f80 },
         .float_c_longdouble_f128 = .{ .summary = .@"@as(c_longdouble, {.payload%value})", .payload = f128 },
         .float_comptime_float = .{ .summary = .@"{.payload%value}", .payload = f128 },
-        .variable = .{ .payload = Variable },
-        .@"extern" = .{ .payload = Extern },
+        .variable = .{ .summary = .@"{.payload.owner_nav.fqn%summary#\"}", .payload = Variable },
+        .@"extern" = .{ .summary = .@"{.payload.owner_nav.fqn%summary#\"}", .payload = Extern },
         .func_decl = .{
+            .summary = .@"{.payload.owner_nav.fqn%summary#\"}",
             .payload = FuncDecl,
-            .trailing = struct {
-                inferred_error_set: ?Index,
-            },
-            .config = .{
-                .@"trailing.inferred_error_set.?" = .@"payload.analysis.inferred_error_set",
-            },
+            .trailing = struct { inferred_error_set: ?Index },
+            .config = .{ .@"trailing.inferred_error_set.?" = .@"payload.analysis.inferred_error_set" },
         },
         .func_instance = .{
+            .summary = .@"{.payload.owner_nav.fqn%summary#\"}",
             .payload = FuncInstance,
             .trailing = struct {
                 inferred_error_set: ?Index,
@@ -5498,30 +5542,26 @@ pub const Tag = enum(u8) {
                 .@"trailing.param_values.len" = .@"payload.ty.payload.params_len",
             },
         },
-        .func_coerced = .{ .payload = FuncCoerced },
+        .func_coerced = .{
+            .summary = .@"@as(*const {.payload.ty%summary}, @ptrCast(&{.payload.func%summary})).*",
+            .payload = FuncCoerced,
+        },
         .only_possible_value = .{ .summary = .@"@as({.data%summary}, undefined)", .data = Index },
         .union_value = .{ .summary = .@"@as({.payload.ty%summary}, {})", .payload = Union },
         .bytes = .{ .summary = .@"@as({.payload.ty%summary}, {.payload.bytes%summary}.*)", .payload = Bytes },
         .aggregate = .{
             .summary = .@"@as({.payload.ty%summary}, .{...})",
             .payload = Aggregate,
-            .trailing = struct {
-                elements: []Index,
-            },
-            .config = .{
-                .@"trailing.elements.len" = .@"payload.ty.payload.fields_len",
-            },
+            .trailing = struct { elements: []Index },
+            .config = .{ .@"trailing.elements.len" = .@"payload.ty.payload.fields_len" },
         },
         .repeated = .{ .summary = .@"@as({.payload.ty%summary}, @splat({.payload.elem_val%summary}))", .payload = Repeated },
 
         .memoized_call = .{
+            .summary = .@"@memoize({.payload.func%summary})",
             .payload = MemoizedCall,
-            .trailing = struct {
-                arg_values: []Index,
-            },
-            .config = .{
-                .@"trailing.arg_values.len" = .@"payload.args_len",
-            },
+            .trailing = struct { arg_values: []Index },
+            .config = .{ .@"trailing.arg_values.len" = .@"payload.args_len" },
         },
     };
     fn Payload(comptime tag: Tag) type {
@@ -6490,6 +6530,10 @@ pub fn activate(ip: *const InternPool) void {
     _ = OptionalString.debug_state;
     _ = NullTerminatedString.debug_state;
     _ = OptionalNullTerminatedString.debug_state;
+    _ = Cau.Index.debug_state;
+    _ = Cau.Index.Optional.debug_state;
+    _ = Nav.Index.debug_state;
+    _ = Nav.Index.Optional.debug_state;
     std.debug.assert(debug_state.intern_pool == null);
     debug_state.intern_pool = ip;
 }
tools/lldb_pretty_printers.py
@@ -18,17 +18,14 @@ def create_struct(parent, name, struct_type, inits):
     for field in struct_type.fields:
         field_size = field.type.size
         field_init = inits[field.name]
-        field_init_type = type(field_init)
-        if field_init_type == bool:
-            field_bytes = bytes([field_init])
-        elif field_init_type == int:
+        if isinstance(field_init, int):
             match struct_data.byte_order:
                 case lldb.eByteOrderLittle:
                     byte_order = 'little'
                 case lldb.eByteOrderBig:
                     byte_order = 'big'
             field_bytes = field_init.to_bytes(field_size, byte_order, signed=field.type.GetTypeFlags() & lldb.eTypeIsSigned != 0)
-        elif field_init_type == lldb.SBValue:
+        elif isinstance(field_init_type, lldb.SBValue):
             field_bytes = field_init.data.uint8
         else: return
         match struct_data.byte_order:
@@ -731,6 +728,7 @@ class root_InternPool_Local_List_SynthProvider:
 expr_path_re = re.compile(r'\{([^}]+)%([^%#}]+)(?:#([^%#}]+))?\}')
 def root_InternPool_Index_SummaryProvider(value, _=None):
     unwrapped = value.GetChildMemberWithName('unwrapped')
+    if not unwrapped: return '' # .none
     tag = unwrapped.GetChildMemberWithName('tag')
     tag_value = tag.value
     summary = tag.CreateValueFromType(tag.type).GetChildMemberWithName('encodings').GetChildMemberWithName(tag_value.removeprefix('.')).GetChildMemberWithName('summary')
@@ -749,8 +747,8 @@ class root_InternPool_Index_SynthProvider:
         if wrapped == (1 << 32) - 1: return
         unwrapped_type = self.value.type.FindDirectNestedType('Unwrapped')
         ip = self.value.CreateValueFromType(unwrapped_type).GetChildMemberWithName('debug_state').GetChildMemberWithName('intern_pool').GetNonSyntheticValue().GetChildMemberWithName('?')
-        tid_width, tid_shift_30 = ip.GetChildMemberWithName('tid_width').unsigned, ip.GetChildMemberWithName('tid_shift_30').unsigned
-        self.unwrapped = create_struct(self.value, '.unwrapped', unwrapped_type, { 'tid': wrapped >> tid_shift_30 & (1 << tid_width) - 1, 'index': wrapped & (1 << tid_shift_30) - 1 })
+        tid_shift_30 = ip.GetChildMemberWithName('tid_shift_30').unsigned
+        self.unwrapped = create_struct(self.value, '.unwrapped', unwrapped_type, { 'tid': wrapped >> tid_shift_30, 'index': wrapped & (1 << tid_shift_30) - 1 })
     def has_children(self): return True
     def num_children(self): return 0
     def get_child_index(self, name):
@@ -870,9 +868,9 @@ class root_InternPool_Index_Unwrapped_SynthProvider:
         except: pass
 
 def root_InternPool_String_SummaryProvider(value, _=None):
+    wrapped = value.unsigned
     ip = value.CreateValueFromType(value.type).GetChildMemberWithName('debug_state').GetChildMemberWithName('intern_pool').GetNonSyntheticValue().GetChildMemberWithName('?')
     tid_shift_32 = ip.GetChildMemberWithName('tid_shift_32').unsigned
-    wrapped = value.unsigned
     locals_value = ip.GetChildMemberWithName('locals').GetSyntheticValue()
     local_value = locals_value.child[wrapped >> tid_shift_32]
     if local_value is None:
@@ -882,6 +880,44 @@ def root_InternPool_String_SummaryProvider(value, _=None):
     string.format = lldb.eFormatCString
     return string.value
 
+class root_InternPool_Cau_Index_SynthProvider:
+    def __init__(self, value, _=None): self.value = value
+    def update(self):
+        self.cau = None
+        wrapped = self.value.unsigned
+        if wrapped == (1 << 32) - 1: return
+        ip = self.value.CreateValueFromType(self.value.type).GetChildMemberWithName('debug_state').GetChildMemberWithName('intern_pool').GetNonSyntheticValue().GetChildMemberWithName('?')
+        tid_shift_31 = ip.GetChildMemberWithName('tid_shift_31').unsigned
+        locals_value = ip.GetChildMemberWithName('locals').GetSyntheticValue()
+        local_value = locals_value.child[wrapped >> tid_shift_31]
+        if local_value is None:
+            wrapped = 0
+            local_value = locals_value.child[0]
+        self.cau = local_value.GetChildMemberWithName('shared').GetChildMemberWithName('caus').GetChildMemberWithName('view').GetChildMemberWithName('0').child[wrapped & (1 << tid_shift_31) - 1]
+    def has_children(self): return self.cau.GetNumChildren(1) > 0
+    def num_children(self): return self.cau.GetNumChildren()
+    def get_child_index(self, name): return self.cau.GetIndexOfChildWithName(name)
+    def get_child_at_index(self, index): return self.cau.GetChildAtIndex(index)
+
+class root_InternPool_Nav_Index_SynthProvider:
+    def __init__(self, value, _=None): self.value = value
+    def update(self):
+        self.nav = None
+        wrapped = self.value.unsigned
+        if wrapped == (1 << 32) - 1: return
+        ip = self.value.CreateValueFromType(self.value.type).GetChildMemberWithName('debug_state').GetChildMemberWithName('intern_pool').GetNonSyntheticValue().GetChildMemberWithName('?')
+        tid_shift_32 = ip.GetChildMemberWithName('tid_shift_32').unsigned
+        locals_value = ip.GetChildMemberWithName('locals').GetSyntheticValue()
+        local_value = locals_value.child[wrapped >> tid_shift_32]
+        if local_value is None:
+            wrapped = 0
+            local_value = locals_value.child[0]
+        self.nav = local_value.GetChildMemberWithName('shared').GetChildMemberWithName('navs').GetChildMemberWithName('view').child[wrapped & (1 << tid_shift_32) - 1]
+    def has_children(self): return self.nav.GetNumChildren(1) > 0
+    def num_children(self): return self.nav.GetNumChildren()
+    def get_child_index(self, name): return self.nav.GetIndexOfChildWithName(name)
+    def get_child_at_index(self, index): return self.nav.GetChildAtIndex(index)
+
 # Initialize
 
 def add(debugger, *, category, regex=False, type, identifier=None, synth=False, inline_children=False, expand=False, summary=False):
@@ -937,3 +973,5 @@ def __lldb_init_module(debugger, _=None):
     add(debugger, category='zig', type='root.InternPool.Index', synth=True, summary=True)
     add(debugger, category='zig', type='root.InternPool.Index.Unwrapped', synth=True)
     add(debugger, category='zig', regex=True, type=r'^root\.InternPool\.(Optional)?(NullTerminated)?String$', identifier='root_InternPool_String', summary=True)
+    add(debugger, category='zig', regex=True, type=r'^root\.InternPool\.Cau\.Index(\.Optional)?$', identifier='root_InternPool_Cau_Index', synth=True)
+    add(debugger, category='zig', regex=True, type=r'^root\.InternPool\.Nav\.Index(\.Optional)?$', identifier='root_InternPool_Nav_Index', synth=True)