| ... | ... | @@ -1107,6 +1107,16 @@ fn addDbgInfoType( |
| 1107 | 1107 | const name = try ty.nameAllocArena(arena, target); |
| 1108 | 1108 | try dbg_info_buffer.writer().print("{s}\x00", .{name}); |
| 1109 | 1109 | |
| 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 | 1120 | const error_names = if (ty.isAnyError()) module.error_name_list.items else ty.errorSetNames(); |
| 1111 | 1121 | for (error_names) |error_name| { |
| 1112 | 1122 | const kv = module.getErrorValue(error_name) catch unreachable; |
| ... | ... | @@ -1123,6 +1133,50 @@ fn addDbgInfoType( |
| 1123 | 1133 | // DW.AT.enumeration_type delimit children |
| 1124 | 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 | 1180 | else => { |
| 1127 | 1181 | log.debug("TODO implement .debug_info for type '{}'", .{ty.fmtDebug()}); |
| 1128 | 1182 | try dbg_info_buffer.append(abbrev_pad1); |