authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-21 19:22:50-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-06-10 20:47:54-07:00
loga7c3ca35312094bcfaecd80cdd2b95ba89386773
treeff82bd4e9bcf3689cfe3b8e6d64f4c3d140f0252
parenta6fcf469fc8982d36597586ac0dbba94027b2429

InternPool: add lldb pretty printing for indices


3 files changed, 203 insertions(+), 15 deletions(-)

src/InternPool.zig+127-1
...@@ -56,6 +56,7 @@ string_table: std.HashMapUnmanaged(...@@ -56,6 +56,7 @@ string_table: std.HashMapUnmanaged(
56 std.hash_map.default_max_load_percentage,56 std.hash_map.default_max_load_percentage,
57) = .{},57) = .{},
5858
59const builtin = @import("builtin");
59const std = @import("std");60const std = @import("std");
60const Allocator = std.mem.Allocator;61const Allocator = std.mem.Allocator;
61const assert = std.debug.assert;62const assert = std.debug.assert;
...@@ -1057,6 +1058,131 @@ pub const Index = enum(u32) {...@@ -1057,6 +1058,131 @@ pub const Index = enum(u32) {
1057 return std.hash.uint32(@enumToInt(a));1058 return std.hash.uint32(@enumToInt(a));
1058 }1059 }
1059 };1060 };
1061
1062 /// This function is used in the debugger pretty formatters in tools/ to fetch the
1063 /// Tag to encoding mapping to facilitate fancy debug printing for this type.
1064 fn dbHelper(self: *Index, tag_to_encoding_map: *struct {
1065 const DataIsIndex = struct { data: Index };
1066 const DataIsExtraIndexOfEnumExplicit = struct {
1067 const @"data.fields_len" = opaque {};
1068 data: *EnumExplicit,
1069 @"trailing.names.len": *@"data.fields_len",
1070 @"trailing.values.len": *@"data.fields_len",
1071 trailing: struct {
1072 names: []NullTerminatedString,
1073 values: []Index,
1074 },
1075 };
1076 const DataIsExtraIndexOfTypeStructAnon = struct {
1077 const @"data.fields_len" = opaque {};
1078 data: *TypeStructAnon,
1079 @"trailing.types.len": *@"data.fields_len",
1080 @"trailing.values.len": *@"data.fields_len",
1081 @"trailing.names.len": *@"data.fields_len",
1082 trailing: struct {
1083 types: []Index,
1084 values: []Index,
1085 names: []NullTerminatedString,
1086 },
1087 };
1088
1089 type_int_signed: struct { data: u32 },
1090 type_int_unsigned: struct { data: u32 },
1091 type_array_big: struct { data: *Array },
1092 type_array_small: struct { data: *Vector },
1093 type_vector: struct { data: *Vector },
1094 type_pointer: struct { data: *Pointer },
1095 type_slice: DataIsIndex,
1096 type_optional: DataIsIndex,
1097 type_anyframe: DataIsIndex,
1098 type_error_union: struct { data: *Key.ErrorUnionType },
1099 type_error_set: struct {
1100 const @"data.names_len" = opaque {};
1101 data: *ErrorSet,
1102 @"trailing.names.len": *@"data.names_len",
1103 trailing: struct { names: []NullTerminatedString },
1104 },
1105 type_inferred_error_set: struct { data: Module.Fn.InferredErrorSet.Index },
1106 type_enum_auto: struct {
1107 const @"data.fields_len" = opaque {};
1108 data: *EnumAuto,
1109 @"trailing.names.len": *@"data.fields_len",
1110 trailing: struct { names: []NullTerminatedString },
1111 },
1112 type_enum_explicit: DataIsExtraIndexOfEnumExplicit,
1113 type_enum_nonexhaustive: DataIsExtraIndexOfEnumExplicit,
1114 simple_type: struct { data: SimpleType },
1115 type_opaque: struct { data: *Key.OpaqueType },
1116 type_struct: struct { data: Module.Struct.OptionalIndex },
1117 type_struct_ns: struct { data: Module.Namespace.Index },
1118 type_struct_anon: DataIsExtraIndexOfTypeStructAnon,
1119 type_tuple_anon: DataIsExtraIndexOfTypeStructAnon,
1120 type_union_tagged: struct { data: Module.Union.Index },
1121 type_union_untagged: struct { data: Module.Union.Index },
1122 type_union_safety: struct { data: Module.Union.Index },
1123 type_function: struct {
1124 const @"data.params_len" = opaque {};
1125 data: *TypeFunction,
1126 @"trailing.param_types.len": *@"data.params_len",
1127 trailing: struct { param_types: []Index },
1128 },
1129
1130 undef: DataIsIndex,
1131 simple_value: struct { data: SimpleValue },
1132 ptr_var: struct { data: *PtrVar },
1133 ptr_mut_decl: struct { data: *PtrMutDecl },
1134 ptr_decl: struct { data: *PtrDecl },
1135 ptr_int: struct { data: *PtrInt },
1136 ptr_eu_payload: DataIsIndex,
1137 ptr_opt_payload: DataIsIndex,
1138 ptr_comptime_field: struct { data: *PtrComptimeField },
1139 ptr_elem: struct { data: *PtrBaseIndex },
1140 ptr_field: struct { data: *PtrBaseIndex },
1141 ptr_slice: struct { data: *PtrSlice },
1142 opt_payload: DataIsIndex,
1143 opt_null: DataIsIndex,
1144 int_u8: struct { data: u8 },
1145 int_u16: struct { data: u16 },
1146 int_u32: struct { data: u32 },
1147 int_i32: struct { data: i32 },
1148 int_usize: struct { data: u32 },
1149 int_comptime_int_u32: struct { data: u32 },
1150 int_comptime_int_i32: struct { data: i32 },
1151 int_small: struct { data: *IntSmall },
1152 int_positive: struct { data: u32 },
1153 int_negative: struct { data: u32 },
1154 enum_tag: struct { data: *Key.EnumTag },
1155 float_f16: struct { data: f16 },
1156 float_f32: struct { data: f32 },
1157 float_f64: struct { data: *Float64 },
1158 float_f80: struct { data: *Float80 },
1159 float_f128: struct { data: *Float128 },
1160 float_c_longdouble_f80: struct { data: *Float80 },
1161 float_c_longdouble_f128: struct { data: *Float128 },
1162 float_comptime_float: struct { data: *Float128 },
1163 extern_func: struct { data: void },
1164 func: struct { data: void },
1165 only_possible_value: DataIsIndex,
1166 union_value: struct { data: *Key.Union },
1167 aggregate: struct { data: *Aggregate },
1168 repeated: struct { data: *Repeated },
1169 }) void {
1170 _ = self;
1171 @setEvalBranchQuota(10_000);
1172 inline for (@typeInfo(Tag).Enum.fields) |tag| {
1173 inline for (@typeInfo(@typeInfo(@TypeOf(tag_to_encoding_map)).Pointer.child).Struct.fields) |entry| {
1174 if (comptime std.mem.eql(u8, tag.name, entry.name)) break;
1175 } else {
1176 @compileError(@typeName(Tag) ++ "." ++ tag.name ++ " missing dbHelper tag_to_encoding_map entry");
1177 }
1178 }
1179 }
1180
1181 comptime {
1182 if (builtin.mode == .Debug) {
1183 _ = dbHelper;
1184 }
1185 }
1060};1186};
10611187
1062pub const static_keys = [_]Key{1188pub const static_keys = [_]Key{
...@@ -1776,7 +1902,7 @@ pub const PtrVar = struct {...@@ -1776,7 +1902,7 @@ pub const PtrVar = struct {
1776 is_const: bool,1902 is_const: bool,
1777 is_threadlocal: bool,1903 is_threadlocal: bool,
1778 is_weak_linkage: bool,1904 is_weak_linkage: bool,
1779 unused: u29 = undefined,1905 _: u29 = 0,
1780 };1906 };
1781};1907};
17821908
src/codegen/llvm.zig+2-2
...@@ -4693,8 +4693,8 @@ pub const FuncGen = struct {...@@ -4693,8 +4693,8 @@ pub const FuncGen = struct {
4693 }4693 }
46944694
4695 fn resolveValue(self: *FuncGen, tv: TypedValue) !*llvm.Value {4695 fn resolveValue(self: *FuncGen, tv: TypedValue) !*llvm.Value {
4696 const llvm_val = try self.dg.lowerValue(tv);
4697 const mod = self.dg.module;4696 const mod = self.dg.module;
4697 const llvm_val = try self.dg.lowerValue(tv);
4698 if (!isByRef(tv.ty, mod)) return llvm_val;4698 if (!isByRef(tv.ty, mod)) return llvm_val;
46994699
4700 // We have an LLVM value but we need to create a global constant and4700 // We have an LLVM value but we need to create a global constant and
...@@ -4972,8 +4972,8 @@ pub const FuncGen = struct {...@@ -4972,8 +4972,8 @@ pub const FuncGen = struct {
4972 const pl_op = self.air.instructions.items(.data)[inst].pl_op;4972 const pl_op = self.air.instructions.items(.data)[inst].pl_op;
4973 const extra = self.air.extraData(Air.Call, pl_op.payload);4973 const extra = self.air.extraData(Air.Call, pl_op.payload);
4974 const args = @ptrCast([]const Air.Inst.Ref, self.air.extra[extra.end..][0..extra.data.args_len]);4974 const args = @ptrCast([]const Air.Inst.Ref, self.air.extra[extra.end..][0..extra.data.args_len]);
4975 const callee_ty = self.typeOf(pl_op.operand);
4976 const mod = self.dg.module;4975 const mod = self.dg.module;
4976 const callee_ty = self.typeOf(pl_op.operand);
4977 const zig_fn_ty = switch (callee_ty.zigTypeTag(mod)) {4977 const zig_fn_ty = switch (callee_ty.zigTypeTag(mod)) {
4978 .Fn => callee_ty,4978 .Fn => callee_ty,
4979 .Pointer => callee_ty.childType(mod),4979 .Pointer => callee_ty.childType(mod),
tools/lldb_pretty_printers.py+74-12
...@@ -115,7 +115,7 @@ class zig_Slice_SynthProvider:...@@ -115,7 +115,7 @@ class zig_Slice_SynthProvider:
115 try: return int(name.removeprefix('[').removesuffix(']'))115 try: return int(name.removeprefix('[').removesuffix(']'))
116 except: return -1116 except: return -1
117 def get_child_at_index(self, index):117 def get_child_at_index(self, index):
118 if index < 0 or index >= self.len: return None118 if index not in range(self.len): return None
119 try: return self.ptr.CreateChildAtOffset('[%d]' % index, index * self.elem_size, self.elem_type)119 try: return self.ptr.CreateChildAtOffset('[%d]' % index, index * self.elem_size, self.elem_type)
120 except: return None120 except: return None
121121
...@@ -176,7 +176,7 @@ class zig_TaggedUnion_SynthProvider:...@@ -176,7 +176,7 @@ class zig_TaggedUnion_SynthProvider:
176 def get_child_index(self, name):176 def get_child_index(self, name):
177 try: return ('tag', 'payload').index(name)177 try: return ('tag', 'payload').index(name)
178 except: return -1178 except: return -1
179 def get_child_at_index(self, index): return (self.tag, self.payload)[index] if index >= 0 and index < 2 else None179 def get_child_at_index(self, index): return (self.tag, self.payload)[index] if index in range(2) else None
180180
181# Define Zig Standard Library181# Define Zig Standard Library
182182
...@@ -196,7 +196,7 @@ class std_SegmentedList_SynthProvider:...@@ -196,7 +196,7 @@ class std_SegmentedList_SynthProvider:
196 except: return -1196 except: return -1
197 def get_child_at_index(self, index):197 def get_child_at_index(self, index):
198 try:198 try:
199 if index < 0 or index >= self.len: return None199 if index not in range(self.len): return None
200 prealloc_item_count = len(self.prealloc_segment)200 prealloc_item_count = len(self.prealloc_segment)
201 if index < prealloc_item_count: return self.prealloc_segment.child[index]201 if index < prealloc_item_count: return self.prealloc_segment.child[index]
202 prealloc_exp = prealloc_item_count.bit_length() - 1202 prealloc_exp = prealloc_item_count.bit_length() - 1
...@@ -231,7 +231,7 @@ class std_MultiArrayList_SynthProvider:...@@ -231,7 +231,7 @@ class std_MultiArrayList_SynthProvider:
231 except: return -1231 except: return -1
232 def get_child_at_index(self, index):232 def get_child_at_index(self, index):
233 try:233 try:
234 if index < 0 or index >= self.len: return None234 if index not in range(self.len): return None
235 offset = 0235 offset = 0
236 data = lldb.SBData()236 data = lldb.SBData()
237 for field in self.entry_type.fields:237 for field in self.entry_type.fields:
...@@ -266,7 +266,7 @@ class std_MultiArrayList_Slice_SynthProvider:...@@ -266,7 +266,7 @@ class std_MultiArrayList_Slice_SynthProvider:
266 except: return -1266 except: return -1
267 def get_child_at_index(self, index):267 def get_child_at_index(self, index):
268 try:268 try:
269 if index < 0 or index >= self.len: return None269 if index not in range(self.len): return None
270 data = lldb.SBData()270 data = lldb.SBData()
271 for field in self.entry_type.fields:271 for field in self.entry_type.fields:
272 field_type = field.type.GetPointeeType()272 field_type = field.type.GetPointeeType()
...@@ -328,7 +328,7 @@ class std_Entry_SynthProvider:...@@ -328,7 +328,7 @@ class std_Entry_SynthProvider:
328 def has_children(self): return self.num_children() != 0328 def has_children(self): return self.num_children() != 0
329 def num_children(self): return len(self.children)329 def num_children(self): return len(self.children)
330 def get_child_index(self, name): return self.indices.get(name)330 def get_child_index(self, name): return self.indices.get(name)
331 def get_child_at_index(self, index): return self.children[index].deref if index >= 0 and index < len(self.children) else None331 def get_child_at_index(self, index): return self.children[index].deref if index in range(len(self.children)) else None
332332
333# Define Zig Stage2 Compiler333# Define Zig Stage2 Compiler
334334
...@@ -345,7 +345,7 @@ class TagAndPayload_SynthProvider:...@@ -345,7 +345,7 @@ class TagAndPayload_SynthProvider:
345 def get_child_index(self, name):345 def get_child_index(self, name):
346 try: return ('tag', 'payload').index(name)346 try: return ('tag', 'payload').index(name)
347 except: return -1347 except: return -1
348 def get_child_at_index(self, index): return (self.tag, self.payload)[index] if index >= 0 and index < 2 else None348 def get_child_at_index(self, index): return (self.tag, self.payload)[index] if index in range(2) else None
349349
350def Inst_Ref_SummaryProvider(value, _=None):350def Inst_Ref_SummaryProvider(value, _=None):
351 members = value.type.enum_members351 members = value.type.enum_members
...@@ -392,7 +392,7 @@ class TagOrPayloadPtr_SynthProvider:...@@ -392,7 +392,7 @@ class TagOrPayloadPtr_SynthProvider:
392 def get_child_index(self, name):392 def get_child_index(self, name):
393 try: return ('tag', 'payload').index(name)393 try: return ('tag', 'payload').index(name)
394 except: return -1394 except: return -1
395 def get_child_at_index(self, index): return (self.tag, self.payload)[index] if index >= 0 and index < 2 else None395 def get_child_at_index(self, index): return (self.tag, self.payload)[index] if index in range(2) else None
396396
397def Module_Decl_name(decl):397def Module_Decl_name(decl):
398 error = lldb.SBError()398 error = lldb.SBError()
...@@ -407,6 +407,71 @@ def Module_Decl_RenderFullyQualifiedName(decl): return '.'.join((Module_Namespac...@@ -407,6 +407,71 @@ def Module_Decl_RenderFullyQualifiedName(decl): return '.'.join((Module_Namespac
407407
408def OwnerDecl_RenderFullyQualifiedName(payload): return Module_Decl_RenderFullyQualifiedName(payload.GetChildMemberWithName('owner_decl').GetChildMemberWithName('decl'))408def OwnerDecl_RenderFullyQualifiedName(payload): return Module_Decl_RenderFullyQualifiedName(payload.GetChildMemberWithName('owner_decl').GetChildMemberWithName('decl'))
409409
410def InternPool_Find(thread):
411 for frame in thread:
412 ip = frame.FindVariable('ip') or frame.FindVariable('intern_pool')
413 if ip: return ip
414 mod = frame.FindVariable('mod') or frame.FindVariable('module')
415 if mod:
416 ip = mod.GetChildMemberWithName('intern_pool')
417 if ip: return ip
418
419class InternPool_Index_SynthProvider:
420 def __init__(self, value, _=None): self.value = value
421 def update(self):
422 try:
423 index_type = self.value.type
424 for helper in self.value.target.FindFunctions('%s.dbHelper' % index_type.name, lldb.eFunctionNameTypeFull):
425 ptr_self_type, ptr_tag_to_encoding_map_type = helper.function.type.GetFunctionArgumentTypes()
426 if ptr_self_type.GetPointeeType() == index_type: break
427 else: return
428 tag_to_encoding_map = {field.name: field.type for field in ptr_tag_to_encoding_map_type.GetPointeeType().fields}
429
430 ip = InternPool_Find(self.value.thread)
431 if not ip: return
432 self.item = ip.GetChildMemberWithName('items').GetChildAtIndex(self.value.unsigned)
433 extra = ip.GetChildMemberWithName('extra').GetChildMemberWithName('items')
434 self.tag = self.item.GetChildMemberWithName('tag').Clone('tag')
435 self.data = None
436 self.trailing = None
437 data = self.item.GetChildMemberWithName('data')
438 encoding_type = tag_to_encoding_map[self.tag.value]
439 dynamic_values = {}
440 for encoding_field in encoding_type.fields:
441 if encoding_field.name == 'data':
442 if encoding_field.type.IsPointerType():
443 data_type = encoding_field.type.GetPointeeType()
444 extra_index = data.unsigned
445 self.data = extra.GetChildAtIndex(extra_index).Cast(data_type).Clone('data')
446 extra_index += data_type.num_fields
447 else:
448 self.data = data.Cast(encoding_field.type).Clone('data')
449 elif encoding_field.name == 'trailing':
450 trailing_data = lldb.SBData()
451 for trailing_field in encoding_field.type.fields:
452 if trailing_field.type.IsAggregateType():
453 trailing_data.Append(extra.GetChildAtIndex(extra_index).address_of.data)
454 len = dynamic_values['trailing.%s.len' % trailing_field.name].unsigned
455 trailing_data.Append(lldb.SBData.CreateDataFromInt(len, trailing_data.GetAddressByteSize()))
456 extra_index += len
457 else:
458 pass
459 self.trailing = self.data.CreateValueFromData('trailing', trailing_data, encoding_field.type)
460 else:
461 path = encoding_field.type.GetPointeeType().name.removeprefix('%s::' % encoding_type.name).removeprefix('%s.' % encoding_type.name).partition('__')[0].split('.')
462 if path[0] == 'data':
463 dynamic_value = self.data
464 for name in path[1:]:
465 dynamic_value = dynamic_value.GetChildMemberWithName(name)
466 dynamic_values[encoding_field.name] = dynamic_value
467 except: pass
468 def has_children(self): return True
469 def num_children(self): return 2 + (self.trailing is not None)
470 def get_child_index(self, name):
471 try: return ('tag', 'data', 'trailing').index(name)
472 except: return -1
473 def get_child_at_index(self, index): return (self.tag, self.data, self.trailing)[index] if index in range(3) else None
474
410def type_Type_pointer(payload):475def type_Type_pointer(payload):
411 pointee_type = payload.GetChildMemberWithName('pointee_type')476 pointee_type = payload.GetChildMemberWithName('pointee_type')
412 sentinel = payload.GetChildMemberWithName('sentinel').GetChildMemberWithName('child')477 sentinel = payload.GetChildMemberWithName('sentinel').GetChildMemberWithName('child')
...@@ -616,8 +681,5 @@ def __lldb_init_module(debugger, _=None):...@@ -616,8 +681,5 @@ def __lldb_init_module(debugger, _=None):
616 add(debugger, category='zig.stage2', regex=True, type=MultiArrayList_Entry('Air\\.Inst'), identifier='TagAndPayload', synth=True, inline_children=True, summary=True)681 add(debugger, category='zig.stage2', regex=True, type=MultiArrayList_Entry('Air\\.Inst'), identifier='TagAndPayload', synth=True, inline_children=True, summary=True)
617 add(debugger, category='zig.stage2', regex=True, type='^Air\\.Inst\\.Data\\.Data__struct_[1-9][0-9]*$', inline_children=True, summary=True)682 add(debugger, category='zig.stage2', regex=True, type='^Air\\.Inst\\.Data\\.Data__struct_[1-9][0-9]*$', inline_children=True, summary=True)
618 add(debugger, category='zig.stage2', type='Module.Decl::Module.Decl.Index', synth=True)683 add(debugger, category='zig.stage2', type='Module.Decl::Module.Decl.Index', synth=True)
619 add(debugger, category='zig.stage2', type='type.Type', identifier='TagOrPayloadPtr', synth=True)684 add(debugger, category='zig.stage2', type='InternPool.Index', synth=True)
620 add(debugger, category='zig.stage2', type='type.Type', summary=True)
621 add(debugger, category='zig.stage2', type='value.Value', identifier='TagOrPayloadPtr', synth=True)
622 add(debugger, category='zig.stage2', type='value.Value', summary=True)
623 add(debugger, category='zig.stage2', type='arch.x86_64.CodeGen.MCValue', identifier='zig_TaggedUnion', synth=True, inline_children=True, summary=True)685 add(debugger, category='zig.stage2', type='arch.x86_64.CodeGen.MCValue', identifier='zig_TaggedUnion', synth=True, inline_children=True, summary=True)