authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-12-20 16:37:25-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-12-20 22:51:20-05:00
log5776d8f27022926b0538e818c7408f760bf2d144
tree86a37034884bb9b227442490c5dfb50f3ed14670
parent5c76e08f494b7412c1b089cac90bda14e2a45c0b

lldb: add pretty printer for cau and nav indices


2 files changed, 131 insertions(+), 49 deletions(-)

src/InternPool.zig+85-41
......@@ -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+46-8
......@@ -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 @@ class root_InternPool_Local_List_SynthProvider:
731728expr_path_re = re.compile(r'\{([^}]+)%([^%#}]+)(?:#([^%#}]+))?\}')
732729def 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 @@ class root_InternPool_Index_SynthProvider:
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 @@ class root_InternPool_Index_Unwrapped_SynthProvider:
870868 except: pass
871869
872870def 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
883class 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
902class 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
887923def 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)