authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-25 15:50:42+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-27 20:53:06+02:00
log4985abcc494cc545e34b164fe12de592cf1b50f4
treedbf589552c8b994fd4f23eb2bbb350608a84035b
parenta1040a105ab4dcab9e23d218d2cfa4e58f56be37

dwarf: add debug info for error unions


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

src/codegen.zig-1
...@@ -694,7 +694,6 @@ pub fn generateSymbol(...@@ -694,7 +694,6 @@ pub fn generateSymbol(
694 return Result{ .appended = {} };694 return Result{ .appended = {} };
695 },695 },
696 .ErrorUnion => {696 .ErrorUnion => {
697 // TODO generate debug info for error unions
698 const error_ty = typed_value.ty.errorUnionSet();697 const error_ty = typed_value.ty.errorUnionSet();
699 const payload_ty = typed_value.ty.errorUnionPayload();698 const payload_ty = typed_value.ty.errorUnionPayload();
700 const is_payload = typed_value.val.errorUnionIsPayload();699 const is_payload = typed_value.val.errorUnionIsPayload();
src/link/Dwarf.zig+54
...@@ -1107,6 +1107,16 @@ fn addDbgInfoType(...@@ -1107,6 +1107,16 @@ fn addDbgInfoType(
1107 const name = try ty.nameAllocArena(arena, target);1107 const name = try ty.nameAllocArena(arena, target);
1108 try dbg_info_buffer.writer().print("{s}\x00", .{name});1108 try dbg_info_buffer.writer().print("{s}\x00", .{name});
11091109
1110 // DW.AT.enumerator
1111 const no_error = "(no error)";
1112 try dbg_info_buffer.ensureUnusedCapacity(no_error.len + 2 + @sizeOf(u64));
1113 dbg_info_buffer.appendAssumeCapacity(abbrev_enum_variant);
1114 // DW.AT.name, DW.FORM.string
1115 dbg_info_buffer.appendSliceAssumeCapacity(no_error);
1116 dbg_info_buffer.appendAssumeCapacity(0);
1117 // DW.AT.const_value, DW.FORM.data8
1118 mem.writeInt(u64, dbg_info_buffer.addManyAsArrayAssumeCapacity(8), 0, target_endian);
1119
1110 const error_names = if (ty.isAnyError()) module.error_name_list.items else ty.errorSetNames();1120 const error_names = if (ty.isAnyError()) module.error_name_list.items else ty.errorSetNames();
1111 for (error_names) |error_name| {1121 for (error_names) |error_name| {
1112 const kv = module.getErrorValue(error_name) catch unreachable;1122 const kv = module.getErrorValue(error_name) catch unreachable;
...@@ -1123,6 +1133,50 @@ fn addDbgInfoType(...@@ -1123,6 +1133,50 @@ fn addDbgInfoType(
1123 // DW.AT.enumeration_type delimit children1133 // DW.AT.enumeration_type delimit children
1124 try dbg_info_buffer.append(0);1134 try dbg_info_buffer.append(0);
1125 },1135 },
1136 .ErrorUnion => {
1137 const error_ty = ty.errorUnionSet();
1138 const payload_ty = ty.errorUnionPayload();
1139 const abi_size = ty.abiSize(target);
1140 const abi_align = ty.abiAlignment(target);
1141 const payload_off = mem.alignForwardGeneric(u64, error_ty.abiSize(target), abi_align);
1142
1143 // DW.AT.structure_type
1144 try dbg_info_buffer.append(abbrev_struct_type);
1145 // DW.AT.byte_size, DW.FORM.sdata
1146 try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size);
1147 // DW.AT.name, DW.FORM.string
1148 const name = try ty.nameAllocArena(arena, target);
1149 try dbg_info_buffer.writer().print("{s}\x00", .{name});
1150
1151 // DW.AT.member
1152 try dbg_info_buffer.ensureUnusedCapacity(7);
1153 dbg_info_buffer.appendAssumeCapacity(abbrev_struct_member);
1154 // DW.AT.name, DW.FORM.string
1155 dbg_info_buffer.appendSliceAssumeCapacity("value");
1156 dbg_info_buffer.appendAssumeCapacity(0);
1157 // DW.AT.type, DW.FORM.ref4
1158 var index = dbg_info_buffer.items.len;
1159 try dbg_info_buffer.resize(index + 4);
1160 try relocs.append(.{ .ty = payload_ty, .reloc = @intCast(u32, index) });
1161 // DW.AT.data_member_location, DW.FORM.sdata
1162 try leb128.writeULEB128(dbg_info_buffer.writer(), payload_off);
1163
1164 // DW.AT.member
1165 try dbg_info_buffer.ensureUnusedCapacity(5);
1166 dbg_info_buffer.appendAssumeCapacity(abbrev_struct_member);
1167 // DW.AT.name, DW.FORM.string
1168 dbg_info_buffer.appendSliceAssumeCapacity("err");
1169 dbg_info_buffer.appendAssumeCapacity(0);
1170 // DW.AT.type, DW.FORM.ref4
1171 index = dbg_info_buffer.items.len;
1172 try dbg_info_buffer.resize(index + 4);
1173 try relocs.append(.{ .ty = error_ty, .reloc = @intCast(u32, index) });
1174 // DW.AT.data_member_location, DW.FORM.sdata
1175 try dbg_info_buffer.append(0);
1176
1177 // DW.AT.structure_type delimit children
1178 try dbg_info_buffer.append(0);
1179 },
1126 else => {1180 else => {
1127 log.debug("TODO implement .debug_info for type '{}'", .{ty.fmtDebug()});1181 log.debug("TODO implement .debug_info for type '{}'", .{ty.fmtDebug()});
1128 try dbg_info_buffer.append(abbrev_pad1);1182 try dbg_info_buffer.append(abbrev_pad1);