authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-10-23 14:27:00+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-10-23 22:08:47+02:00
loga07f288eb1772ac25fd0785b142c6ee7e09b2986
tree30c98f32ed5f4ce2d425db74cd18809a5c00883b
parent4bf27da6a6f6cf476ca907dd661c0c40c7c68286

dwarf: add missing struct_type sentinel - make DWARF data valid again!


1 files changed, 56 insertions(+), 54 deletions(-)

src/link/Dwarf.zig+56-54
...@@ -282,44 +282,19 @@ pub const DeclState = struct {...@@ -282,44 +282,19 @@ pub const DeclState = struct {
282 // DW.AT.array_type delimit children282 // DW.AT.array_type delimit children
283 try dbg_info_buffer.append(0);283 try dbg_info_buffer.append(0);
284 },284 },
285 .Struct => blk: {285 .Struct => {
286 // DW.AT.structure_type286 // DW.AT.structure_type
287 try dbg_info_buffer.append(@intFromEnum(AbbrevKind.struct_type));287 try dbg_info_buffer.append(@intFromEnum(AbbrevKind.struct_type));
288 // DW.AT.byte_size, DW.FORM.udata288 // DW.AT.byte_size, DW.FORM.udata
289 try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(mod));289 try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(mod));
290290
291 switch (ip.indexToKey(ty.ip_index)) {291 blk: {
292 .anon_struct_type => |fields| {292 switch (ip.indexToKey(ty.ip_index)) {
293 // DW.AT.name, DW.FORM.string293 .anon_struct_type => |fields| {
294 try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(mod)});
295
296 for (fields.types.get(ip), 0..) |field_ty, field_index| {
297 // DW.AT.member
298 try dbg_info_buffer.append(@intFromEnum(AbbrevKind.struct_member));
299 // DW.AT.name, DW.FORM.string294 // DW.AT.name, DW.FORM.string
300 try dbg_info_buffer.writer().print("{d}\x00", .{field_index});295 try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(mod)});
301 // DW.AT.type, DW.FORM.ref4
302 var index = dbg_info_buffer.items.len;
303 try dbg_info_buffer.resize(index + 4);
304 try self.addTypeRelocGlobal(atom_index, field_ty.toType(), @as(u32, @intCast(index)));
305 // DW.AT.data_member_location, DW.FORM.udata
306 const field_off = ty.structFieldOffset(field_index, mod);
307 try leb128.writeULEB128(dbg_info_buffer.writer(), field_off);
308 }
309 },
310 .struct_type => |struct_type| {
311 // DW.AT.name, DW.FORM.string
312 try ty.print(dbg_info_buffer.writer(), mod);
313 try dbg_info_buffer.append(0);
314
315 if (struct_type.layout == .Packed) {
316 log.debug("TODO implement .debug_info for packed structs", .{});
317 break :blk;
318 }
319296
320 if (struct_type.isTuple(ip)) {297 for (fields.types.get(ip), 0..) |field_ty, field_index| {
321 for (struct_type.field_types.get(ip), struct_type.offsets.get(ip), 0..) |field_ty, field_off, field_index| {
322 if (!field_ty.toType().hasRuntimeBits(mod)) continue;
323 // DW.AT.member298 // DW.AT.member
324 try dbg_info_buffer.append(@intFromEnum(AbbrevKind.struct_member));299 try dbg_info_buffer.append(@intFromEnum(AbbrevKind.struct_member));
325 // DW.AT.name, DW.FORM.string300 // DW.AT.name, DW.FORM.string
...@@ -329,32 +304,59 @@ pub const DeclState = struct {...@@ -329,32 +304,59 @@ pub const DeclState = struct {
329 try dbg_info_buffer.resize(index + 4);304 try dbg_info_buffer.resize(index + 4);
330 try self.addTypeRelocGlobal(atom_index, field_ty.toType(), @as(u32, @intCast(index)));305 try self.addTypeRelocGlobal(atom_index, field_ty.toType(), @as(u32, @intCast(index)));
331 // DW.AT.data_member_location, DW.FORM.udata306 // DW.AT.data_member_location, DW.FORM.udata
307 const field_off = ty.structFieldOffset(field_index, mod);
332 try leb128.writeULEB128(dbg_info_buffer.writer(), field_off);308 try leb128.writeULEB128(dbg_info_buffer.writer(), field_off);
333 }309 }
334 } else {310 },
335 for (311 .struct_type => |struct_type| {
336 struct_type.field_names.get(ip),312 // DW.AT.name, DW.FORM.string
337 struct_type.field_types.get(ip),313 try ty.print(dbg_info_buffer.writer(), mod);
338 struct_type.offsets.get(ip),314 try dbg_info_buffer.append(0);
339 ) |field_name_ip, field_ty, field_off| {315
340 if (!field_ty.toType().hasRuntimeBits(mod)) continue;316 if (struct_type.layout == .Packed) {
341 const field_name = ip.stringToSlice(field_name_ip);317 log.debug("TODO implement .debug_info for packed structs", .{});
342 // DW.AT.member318 break :blk;
343 try dbg_info_buffer.ensureUnusedCapacity(field_name.len + 2);
344 dbg_info_buffer.appendAssumeCapacity(@intFromEnum(AbbrevKind.struct_member));
345 // DW.AT.name, DW.FORM.string
346 dbg_info_buffer.appendSliceAssumeCapacity(field_name);
347 dbg_info_buffer.appendAssumeCapacity(0);
348 // DW.AT.type, DW.FORM.ref4
349 var index = dbg_info_buffer.items.len;
350 try dbg_info_buffer.resize(index + 4);
351 try self.addTypeRelocGlobal(atom_index, field_ty.toType(), @intCast(index));
352 // DW.AT.data_member_location, DW.FORM.udata
353 try leb128.writeULEB128(dbg_info_buffer.writer(), field_off);
354 }319 }
355 }320
356 },321 if (struct_type.isTuple(ip)) {
357 else => unreachable,322 for (struct_type.field_types.get(ip), struct_type.offsets.get(ip), 0..) |field_ty, field_off, field_index| {
323 if (!field_ty.toType().hasRuntimeBits(mod)) continue;
324 // DW.AT.member
325 try dbg_info_buffer.append(@intFromEnum(AbbrevKind.struct_member));
326 // DW.AT.name, DW.FORM.string
327 try dbg_info_buffer.writer().print("{d}\x00", .{field_index});
328 // DW.AT.type, DW.FORM.ref4
329 var index = dbg_info_buffer.items.len;
330 try dbg_info_buffer.resize(index + 4);
331 try self.addTypeRelocGlobal(atom_index, field_ty.toType(), @as(u32, @intCast(index)));
332 // DW.AT.data_member_location, DW.FORM.udata
333 try leb128.writeULEB128(dbg_info_buffer.writer(), field_off);
334 }
335 } else {
336 for (
337 struct_type.field_names.get(ip),
338 struct_type.field_types.get(ip),
339 struct_type.offsets.get(ip),
340 ) |field_name_ip, field_ty, field_off| {
341 if (!field_ty.toType().hasRuntimeBits(mod)) continue;
342 const field_name = ip.stringToSlice(field_name_ip);
343 // DW.AT.member
344 try dbg_info_buffer.ensureUnusedCapacity(field_name.len + 2);
345 dbg_info_buffer.appendAssumeCapacity(@intFromEnum(AbbrevKind.struct_member));
346 // DW.AT.name, DW.FORM.string
347 dbg_info_buffer.appendSliceAssumeCapacity(field_name);
348 dbg_info_buffer.appendAssumeCapacity(0);
349 // DW.AT.type, DW.FORM.ref4
350 var index = dbg_info_buffer.items.len;
351 try dbg_info_buffer.resize(index + 4);
352 try self.addTypeRelocGlobal(atom_index, field_ty.toType(), @intCast(index));
353 // DW.AT.data_member_location, DW.FORM.udata
354 try leb128.writeULEB128(dbg_info_buffer.writer(), field_off);
355 }
356 }
357 },
358 else => unreachable,
359 }
358 }360 }
359361
360 // DW.AT.structure_type delimit children362 // DW.AT.structure_type delimit children