diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-10-23 14:27:00 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-10-23 22:08:47 +0200 |
| commit | a07f288eb1772ac25fd0785b142c6ee7e09b2986 (patch) | |
| tree | 30c98f32ed5f4ce2d425db74cd18809a5c00883b /src/link | |
| parent | 4bf27da6a6f6cf476ca907dd661c0c40c7c68286 (diff) | |
| download | zig-a07f288eb1772ac25fd0785b142c6ee7e09b2986.tar.gz zig-a07f288eb1772ac25fd0785b142c6ee7e09b2986.zip | |
dwarf: add missing struct_type sentinel - make DWARF data valid again!
Diffstat (limited to 'src/link')
| -rw-r--r-- | src/link/Dwarf.zig | 110 |
1 files changed, 56 insertions, 54 deletions
diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig index ae08c059fd..82cd6153de 100644 --- a/src/link/Dwarf.zig +++ b/src/link/Dwarf.zig @@ -282,44 +282,19 @@ pub const DeclState = struct { // DW.AT.array_type delimit children try dbg_info_buffer.append(0); }, - .Struct => blk: { + .Struct => { // DW.AT.structure_type try dbg_info_buffer.append(@intFromEnum(AbbrevKind.struct_type)); // DW.AT.byte_size, DW.FORM.udata try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(mod)); - switch (ip.indexToKey(ty.ip_index)) { - .anon_struct_type => |fields| { - // DW.AT.name, DW.FORM.string - try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(mod)}); - - for (fields.types.get(ip), 0..) |field_ty, field_index| { - // DW.AT.member - try dbg_info_buffer.append(@intFromEnum(AbbrevKind.struct_member)); + blk: { + switch (ip.indexToKey(ty.ip_index)) { + .anon_struct_type => |fields| { // DW.AT.name, DW.FORM.string - try dbg_info_buffer.writer().print("{d}\x00", .{field_index}); - // DW.AT.type, DW.FORM.ref4 - var index = dbg_info_buffer.items.len; - try dbg_info_buffer.resize(index + 4); - try self.addTypeRelocGlobal(atom_index, field_ty.toType(), @as(u32, @intCast(index))); - // DW.AT.data_member_location, DW.FORM.udata - const field_off = ty.structFieldOffset(field_index, mod); - try leb128.writeULEB128(dbg_info_buffer.writer(), field_off); - } - }, - .struct_type => |struct_type| { - // DW.AT.name, DW.FORM.string - try ty.print(dbg_info_buffer.writer(), mod); - try dbg_info_buffer.append(0); - - if (struct_type.layout == .Packed) { - log.debug("TODO implement .debug_info for packed structs", .{}); - break :blk; - } + try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(mod)}); - if (struct_type.isTuple(ip)) { - for (struct_type.field_types.get(ip), struct_type.offsets.get(ip), 0..) |field_ty, field_off, field_index| { - if (!field_ty.toType().hasRuntimeBits(mod)) continue; + for (fields.types.get(ip), 0..) |field_ty, field_index| { // DW.AT.member try dbg_info_buffer.append(@intFromEnum(AbbrevKind.struct_member)); // DW.AT.name, DW.FORM.string @@ -329,32 +304,59 @@ pub const DeclState = struct { try dbg_info_buffer.resize(index + 4); try self.addTypeRelocGlobal(atom_index, field_ty.toType(), @as(u32, @intCast(index))); // DW.AT.data_member_location, DW.FORM.udata + const field_off = ty.structFieldOffset(field_index, mod); try leb128.writeULEB128(dbg_info_buffer.writer(), field_off); } - } else { - for ( - struct_type.field_names.get(ip), - struct_type.field_types.get(ip), - struct_type.offsets.get(ip), - ) |field_name_ip, field_ty, field_off| { - if (!field_ty.toType().hasRuntimeBits(mod)) continue; - const field_name = ip.stringToSlice(field_name_ip); - // DW.AT.member - try dbg_info_buffer.ensureUnusedCapacity(field_name.len + 2); - dbg_info_buffer.appendAssumeCapacity(@intFromEnum(AbbrevKind.struct_member)); - // DW.AT.name, DW.FORM.string - dbg_info_buffer.appendSliceAssumeCapacity(field_name); - dbg_info_buffer.appendAssumeCapacity(0); - // DW.AT.type, DW.FORM.ref4 - var index = dbg_info_buffer.items.len; - try dbg_info_buffer.resize(index + 4); - try self.addTypeRelocGlobal(atom_index, field_ty.toType(), @intCast(index)); - // DW.AT.data_member_location, DW.FORM.udata - try leb128.writeULEB128(dbg_info_buffer.writer(), field_off); + }, + .struct_type => |struct_type| { + // DW.AT.name, DW.FORM.string + try ty.print(dbg_info_buffer.writer(), mod); + try dbg_info_buffer.append(0); + + if (struct_type.layout == .Packed) { + log.debug("TODO implement .debug_info for packed structs", .{}); + break :blk; } - } - }, - else => unreachable, + + if (struct_type.isTuple(ip)) { + for (struct_type.field_types.get(ip), struct_type.offsets.get(ip), 0..) |field_ty, field_off, field_index| { + if (!field_ty.toType().hasRuntimeBits(mod)) continue; + // DW.AT.member + try dbg_info_buffer.append(@intFromEnum(AbbrevKind.struct_member)); + // DW.AT.name, DW.FORM.string + try dbg_info_buffer.writer().print("{d}\x00", .{field_index}); + // DW.AT.type, DW.FORM.ref4 + var index = dbg_info_buffer.items.len; + try dbg_info_buffer.resize(index + 4); + try self.addTypeRelocGlobal(atom_index, field_ty.toType(), @as(u32, @intCast(index))); + // DW.AT.data_member_location, DW.FORM.udata + try leb128.writeULEB128(dbg_info_buffer.writer(), field_off); + } + } else { + for ( + struct_type.field_names.get(ip), + struct_type.field_types.get(ip), + struct_type.offsets.get(ip), + ) |field_name_ip, field_ty, field_off| { + if (!field_ty.toType().hasRuntimeBits(mod)) continue; + const field_name = ip.stringToSlice(field_name_ip); + // DW.AT.member + try dbg_info_buffer.ensureUnusedCapacity(field_name.len + 2); + dbg_info_buffer.appendAssumeCapacity(@intFromEnum(AbbrevKind.struct_member)); + // DW.AT.name, DW.FORM.string + dbg_info_buffer.appendSliceAssumeCapacity(field_name); + dbg_info_buffer.appendAssumeCapacity(0); + // DW.AT.type, DW.FORM.ref4 + var index = dbg_info_buffer.items.len; + try dbg_info_buffer.resize(index + 4); + try self.addTypeRelocGlobal(atom_index, field_ty.toType(), @intCast(index)); + // DW.AT.data_member_location, DW.FORM.udata + try leb128.writeULEB128(dbg_info_buffer.writer(), field_off); + } + } + }, + else => unreachable, + } } // DW.AT.structure_type delimit children |
