authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-25 13:55:12+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-27 20:53:06+02:00
loga1040a105ab4dcab9e23d218d2cfa4e58f56be37
treefec4a80b55cec02e4e3521ad0a6013042606b6a5
parentd15bbebe2e6b8fcbfcd730a6c0d1be621b27045d

dwarf: add debug info for error sets


2 files changed, 28 insertions(+), 2 deletions(-)

src/codegen.zig-2
......@@ -573,7 +573,6 @@ pub fn generateSymbol(
573573 return Result{ .appended = {} };
574574 },
575575 .Union => {
576 // TODO generate debug info for unions
577576 const union_obj = typed_value.val.castTag(.@"union").?.data;
578577 const layout = typed_value.ty.unionGetLayout(target);
579578
......@@ -749,7 +748,6 @@ pub fn generateSymbol(
749748 return Result{ .appended = {} };
750749 },
751750 .ErrorSet => {
752 // TODO generate debug info for error sets
753751 switch (typed_value.val.tag()) {
754752 .@"error" => {
755753 const name = typed_value.val.getError().?;
src/link/Dwarf.zig+28
......@@ -468,6 +468,7 @@ pub fn commitDeclDebugInfo(
468468 value_ptr.off = @intCast(u32, dbg_info_buffer.items.len);
469469 try self.addDbgInfoType(
470470 dbg_type_arena.allocator(),
471 module,
471472 ty,
472473 dbg_info_buffer,
473474 dbg_info_type_relocs,
......@@ -771,6 +772,7 @@ pub fn freeDecl(self: *Dwarf, decl: *Module.Decl) void {
771772fn addDbgInfoType(
772773 self: *Dwarf,
773774 arena: Allocator,
775 module: *Module,
774776 ty: Type,
775777 dbg_info_buffer: *std.ArrayList(u8),
776778 dbg_info_type_relocs: *File.DbgInfoTypeRelocsTable,
......@@ -1095,6 +1097,32 @@ fn addDbgInfoType(
10951097 try dbg_info_buffer.append(0);
10961098 }
10971099 },
1100 .ErrorSet => {
1101 // DW.AT.enumeration_type
1102 try dbg_info_buffer.append(abbrev_enum_type);
1103 // DW.AT.byte_size, DW.FORM.sdata
1104 const abi_size = ty.abiSize(target);
1105 try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size);
1106 // DW.AT.name, DW.FORM.string
1107 const name = try ty.nameAllocArena(arena, target);
1108 try dbg_info_buffer.writer().print("{s}\x00", .{name});
1109
1110 const error_names = if (ty.isAnyError()) module.error_name_list.items else ty.errorSetNames();
1111 for (error_names) |error_name| {
1112 const kv = module.getErrorValue(error_name) catch unreachable;
1113 // DW.AT.enumerator
1114 try dbg_info_buffer.ensureUnusedCapacity(error_name.len + 2 + @sizeOf(u64));
1115 dbg_info_buffer.appendAssumeCapacity(abbrev_enum_variant);
1116 // DW.AT.name, DW.FORM.string
1117 dbg_info_buffer.appendSliceAssumeCapacity(error_name);
1118 dbg_info_buffer.appendAssumeCapacity(0);
1119 // DW.AT.const_value, DW.FORM.data8
1120 mem.writeInt(u64, dbg_info_buffer.addManyAsArrayAssumeCapacity(8), kv.value, target_endian);
1121 }
1122
1123 // DW.AT.enumeration_type delimit children
1124 try dbg_info_buffer.append(0);
1125 },
10981126 else => {
10991127 log.debug("TODO implement .debug_info for type '{}'", .{ty.fmtDebug()});
11001128 try dbg_info_buffer.append(abbrev_pad1);