| ... | ... | @@ -881,45 +881,63 @@ fn addDbgInfoType( |
| 881 | 881 | } |
| 882 | 882 | }, |
| 883 | 883 | .Struct => blk: { |
| 884 | | if (ty.tag() == .tuple) { |
| 885 | | log.debug("TODO implement .debug_info for type '{}'", .{ty.fmtDebug()}); |
| 886 | | try dbg_info_buffer.append(abbrev_pad1); |
| 887 | | break :blk; |
| 888 | | } |
| 889 | | // try dbg_info_buffer.ensureUnusedCapacity(23); |
| 890 | 884 | // DW.AT.structure_type |
| 891 | 885 | try dbg_info_buffer.append(abbrev_struct_type); |
| 892 | 886 | // DW.AT.byte_size, DW.FORM.sdata |
| 893 | 887 | const abi_size = ty.abiSize(target); |
| 894 | 888 | try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size); |
| 895 | | // DW.AT.name, DW.FORM.string |
| 896 | | const struct_name = try ty.nameAllocArena(arena, target); |
| 897 | | try dbg_info_buffer.ensureUnusedCapacity(struct_name.len + 1); |
| 898 | | dbg_info_buffer.appendSliceAssumeCapacity(struct_name); |
| 899 | | dbg_info_buffer.appendAssumeCapacity(0); |
| 900 | 889 | |
| 901 | | const struct_obj = ty.castTag(.@"struct").?.data; |
| 902 | | if (struct_obj.layout == .Packed) { |
| 903 | | log.debug("TODO implement .debug_info for packed structs", .{}); |
| 904 | | break :blk; |
| 905 | | } |
| 890 | switch (ty.tag()) { |
| 891 | .tuple, .anon_struct => { |
| 892 | // DW.AT.name, DW.FORM.string |
| 893 | try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(target)}); |
| 894 | |
| 895 | const fields = ty.tupleFields(); |
| 896 | for (fields.types) |field, field_index| { |
| 897 | // DW.AT.member |
| 898 | try dbg_info_buffer.append(abbrev_struct_member); |
| 899 | // DW.AT.name, DW.FORM.string |
| 900 | try dbg_info_buffer.writer().print("{d}\x00", .{field_index}); |
| 901 | // DW.AT.type, DW.FORM.ref4 |
| 902 | var index = dbg_info_buffer.items.len; |
| 903 | try dbg_info_buffer.resize(index + 4); |
| 904 | try relocs.append(.{ .ty = field, .reloc = @intCast(u32, index) }); |
| 905 | // DW.AT.data_member_location, DW.FORM.sdata |
| 906 | const field_off = ty.structFieldOffset(field_index, target); |
| 907 | try leb128.writeULEB128(dbg_info_buffer.writer(), field_off); |
| 908 | } |
| 909 | }, |
| 910 | else => { |
| 911 | // DW.AT.name, DW.FORM.string |
| 912 | const struct_name = try ty.nameAllocArena(arena, target); |
| 913 | try dbg_info_buffer.ensureUnusedCapacity(struct_name.len + 1); |
| 914 | dbg_info_buffer.appendSliceAssumeCapacity(struct_name); |
| 915 | dbg_info_buffer.appendAssumeCapacity(0); |
| 916 | |
| 917 | const struct_obj = ty.castTag(.@"struct").?.data; |
| 918 | if (struct_obj.layout == .Packed) { |
| 919 | log.debug("TODO implement .debug_info for packed structs", .{}); |
| 920 | break :blk; |
| 921 | } |
| 906 | 922 | |
| 907 | | const fields = ty.structFields(); |
| 908 | | for (fields.keys()) |field_name, field_index| { |
| 909 | | const field = fields.get(field_name).?; |
| 910 | | // DW.AT.member |
| 911 | | try dbg_info_buffer.ensureUnusedCapacity(field_name.len + 2); |
| 912 | | dbg_info_buffer.appendAssumeCapacity(abbrev_struct_member); |
| 913 | | // DW.AT.name, DW.FORM.string |
| 914 | | dbg_info_buffer.appendSliceAssumeCapacity(field_name); |
| 915 | | dbg_info_buffer.appendAssumeCapacity(0); |
| 916 | | // DW.AT.type, DW.FORM.ref4 |
| 917 | | var index = dbg_info_buffer.items.len; |
| 918 | | try dbg_info_buffer.resize(index + 4); |
| 919 | | try relocs.append(.{ .ty = field.ty, .reloc = @intCast(u32, index) }); |
| 920 | | // DW.AT.data_member_location, DW.FORM.sdata |
| 921 | | const field_off = ty.structFieldOffset(field_index, target); |
| 922 | | try leb128.writeULEB128(dbg_info_buffer.writer(), field_off); |
| 923 | const fields = ty.structFields(); |
| 924 | for (fields.keys()) |field_name, field_index| { |
| 925 | const field = fields.get(field_name).?; |
| 926 | // DW.AT.member |
| 927 | try dbg_info_buffer.ensureUnusedCapacity(field_name.len + 2); |
| 928 | dbg_info_buffer.appendAssumeCapacity(abbrev_struct_member); |
| 929 | // DW.AT.name, DW.FORM.string |
| 930 | dbg_info_buffer.appendSliceAssumeCapacity(field_name); |
| 931 | dbg_info_buffer.appendAssumeCapacity(0); |
| 932 | // DW.AT.type, DW.FORM.ref4 |
| 933 | var index = dbg_info_buffer.items.len; |
| 934 | try dbg_info_buffer.resize(index + 4); |
| 935 | try relocs.append(.{ .ty = field.ty, .reloc = @intCast(u32, index) }); |
| 936 | // DW.AT.data_member_location, DW.FORM.sdata |
| 937 | const field_off = ty.structFieldOffset(field_index, target); |
| 938 | try leb128.writeULEB128(dbg_info_buffer.writer(), field_off); |
| 939 | } |
| 940 | }, |
| 923 | 941 | } |
| 924 | 942 | |
| 925 | 943 | // DW.AT.structure_type delimit children |