authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-05-03 12:25:20-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-05-03 12:25:20-07:00
logaa4e9399db4001a49ad93f35dafbc53e3dec3cf3
tree42ff463a6400767c7727e3e1aaaedf56fda6366e
parent773902e9de5fc2c7db72c2fdab29ee8e5dd2e337

ZIR: implement debug text printing for struct_init and friends


1 files changed, 75 insertions(+), 6 deletions(-)

src/Zir.zig+75-6
......@@ -2866,17 +2866,11 @@ const Writer = struct {
28662866 .slice_start,
28672867 .slice_end,
28682868 .slice_sentinel,
2869 .struct_init,
2870 .struct_init_ref,
2871 .struct_init_anon,
2872 .struct_init_anon_ref,
28732869 .array_init,
28742870 .array_init_anon,
28752871 .array_init_ref,
28762872 .array_init_anon_ref,
28772873 .union_init_ptr,
2878 .field_type,
2879 .field_type_ref,
28802874 .cmpxchg_strong,
28812875 .cmpxchg_weak,
28822876 .shuffle,
......@@ -2890,6 +2884,17 @@ const Writer = struct {
28902884 .builtin_async_call,
28912885 => try self.writePlNode(stream, inst),
28922886
2887 .struct_init,
2888 .struct_init_ref,
2889 => try self.writeStructInit(stream, inst),
2890
2891 .struct_init_anon,
2892 .struct_init_anon_ref,
2893 => try self.writeStructInitAnon(stream, inst),
2894
2895 .field_type => try self.writeFieldType(stream, inst),
2896 .field_type_ref => try self.writeFieldTypeRef(stream, inst),
2897
28932898 .error_set_decl => try self.writePlNodeErrorSetDecl(stream, inst),
28942899
28952900 .add,
......@@ -3240,6 +3245,70 @@ const Writer = struct {
32403245 try self.writeSrc(stream, inst_data.src());
32413246 }
32423247
3248 fn writeStructInit(self: *Writer, stream: anytype, inst: Inst.Index) !void {
3249 const inst_data = self.code.instructions.items(.data)[inst].pl_node;
3250 const extra = self.code.extraData(Inst.StructInit, inst_data.payload_index);
3251 var field_i: u32 = 0;
3252 var extra_index = extra.end;
3253
3254 while (field_i < extra.data.fields_len) : (field_i += 1) {
3255 const item = self.code.extraData(Inst.StructInit.Item, extra_index);
3256 extra_index = item.end;
3257
3258 if (field_i != 0) {
3259 try stream.writeAll(", [");
3260 } else {
3261 try stream.writeAll("[");
3262 }
3263 try self.writeInstIndex(stream, item.data.field_type);
3264 try stream.writeAll(", ");
3265 try self.writeInstRef(stream, item.data.init);
3266 try stream.writeAll("]");
3267 }
3268 try stream.writeAll(") ");
3269 try self.writeSrc(stream, inst_data.src());
3270 }
3271
3272 fn writeStructInitAnon(self: *Writer, stream: anytype, inst: Inst.Index) !void {
3273 const inst_data = self.code.instructions.items(.data)[inst].pl_node;
3274 const extra = self.code.extraData(Inst.StructInitAnon, inst_data.payload_index);
3275 var field_i: u32 = 0;
3276 var extra_index = extra.end;
3277
3278 while (field_i < extra.data.fields_len) : (field_i += 1) {
3279 const item = self.code.extraData(Inst.StructInitAnon.Item, extra_index);
3280 extra_index = item.end;
3281
3282 const field_name = self.code.nullTerminatedString(item.data.field_name);
3283
3284 const prefix = if (field_i != 0) ", [" else "[";
3285 try stream.print("{s}[{s}=", .{ prefix, field_name });
3286 try self.writeInstRef(stream, item.data.init);
3287 try stream.writeAll("]");
3288 }
3289 try stream.writeAll(") ");
3290 try self.writeSrc(stream, inst_data.src());
3291 }
3292
3293 fn writeFieldType(self: *Writer, stream: anytype, inst: Inst.Index) !void {
3294 const inst_data = self.code.instructions.items(.data)[inst].pl_node;
3295 const extra = self.code.extraData(Inst.FieldType, inst_data.payload_index).data;
3296 try self.writeInstRef(stream, extra.container_type);
3297 const field_name = self.code.nullTerminatedString(extra.name_start);
3298 try stream.print(", {s}) ", .{field_name});
3299 try self.writeSrc(stream, inst_data.src());
3300 }
3301
3302 fn writeFieldTypeRef(self: *Writer, stream: anytype, inst: Inst.Index) !void {
3303 const inst_data = self.code.instructions.items(.data)[inst].pl_node;
3304 const extra = self.code.extraData(Inst.FieldTypeRef, inst_data.payload_index).data;
3305 try self.writeInstRef(stream, extra.container_type);
3306 try stream.writeAll(", ");
3307 try self.writeInstRef(stream, extra.field_name);
3308 try stream.writeAll(") ");
3309 try self.writeSrc(stream, inst_data.src());
3310 }
3311
32433312 fn writePlNodeErrorSetDecl(self: *Writer, stream: anytype, inst: Inst.Index) !void {
32443313 const inst_data = self.code.instructions.items(.data)[inst].pl_node;
32453314 const extra = self.code.extraData(Inst.ErrorSetDecl, inst_data.payload_index);