authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-05 20:17:58+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-05 20:18:18+01:00
log1252bdd4d63eda5ee70b7f58979b2471c2f83555
tree9f490f94aad158a0d06a777c7c6e7a8f748bb677
parent9a027d9ee33277220b8a8a5eb3d4edd575083366

elf: add debug info for non-ptr optionals


2 files changed, 56 insertions(+), 24 deletions(-)

src/codegen.zig-1
......@@ -639,7 +639,6 @@ pub fn generateSymbol(
639639 return Result{ .appended = {} };
640640 },
641641 .Optional => {
642 // TODO generate debug info for optionals
643642 var opt_buf: Type.Payload.ElemType = undefined;
644643 const payload_type = typed_value.ty.optionalChild(&opt_buf);
645644 const is_pl = !typed_value.val.isNull();
src/link/Elf.zig+56-23
......@@ -983,10 +983,9 @@ pub const abbrev_subprogram_retvoid = 3;
983983pub const abbrev_base_type = 4;
984984pub const abbrev_ptr_type = 5;
985985pub const abbrev_struct_type = 6;
986pub const abbrev_anon_struct_type = 7;
987pub const abbrev_struct_member = 8;
988pub const abbrev_pad1 = 9;
989pub const abbrev_parameter = 10;
986pub const abbrev_struct_member = 7;
987pub const abbrev_pad1 = 8;
988pub const abbrev_parameter = 9;
990989
991990pub fn flush(self: *Elf, comp: *Compilation) !void {
992991 if (self.base.options.emit == null) {
......@@ -1127,13 +1126,6 @@ pub fn flushModule(self: *Elf, comp: *Compilation) !void {
11271126 DW.FORM.string,
11281127 0,
11291128 0, // table sentinel
1130 abbrev_anon_struct_type,
1131 DW.TAG.structure_type,
1132 DW.CHILDREN.yes, // header
1133 DW.AT.byte_size,
1134 DW.FORM.sdata,
1135 0,
1136 0, // table sentinel
11371129 abbrev_struct_member,
11381130 DW.TAG.member,
11391131 DW.CHILDREN.no, // header
......@@ -3186,6 +3178,7 @@ fn addDbgInfoType(
31863178 dbg_info_buffer: *std.ArrayList(u8),
31873179 dbg_info_type_relocs: *File.DbgInfoTypeRelocsTable,
31883180) error{OutOfMemory}!void {
3181 const target = self.base.options.target;
31893182 var relocs = std.ArrayList(struct { ty: Type, reloc: u32 }).init(arena);
31903183
31913184 switch (ty.zigTypeTag()) {
......@@ -3202,7 +3195,7 @@ fn addDbgInfoType(
32023195 });
32033196 },
32043197 .Int => {
3205 const info = ty.intInfo(self.base.options.target);
3198 const info = ty.intInfo(target);
32063199 try dbg_info_buffer.ensureUnusedCapacity(12);
32073200 dbg_info_buffer.appendAssumeCapacity(abbrev_base_type);
32083201 // DW.AT.encoding, DW.FORM.data1
......@@ -3211,7 +3204,7 @@ fn addDbgInfoType(
32113204 .unsigned => DW.ATE.unsigned,
32123205 });
32133206 // DW.AT.byte_size, DW.FORM.data1
3214 dbg_info_buffer.appendAssumeCapacity(@intCast(u8, ty.abiSize(self.base.options.target)));
3207 dbg_info_buffer.appendAssumeCapacity(@intCast(u8, ty.abiSize(target)));
32153208 // DW.AT.name, DW.FORM.string
32163209 try dbg_info_buffer.writer().print("{}\x00", .{ty});
32173210 },
......@@ -3222,23 +3215,61 @@ fn addDbgInfoType(
32223215 // DW.AT.encoding, DW.FORM.data1
32233216 dbg_info_buffer.appendAssumeCapacity(DW.ATE.address);
32243217 // DW.AT.byte_size, DW.FORM.data1
3225 dbg_info_buffer.appendAssumeCapacity(@intCast(u8, ty.abiSize(self.base.options.target)));
3218 dbg_info_buffer.appendAssumeCapacity(@intCast(u8, ty.abiSize(target)));
32263219 // DW.AT.name, DW.FORM.string
32273220 try dbg_info_buffer.writer().print("{}\x00", .{ty});
32283221 } else {
3229 log.debug("TODO implement .debug_info for type '{}'", .{ty});
3230 try dbg_info_buffer.append(abbrev_pad1);
3222 // Non-pointer optionals are structs: struct { .maybe = *, .val = * }
3223 var buf = try arena.create(Type.Payload.ElemType);
3224 const payload_ty = ty.optionalChild(buf);
3225 // DW.AT.structure_type
3226 try dbg_info_buffer.append(abbrev_struct_type);
3227 // DW.AT.byte_size, DW.FORM.sdata
3228 const abi_size = ty.abiSize(target);
3229 try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size);
3230 // DW.AT.name, DW.FORM.string
3231 try dbg_info_buffer.writer().print("{}\x00", .{ty});
3232 // DW.AT.member
3233 try dbg_info_buffer.ensureUnusedCapacity(7);
3234 dbg_info_buffer.appendAssumeCapacity(abbrev_struct_member);
3235 // DW.AT.name, DW.FORM.string
3236 dbg_info_buffer.appendSliceAssumeCapacity("maybe");
3237 dbg_info_buffer.appendAssumeCapacity(0);
3238 // DW.AT.type, DW.FORM.ref4
3239 var index = dbg_info_buffer.items.len;
3240 try dbg_info_buffer.resize(index + 4);
3241 try relocs.append(.{ .ty = Type.bool, .reloc = @intCast(u32, index) });
3242 // DW.AT.data_member_location, DW.FORM.sdata
3243 try dbg_info_buffer.ensureUnusedCapacity(6);
3244 dbg_info_buffer.appendAssumeCapacity(0);
3245 // DW.AT.member
3246 dbg_info_buffer.appendAssumeCapacity(abbrev_struct_member);
3247 // DW.AT.name, DW.FORM.string
3248 dbg_info_buffer.appendSliceAssumeCapacity("val");
3249 dbg_info_buffer.appendAssumeCapacity(0);
3250 // DW.AT.type, DW.FORM.ref4
3251 index = dbg_info_buffer.items.len;
3252 try dbg_info_buffer.resize(index + 4);
3253 try relocs.append(.{ .ty = payload_ty, .reloc = @intCast(u32, index) });
3254 // DW.AT.data_member_location, DW.FORM.sdata
3255 const offset = abi_size - payload_ty.abiSize(target);
3256 try leb128.writeULEB128(dbg_info_buffer.writer(), offset);
3257 // DW.AT.structure_type delimit children
3258 try dbg_info_buffer.append(0);
32313259 }
32323260 },
32333261 .Pointer => {
32343262 if (ty.isSlice()) {
3235 // Slices are anonymous structs: struct { .ptr = *, .len = N }
3236 try dbg_info_buffer.ensureUnusedCapacity(23);
3263 // Slices are structs: struct { .ptr = *, .len = N }
32373264 // DW.AT.structure_type
3238 dbg_info_buffer.appendAssumeCapacity(abbrev_anon_struct_type);
3265 try dbg_info_buffer.ensureUnusedCapacity(2);
3266 dbg_info_buffer.appendAssumeCapacity(abbrev_struct_type);
32393267 // DW.AT.byte_size, DW.FORM.sdata
3240 dbg_info_buffer.appendAssumeCapacity(16);
3268 dbg_info_buffer.appendAssumeCapacity(@sizeOf(usize) * 2);
3269 // DW.AT.name, DW.FORM.string
3270 try dbg_info_buffer.writer().print("{}\x00", .{ty});
32413271 // DW.AT.member
3272 try dbg_info_buffer.ensureUnusedCapacity(5);
32423273 dbg_info_buffer.appendAssumeCapacity(abbrev_struct_member);
32433274 // DW.AT.name, DW.FORM.string
32443275 dbg_info_buffer.appendSliceAssumeCapacity("ptr");
......@@ -3250,6 +3281,7 @@ fn addDbgInfoType(
32503281 const ptr_ty = ty.slicePtrFieldType(buf);
32513282 try relocs.append(.{ .ty = ptr_ty, .reloc = @intCast(u32, index) });
32523283 // DW.AT.data_member_location, DW.FORM.sdata
3284 try dbg_info_buffer.ensureUnusedCapacity(6);
32533285 dbg_info_buffer.appendAssumeCapacity(0);
32543286 // DW.AT.member
32553287 dbg_info_buffer.appendAssumeCapacity(abbrev_struct_member);
......@@ -3261,7 +3293,8 @@ fn addDbgInfoType(
32613293 try dbg_info_buffer.resize(index + 4);
32623294 try relocs.append(.{ .ty = Type.initTag(.usize), .reloc = @intCast(u32, index) });
32633295 // DW.AT.data_member_location, DW.FORM.sdata
3264 dbg_info_buffer.appendAssumeCapacity(8);
3296 try dbg_info_buffer.ensureUnusedCapacity(2);
3297 dbg_info_buffer.appendAssumeCapacity(@sizeOf(usize));
32653298 // DW.AT.structure_type delimit children
32663299 dbg_info_buffer.appendAssumeCapacity(0);
32673300 } else {
......@@ -3278,7 +3311,7 @@ fn addDbgInfoType(
32783311 // DW.AT.structure_type
32793312 try dbg_info_buffer.append(abbrev_struct_type);
32803313 // DW.AT.byte_size, DW.FORM.sdata
3281 const abi_size = ty.abiSize(self.base.options.target);
3314 const abi_size = ty.abiSize(target);
32823315 try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size);
32833316 // DW.AT.name, DW.FORM.string
32843317 const struct_name = try ty.nameAlloc(arena);
......@@ -3306,7 +3339,7 @@ fn addDbgInfoType(
33063339 try dbg_info_buffer.resize(index + 4);
33073340 try relocs.append(.{ .ty = field.ty, .reloc = @intCast(u32, index) });
33083341 // DW.AT.data_member_location, DW.FORM.sdata
3309 const field_off = ty.structFieldOffset(field_index, self.base.options.target);
3342 const field_off = ty.structFieldOffset(field_index, target);
33103343 try leb128.writeULEB128(dbg_info_buffer.writer(), field_off);
33113344 }
33123345