authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-24 14:40:58+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-24 17:02:29+01:00
log2286f9bd1f1c622d182e8b815864ad90d3ff0e92
treea6b142dc62f18ae842aaf6465573942c61faa881
parent2af69710a7b1513f3540ae0e1178cb5f3948204d

dwarf: add debug info for tuples and anon structs


1 files changed, 50 insertions(+), 32 deletions(-)

src/link/Dwarf.zig+50-32
...@@ -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_type884 // 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.sdata886 // 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);
900889
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 }
906922
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.member926 // 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.string929 // 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.ref4932 // 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.sdata936 // 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 }
924942
925 // DW.AT.structure_type delimit children943 // DW.AT.structure_type delimit children