aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/codegen.zig2
-rw-r--r--src/link/Dwarf.zig28
2 files changed, 28 insertions, 2 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index cc7014a136..ca24f998e8 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -573,7 +573,6 @@ pub fn generateSymbol(
return Result{ .appended = {} };
},
.Union => {
- // TODO generate debug info for unions
const union_obj = typed_value.val.castTag(.@"union").?.data;
const layout = typed_value.ty.unionGetLayout(target);
@@ -749,7 +748,6 @@ pub fn generateSymbol(
return Result{ .appended = {} };
},
.ErrorSet => {
- // TODO generate debug info for error sets
switch (typed_value.val.tag()) {
.@"error" => {
const name = typed_value.val.getError().?;
diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig
index 370aac2734..353b40e201 100644
--- a/src/link/Dwarf.zig
+++ b/src/link/Dwarf.zig
@@ -468,6 +468,7 @@ pub fn commitDeclDebugInfo(
value_ptr.off = @intCast(u32, dbg_info_buffer.items.len);
try self.addDbgInfoType(
dbg_type_arena.allocator(),
+ module,
ty,
dbg_info_buffer,
dbg_info_type_relocs,
@@ -771,6 +772,7 @@ pub fn freeDecl(self: *Dwarf, decl: *Module.Decl) void {
fn addDbgInfoType(
self: *Dwarf,
arena: Allocator,
+ module: *Module,
ty: Type,
dbg_info_buffer: *std.ArrayList(u8),
dbg_info_type_relocs: *File.DbgInfoTypeRelocsTable,
@@ -1095,6 +1097,32 @@ fn addDbgInfoType(
try dbg_info_buffer.append(0);
}
},
+ .ErrorSet => {
+ // DW.AT.enumeration_type
+ try dbg_info_buffer.append(abbrev_enum_type);
+ // DW.AT.byte_size, DW.FORM.sdata
+ const abi_size = ty.abiSize(target);
+ try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size);
+ // DW.AT.name, DW.FORM.string
+ const name = try ty.nameAllocArena(arena, target);
+ try dbg_info_buffer.writer().print("{s}\x00", .{name});
+
+ const error_names = if (ty.isAnyError()) module.error_name_list.items else ty.errorSetNames();
+ for (error_names) |error_name| {
+ const kv = module.getErrorValue(error_name) catch unreachable;
+ // DW.AT.enumerator
+ try dbg_info_buffer.ensureUnusedCapacity(error_name.len + 2 + @sizeOf(u64));
+ dbg_info_buffer.appendAssumeCapacity(abbrev_enum_variant);
+ // DW.AT.name, DW.FORM.string
+ dbg_info_buffer.appendSliceAssumeCapacity(error_name);
+ dbg_info_buffer.appendAssumeCapacity(0);
+ // DW.AT.const_value, DW.FORM.data8
+ mem.writeInt(u64, dbg_info_buffer.addManyAsArrayAssumeCapacity(8), kv.value, target_endian);
+ }
+
+ // DW.AT.enumeration_type delimit children
+ try dbg_info_buffer.append(0);
+ },
else => {
log.debug("TODO implement .debug_info for type '{}'", .{ty.fmtDebug()});
try dbg_info_buffer.append(abbrev_pad1);