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