Skip to content

Commit 5776d8f

Browse files
committed
lldb: add pretty printer for cau and nav indices
1 parent 5c76e08 commit 5776d8f

File tree

2 files changed

+131
-49
lines changed

2 files changed

+131
-49
lines changed

src/InternPool.zig

Lines changed: 85 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,8 @@ pub const Cau = struct {
470470
_ => @enumFromInt(@intFromEnum(opt)),
471471
};
472472
}
473+
474+
const debug_state = InternPool.debug_state;
473475
};
474476
pub fn toOptional(i: Cau.Index) Optional {
475477
return @enumFromInt(@intFromEnum(i));
@@ -491,6 +493,8 @@ pub const Cau = struct {
491493
.index = @intFromEnum(cau_index) & ip.getIndexMask(u31),
492494
};
493495
}
496+
497+
const debug_state = InternPool.debug_state;
494498
};
495499
};
496500

@@ -568,6 +572,8 @@ pub const Nav = struct {
568572
_ => @enumFromInt(@intFromEnum(opt)),
569573
};
570574
}
575+
576+
const debug_state = InternPool.debug_state;
571577
};
572578
pub fn toOptional(i: Nav.Index) Optional {
573579
return @enumFromInt(@intFromEnum(i));
@@ -589,6 +595,8 @@ pub const Nav = struct {
589595
.index = @intFromEnum(nav_index) & ip.getIndexMask(u32),
590596
};
591597
}
598+
599+
const debug_state = InternPool.debug_state;
592600
};
593601

594602
/// The compact in-memory representation of a `Nav`.
@@ -5271,17 +5279,26 @@ pub const Tag = enum(u8) {
52715279
52725280
.type_int_signed = .{ .summary = .@"i{.data%value}", .data = u32 },
52735281
.type_int_unsigned = .{ .summary = .@"u{.data%value}", .data = u32 },
5274-
.type_array_big = .{ .summary = .@"[{.payload.len1%value} << 32 | {.payload.len0%value}:{.payload.sentinel%summary}]{.payload.child%summary}", .payload = Array },
5282+
.type_array_big = .{
5283+
.summary = .@"[{.payload.len1%value} << 32 | {.payload.len0%value}:{.payload.sentinel%summary}]{.payload.child%summary}",
5284+
.payload = Array,
5285+
},
52755286
.type_array_small = .{ .summary = .@"[{.payload.len%value}]{.payload.child%summary}", .payload = Vector },
52765287
.type_vector = .{ .summary = .@"@Vector({.payload.len%value}, {.payload.child%summary})", .payload = Vector },
52775288
.type_pointer = .{ .summary = .@"*... {.payload.child%summary}", .payload = TypePointer },
52785289
.type_slice = .{ .summary = .@"[]... {.data.unwrapped.payload.child%summary}", .data = Index },
52795290
.type_optional = .{ .summary = .@"?{.data%summary}", .data = Index },
52805291
.type_anyframe = .{ .summary = .@"anyframe->{.data%summary}", .data = Index },
5281-
.type_error_union = .{ .summary = .@"{.payload.error_set_type%summary}!{.payload.payload_type%summary}", .payload = ErrorUnionType },
5292+
.type_error_union = .{
5293+
.summary = .@"{.payload.error_set_type%summary}!{.payload.payload_type%summary}",
5294+
.payload = ErrorUnionType,
5295+
},
52825296
.type_anyerror_union = .{ .summary = .@"anyerror!{.data%summary}", .data = Index },
52835297
.type_error_set = .{ .summary = .@"error{...}", .payload = ErrorSet },
5284-
.type_inferred_error_set = .{ .summary = .@"@typeInfo(@typeInfo(@TypeOf({.data%summary})).@\"fn\".return_type.?).error_union.error_set", .data = Index },
5298+
.type_inferred_error_set = .{
5299+
.summary = .@"@typeInfo(@typeInfo(@TypeOf({.data%summary})).@\"fn\".return_type.?).error_union.error_set",
5300+
.data = Index,
5301+
},
52855302
.type_enum_auto = .{
52865303
.summary = .@"{.payload.name%summary#\"}",
52875304
.payload = EnumAuto,
@@ -5307,12 +5324,8 @@ pub const Tag = enum(u8) {
53075324
.type_opaque = .{
53085325
.summary = .@"{.payload.name%summary#\"}",
53095326
.payload = TypeOpaque,
5310-
.trailing = struct {
5311-
captures: []CaptureValue,
5312-
},
5313-
.config = .{
5314-
.@"trailing.captures.len" = .@"payload.captures_len",
5315-
},
5327+
.trailing = struct { captures: []CaptureValue },
5328+
.config = .{ .@"trailing.captures.len" = .@"payload.captures_len" },
53165329
},
53175330
.type_struct = .{
53185331
.summary = .@"{.payload.name%summary#\"}",
@@ -5438,17 +5451,50 @@ pub const Tag = enum(u8) {
54385451

54395452
.undef = .{ .summary = .@"@as({.data%summary}, undefined)", .data = Index },
54405453
.simple_value = .{ .summary = .@"{.index%value#.}", .index = SimpleValue },
5441-
.ptr_nav = .{ .payload = PtrNav },
5442-
.ptr_comptime_alloc = .{ .payload = PtrComptimeAlloc },
5443-
.ptr_uav = .{ .payload = PtrUav },
5444-
.ptr_uav_aligned = .{ .payload = PtrUavAligned },
5445-
.ptr_comptime_field = .{ .payload = PtrComptimeField },
5446-
.ptr_int = .{ .payload = PtrInt },
5447-
.ptr_eu_payload = .{ .payload = PtrBase },
5448-
.ptr_opt_payload = .{ .payload = PtrBase },
5449-
.ptr_elem = .{ .payload = PtrBaseIndex },
5450-
.ptr_field = .{ .payload = PtrBaseIndex },
5451-
.ptr_slice = .{ .payload = PtrSlice },
5454+
.ptr_nav = .{
5455+
.summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(&{.payload.nav.fqn%summary#\"}) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
5456+
.payload = PtrNav,
5457+
},
5458+
.ptr_comptime_alloc = .{
5459+
.summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(&comptime_allocs[{.payload.index%summary}]) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
5460+
.payload = PtrComptimeAlloc,
5461+
},
5462+
.ptr_uav = .{
5463+
.summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(&{.payload.val%summary}) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
5464+
.payload = PtrUav,
5465+
},
5466+
.ptr_uav_aligned = .{
5467+
.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})))",
5468+
.payload = PtrUavAligned,
5469+
},
5470+
.ptr_comptime_field = .{
5471+
.summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(&{.payload.field_val%summary}) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
5472+
.payload = PtrComptimeField,
5473+
},
5474+
.ptr_int = .{
5475+
.summary = .@"@as({.payload.ty%summary}, @ptrFromInt({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value}))",
5476+
.payload = PtrInt,
5477+
},
5478+
.ptr_eu_payload = .{
5479+
.summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(&({.payload.base%summary} catch unreachable)) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
5480+
.payload = PtrBase,
5481+
},
5482+
.ptr_opt_payload = .{
5483+
.summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(&{.payload.base%summary}.?) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
5484+
.payload = PtrBase,
5485+
},
5486+
.ptr_elem = .{
5487+
.summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(&{.payload.base%summary}[{.payload.index%summary}]) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
5488+
.payload = PtrBaseIndex,
5489+
},
5490+
.ptr_field = .{
5491+
.summary = .@"@as({.payload.ty%summary}, @ptrFromInt(@intFromPtr(&{.payload.base%summary}[{.payload.index%summary}]) + ({.payload.byte_offset_a%value} << 32 | {.payload.byte_offset_b%value})))",
5492+
.payload = PtrBaseIndex,
5493+
},
5494+
.ptr_slice = .{
5495+
.summary = .@"{.payload.ptr%summary}[0..{.payload.len%summary}]",
5496+
.payload = PtrSlice,
5497+
},
54525498
.opt_payload = .{ .summary = .@"@as({.payload.ty%summary}, {.payload.val%summary})", .payload = TypeValue },
54535499
.opt_null = .{ .summary = .@"@as({.data%summary}, null)", .data = Index },
54545500
.int_u8 = .{ .summary = .@"@as(u8, {.data%value})", .data = u8 },
@@ -5476,18 +5522,16 @@ pub const Tag = enum(u8) {
54765522
.float_c_longdouble_f80 = .{ .summary = .@"@as(c_longdouble, {.payload%value})", .payload = f80 },
54775523
.float_c_longdouble_f128 = .{ .summary = .@"@as(c_longdouble, {.payload%value})", .payload = f128 },
54785524
.float_comptime_float = .{ .summary = .@"{.payload%value}", .payload = f128 },
5479-
.variable = .{ .payload = Variable },
5480-
.@"extern" = .{ .payload = Extern },
5525+
.variable = .{ .summary = .@"{.payload.owner_nav.fqn%summary#\"}", .payload = Variable },
5526+
.@"extern" = .{ .summary = .@"{.payload.owner_nav.fqn%summary#\"}", .payload = Extern },
54815527
.func_decl = .{
5528+
.summary = .@"{.payload.owner_nav.fqn%summary#\"}",
54825529
.payload = FuncDecl,
5483-
.trailing = struct {
5484-
inferred_error_set: ?Index,
5485-
},
5486-
.config = .{
5487-
.@"trailing.inferred_error_set.?" = .@"payload.analysis.inferred_error_set",
5488-
},
5530+
.trailing = struct { inferred_error_set: ?Index },
5531+
.config = .{ .@"trailing.inferred_error_set.?" = .@"payload.analysis.inferred_error_set" },
54895532
},
54905533
.func_instance = .{
5534+
.summary = .@"{.payload.owner_nav.fqn%summary#\"}",
54915535
.payload = FuncInstance,
54925536
.trailing = struct {
54935537
inferred_error_set: ?Index,
@@ -5498,30 +5542,26 @@ pub const Tag = enum(u8) {
54985542
.@"trailing.param_values.len" = .@"payload.ty.payload.params_len",
54995543
},
55005544
},
5501-
.func_coerced = .{ .payload = FuncCoerced },
5545+
.func_coerced = .{
5546+
.summary = .@"@as(*const {.payload.ty%summary}, @ptrCast(&{.payload.func%summary})).*",
5547+
.payload = FuncCoerced,
5548+
},
55025549
.only_possible_value = .{ .summary = .@"@as({.data%summary}, undefined)", .data = Index },
55035550
.union_value = .{ .summary = .@"@as({.payload.ty%summary}, {})", .payload = Union },
55045551
.bytes = .{ .summary = .@"@as({.payload.ty%summary}, {.payload.bytes%summary}.*)", .payload = Bytes },
55055552
.aggregate = .{
55065553
.summary = .@"@as({.payload.ty%summary}, .{...})",
55075554
.payload = Aggregate,
5508-
.trailing = struct {
5509-
elements: []Index,
5510-
},
5511-
.config = .{
5512-
.@"trailing.elements.len" = .@"payload.ty.payload.fields_len",
5513-
},
5555+
.trailing = struct { elements: []Index },
5556+
.config = .{ .@"trailing.elements.len" = .@"payload.ty.payload.fields_len" },
55145557
},
55155558
.repeated = .{ .summary = .@"@as({.payload.ty%summary}, @splat({.payload.elem_val%summary}))", .payload = Repeated },
55165559

55175560
.memoized_call = .{
5561+
.summary = .@"@memoize({.payload.func%summary})",
55185562
.payload = MemoizedCall,
5519-
.trailing = struct {
5520-
arg_values: []Index,
5521-
},
5522-
.config = .{
5523-
.@"trailing.arg_values.len" = .@"payload.args_len",
5524-
},
5563+
.trailing = struct { arg_values: []Index },
5564+
.config = .{ .@"trailing.arg_values.len" = .@"payload.args_len" },
55255565
},
55265566
};
55275567
fn Payload(comptime tag: Tag) type {
@@ -6490,6 +6530,10 @@ pub fn activate(ip: *const InternPool) void {
64906530
_ = OptionalString.debug_state;
64916531
_ = NullTerminatedString.debug_state;
64926532
_ = OptionalNullTerminatedString.debug_state;
6533+
_ = Cau.Index.debug_state;
6534+
_ = Cau.Index.Optional.debug_state;
6535+
_ = Nav.Index.debug_state;
6536+
_ = Nav.Index.Optional.debug_state;
64936537
std.debug.assert(debug_state.intern_pool == null);
64946538
debug_state.intern_pool = ip;
64956539
}

tools/lldb_pretty_printers.py

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,14 @@ def create_struct(parent, name, struct_type, inits):
1818
for field in struct_type.fields:
1919
field_size = field.type.size
2020
field_init = inits[field.name]
21-
field_init_type = type(field_init)
22-
if field_init_type == bool:
23-
field_bytes = bytes([field_init])
24-
elif field_init_type == int:
21+
if isinstance(field_init, int):
2522
match struct_data.byte_order:
2623
case lldb.eByteOrderLittle:
2724
byte_order = 'little'
2825
case lldb.eByteOrderBig:
2926
byte_order = 'big'
3027
field_bytes = field_init.to_bytes(field_size, byte_order, signed=field.type.GetTypeFlags() & lldb.eTypeIsSigned != 0)
31-
elif field_init_type == lldb.SBValue:
28+
elif isinstance(field_init_type, lldb.SBValue):
3229
field_bytes = field_init.data.uint8
3330
else: return
3431
match struct_data.byte_order:
@@ -731,6 +728,7 @@ def get_child_at_index(self, index):
731728
expr_path_re = re.compile(r'\{([^}]+)%([^%#}]+)(?:#([^%#}]+))?\}')
732729
def root_InternPool_Index_SummaryProvider(value, _=None):
733730
unwrapped = value.GetChildMemberWithName('unwrapped')
731+
if not unwrapped: return '' # .none
734732
tag = unwrapped.GetChildMemberWithName('tag')
735733
tag_value = tag.value
736734
summary = tag.CreateValueFromType(tag.type).GetChildMemberWithName('encodings').GetChildMemberWithName(tag_value.removeprefix('.')).GetChildMemberWithName('summary')
@@ -749,8 +747,8 @@ def update(self):
749747
if wrapped == (1 << 32) - 1: return
750748
unwrapped_type = self.value.type.FindDirectNestedType('Unwrapped')
751749
ip = self.value.CreateValueFromType(unwrapped_type).GetChildMemberWithName('debug_state').GetChildMemberWithName('intern_pool').GetNonSyntheticValue().GetChildMemberWithName('?')
752-
tid_width, tid_shift_30 = ip.GetChildMemberWithName('tid_width').unsigned, ip.GetChildMemberWithName('tid_shift_30').unsigned
753-
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 })
750+
tid_shift_30 = ip.GetChildMemberWithName('tid_shift_30').unsigned
751+
self.unwrapped = create_struct(self.value, '.unwrapped', unwrapped_type, { 'tid': wrapped >> tid_shift_30, 'index': wrapped & (1 << tid_shift_30) - 1 })
754752
def has_children(self): return True
755753
def num_children(self): return 0
756754
def get_child_index(self, name):
@@ -870,9 +868,9 @@ def get_child_at_index(self, index):
870868
except: pass
871869

872870
def root_InternPool_String_SummaryProvider(value, _=None):
871+
wrapped = value.unsigned
873872
ip = value.CreateValueFromType(value.type).GetChildMemberWithName('debug_state').GetChildMemberWithName('intern_pool').GetNonSyntheticValue().GetChildMemberWithName('?')
874873
tid_shift_32 = ip.GetChildMemberWithName('tid_shift_32').unsigned
875-
wrapped = value.unsigned
876874
locals_value = ip.GetChildMemberWithName('locals').GetSyntheticValue()
877875
local_value = locals_value.child[wrapped >> tid_shift_32]
878876
if local_value is None:
@@ -882,6 +880,44 @@ def root_InternPool_String_SummaryProvider(value, _=None):
882880
string.format = lldb.eFormatCString
883881
return string.value
884882

883+
class root_InternPool_Cau_Index_SynthProvider:
884+
def __init__(self, value, _=None): self.value = value
885+
def update(self):
886+
self.cau = None
887+
wrapped = self.value.unsigned
888+
if wrapped == (1 << 32) - 1: return
889+
ip = self.value.CreateValueFromType(self.value.type).GetChildMemberWithName('debug_state').GetChildMemberWithName('intern_pool').GetNonSyntheticValue().GetChildMemberWithName('?')
890+
tid_shift_31 = ip.GetChildMemberWithName('tid_shift_31').unsigned
891+
locals_value = ip.GetChildMemberWithName('locals').GetSyntheticValue()
892+
local_value = locals_value.child[wrapped >> tid_shift_31]
893+
if local_value is None:
894+
wrapped = 0
895+
local_value = locals_value.child[0]
896+
self.cau = local_value.GetChildMemberWithName('shared').GetChildMemberWithName('caus').GetChildMemberWithName('view').GetChildMemberWithName('0').child[wrapped & (1 << tid_shift_31) - 1]
897+
def has_children(self): return self.cau.GetNumChildren(1) > 0
898+
def num_children(self): return self.cau.GetNumChildren()
899+
def get_child_index(self, name): return self.cau.GetIndexOfChildWithName(name)
900+
def get_child_at_index(self, index): return self.cau.GetChildAtIndex(index)
901+
902+
class root_InternPool_Nav_Index_SynthProvider:
903+
def __init__(self, value, _=None): self.value = value
904+
def update(self):
905+
self.nav = None
906+
wrapped = self.value.unsigned
907+
if wrapped == (1 << 32) - 1: return
908+
ip = self.value.CreateValueFromType(self.value.type).GetChildMemberWithName('debug_state').GetChildMemberWithName('intern_pool').GetNonSyntheticValue().GetChildMemberWithName('?')
909+
tid_shift_32 = ip.GetChildMemberWithName('tid_shift_32').unsigned
910+
locals_value = ip.GetChildMemberWithName('locals').GetSyntheticValue()
911+
local_value = locals_value.child[wrapped >> tid_shift_32]
912+
if local_value is None:
913+
wrapped = 0
914+
local_value = locals_value.child[0]
915+
self.nav = local_value.GetChildMemberWithName('shared').GetChildMemberWithName('navs').GetChildMemberWithName('view').child[wrapped & (1 << tid_shift_32) - 1]
916+
def has_children(self): return self.nav.GetNumChildren(1) > 0
917+
def num_children(self): return self.nav.GetNumChildren()
918+
def get_child_index(self, name): return self.nav.GetIndexOfChildWithName(name)
919+
def get_child_at_index(self, index): return self.nav.GetChildAtIndex(index)
920+
885921
# Initialize
886922

887923
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):
937973
add(debugger, category='zig', type='root.InternPool.Index', synth=True, summary=True)
938974
add(debugger, category='zig', type='root.InternPool.Index.Unwrapped', synth=True)
939975
add(debugger, category='zig', regex=True, type=r'^root\.InternPool\.(Optional)?(NullTerminated)?String$', identifier='root_InternPool_String', summary=True)
976+
add(debugger, category='zig', regex=True, type=r'^root\.InternPool\.Cau\.Index(\.Optional)?$', identifier='root_InternPool_Cau_Index', synth=True)
977+
add(debugger, category='zig', regex=True, type=r'^root\.InternPool\.Nav\.Index(\.Optional)?$', identifier='root_InternPool_Nav_Index', synth=True)

0 commit comments

Comments
 (0)