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(...@@ -573,7 +573,6 @@ pub fn generateSymbol(
573 return Result{ .appended = {} };573 return Result{ .appended = {} };
574 },574 },
575 .Union => {575 .Union => {
576 // TODO generate debug info for unions
577 const union_obj = typed_value.val.castTag(.@"union").?.data;576 const union_obj = typed_value.val.castTag(.@"union").?.data;
578 const layout = typed_value.ty.unionGetLayout(target);577 const layout = typed_value.ty.unionGetLayout(target);
579578
...@@ -749,7 +748,6 @@ pub fn generateSymbol(...@@ -749,7 +748,6 @@ pub fn generateSymbol(
749 return Result{ .appended = {} };748 return Result{ .appended = {} };
750 },749 },
751 .ErrorSet => {750 .ErrorSet => {
752 // TODO generate debug info for error sets
753 switch (typed_value.val.tag()) {751 switch (typed_value.val.tag()) {
754 .@"error" => {752 .@"error" => {
755 const name = typed_value.val.getError().?;753 const name = typed_value.val.getError().?;
src/link/Dwarf.zig+28
...@@ -468,6 +468,7 @@ pub fn commitDeclDebugInfo(...@@ -468,6 +468,7 @@ pub fn commitDeclDebugInfo(
468 value_ptr.off = @intCast(u32, dbg_info_buffer.items.len);468 value_ptr.off = @intCast(u32, dbg_info_buffer.items.len);
469 try self.addDbgInfoType(469 try self.addDbgInfoType(
470 dbg_type_arena.allocator(),470 dbg_type_arena.allocator(),
471 module,
471 ty,472 ty,
472 dbg_info_buffer,473 dbg_info_buffer,
473 dbg_info_type_relocs,474 dbg_info_type_relocs,
...@@ -771,6 +772,7 @@ pub fn freeDecl(self: *Dwarf, decl: *Module.Decl) void {...@@ -771,6 +772,7 @@ pub fn freeDecl(self: *Dwarf, decl: *Module.Decl) void {
771fn addDbgInfoType(772fn addDbgInfoType(
772 self: *Dwarf,773 self: *Dwarf,
773 arena: Allocator,774 arena: Allocator,
775 module: *Module,
774 ty: Type,776 ty: Type,
775 dbg_info_buffer: *std.ArrayList(u8),777 dbg_info_buffer: *std.ArrayList(u8),
776 dbg_info_type_relocs: *File.DbgInfoTypeRelocsTable,778 dbg_info_type_relocs: *File.DbgInfoTypeRelocsTable,
...@@ -1095,6 +1097,32 @@ fn addDbgInfoType(...@@ -1095,6 +1097,32 @@ fn addDbgInfoType(
1095 try dbg_info_buffer.append(0);1097 try dbg_info_buffer.append(0);
1096 }1098 }
1097 },1099 },
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 },
1098 else => {1126 else => {
1099 log.debug("TODO implement .debug_info for type '{}'", .{ty.fmtDebug()});1127 log.debug("TODO implement .debug_info for type '{}'", .{ty.fmtDebug()});
1100 try dbg_info_buffer.append(abbrev_pad1);1128 try dbg_info_buffer.append(abbrev_pad1);