authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-01 14:06:24+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-01 14:06:24+01:00
log5ee99f862a1b3a4d1f5ca304623e7394603136a6
treed7de8e23ad0104b44e693e8126da66ad7032cda9
parentfc3142aa9a54f014c07aac6ac2aab75f57c5a75f

dwarf: extract common logic for generating func arg dbg info


3 files changed, 77 insertions(+), 51 deletions(-)

src/arch/aarch64/CodeGen.zig+14-23
...@@ -186,22 +186,21 @@ const DbgInfoReloc = struct {...@@ -186,22 +186,21 @@ const DbgInfoReloc = struct {
186 }186 }
187187
188 fn genArgDbgInfo(reloc: DbgInfoReloc, function: Self) error{OutOfMemory}!void {188 fn genArgDbgInfo(reloc: DbgInfoReloc, function: Self) error{OutOfMemory}!void {
189 const name_with_null = reloc.name.ptr[0 .. reloc.name.len + 1];189 const mod = function.bin_file.options.module.?;
190 const fn_owner_decl = mod.declPtr(function.mod_fn.owner_decl);
191 const atom = switch (function.bin_file.tag) {
192 .elf => &fn_owner_decl.link.elf.dbg_info_atom,
193 .macho => &fn_owner_decl.link.macho.dbg_info_atom,
194 else => unreachable,
195 };
190196
191 switch (function.debug_output) {197 switch (function.debug_output) {
192 .dwarf => |dw| {198 .dwarf => |dw| {
193 const dbg_info = &dw.dbg_info;
194 switch (reloc.mcv) {199 switch (reloc.mcv) {
195 .register => |reg| {200 .register => |reg| {
196 try dbg_info.ensureUnusedCapacity(3);201 try dw.genArgDbgInfo(reloc.name, reloc.ty, atom, .{
197 dbg_info.appendAssumeCapacity(@enumToInt(link.File.Dwarf.AbbrevKind.parameter));202 .register = reg.dwarfLocOp(),
198 dbg_info.appendSliceAssumeCapacity(&[2]u8{ // DW.AT.location, DW.FORM.exprloc
199 1, // ULEB128 dwarf expression length
200 reg.dwarfLocOp(),
201 });203 });
202 try dbg_info.ensureUnusedCapacity(5 + name_with_null.len);
203 try function.addDbgInfoTypeReloc(reloc.ty); // DW.AT.type, DW.FORM.ref4
204 dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string
205 },204 },
206205
207 .stack_offset,206 .stack_offset,
...@@ -212,20 +211,12 @@ const DbgInfoReloc = struct {...@@ -212,20 +211,12 @@ const DbgInfoReloc = struct {
212 .stack_argument_offset => @intCast(i32, function.saved_regs_stack_space + offset),211 .stack_argument_offset => @intCast(i32, function.saved_regs_stack_space + offset),
213 else => unreachable,212 else => unreachable,
214 };213 };
215214 try dw.genArgDbgInfo(reloc.name, reloc.ty, atom, .{
216 try dbg_info.ensureUnusedCapacity(8);215 .stack = .{
217 dbg_info.appendAssumeCapacity(@enumToInt(link.File.Dwarf.AbbrevKind.parameter));216 .fp_register = Register.x29.dwarfLocOpDeref(),
218 const fixup = dbg_info.items.len;217 .offset = adjusted_offset,
219 dbg_info.appendSliceAssumeCapacity(&[2]u8{ // DW.AT.location, DW.FORM.exprloc218 },
220 1, // we will backpatch it after we encode the displacement in LEB128
221 Register.x29.dwarfLocOpDeref(), // frame pointer
222 });219 });
223 leb128.writeILEB128(dbg_info.writer(), adjusted_offset) catch unreachable;
224 dbg_info.items[fixup] += @intCast(u8, dbg_info.items.len - fixup - 2);
225 try dbg_info.ensureUnusedCapacity(5 + name_with_null.len);
226 try function.addDbgInfoTypeReloc(reloc.ty); // DW.AT.type, DW.FORM.ref4
227 dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string
228
229 },220 },
230221
231 else => unreachable, // not a possible argument222 else => unreachable, // not a possible argument
src/arch/x86_64/CodeGen.zig+17-28
...@@ -3818,38 +3818,27 @@ fn airArg(self: *Self, inst: Air.Inst.Index) !void {...@@ -3818,38 +3818,27 @@ fn airArg(self: *Self, inst: Air.Inst.Index) !void {
3818}3818}
38193819
3820fn genArgDbgInfo(self: Self, ty: Type, name: [:0]const u8, mcv: MCValue) !void {3820fn genArgDbgInfo(self: Self, ty: Type, name: [:0]const u8, mcv: MCValue) !void {
3821 const name_with_null = name.ptr[0 .. name.len + 1];3821 const mod = self.bin_file.options.module.?;
3822 const fn_owner_decl = mod.declPtr(self.mod_fn.owner_decl);
3823 const atom = switch (self.bin_file.tag) {
3824 .elf => &fn_owner_decl.link.elf.dbg_info_atom,
3825 .macho => &fn_owner_decl.link.macho.dbg_info_atom,
3826 else => unreachable,
3827 };
3828
3822 switch (self.debug_output) {3829 switch (self.debug_output) {
3823 .dwarf => |dw| {3830 .dwarf => |dw| {
3824 const dbg_info = &dw.dbg_info;
3825 switch (mcv) {3831 switch (mcv) {
3826 .register => |reg| {3832 .register => |reg| try dw.genArgDbgInfo(name, ty, atom, .{
3827 try dbg_info.ensureUnusedCapacity(3);3833 .register = reg.dwarfLocOp(),
3828 dbg_info.appendAssumeCapacity(@enumToInt(link.File.Dwarf.AbbrevKind.parameter));3834 }),
3829 dbg_info.appendSliceAssumeCapacity(&[2]u8{ // DW.AT.location, DW.FORM.exprloc
3830 1, // ULEB128 dwarf expression length
3831 reg.dwarfLocOp(),
3832 });
3833 try dbg_info.ensureUnusedCapacity(5 + name_with_null.len);
3834 try self.addDbgInfoTypeReloc(ty); // DW.AT.type, DW.FORM.ref4
3835 dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string
3836 },
3837
3838 .stack_offset => |off| {
3839 try dbg_info.ensureUnusedCapacity(8);
3840 dbg_info.appendAssumeCapacity(@enumToInt(link.File.Dwarf.AbbrevKind.parameter));
3841 const fixup = dbg_info.items.len;
3842 dbg_info.appendSliceAssumeCapacity(&[2]u8{ // DW.AT.location, DW.FORM.exprloc
3843 1, // we will backpatch it after we encode the displacement in LEB128
3844 Register.rbp.dwarfLocOpDeref(), // TODO handle -fomit-frame-pointer
3845 });
3846 leb128.writeILEB128(dbg_info.writer(), -off) catch unreachable;
3847 dbg_info.items[fixup] += @intCast(u8, dbg_info.items.len - fixup - 2);
3848 try dbg_info.ensureUnusedCapacity(5 + name_with_null.len);
3849 try self.addDbgInfoTypeReloc(ty); // DW.AT.type, DW.FORM.ref4
3850 dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string
38513835
3852 },3836 .stack_offset => |off| try dw.genArgDbgInfo(name, ty, atom, .{
3837 .stack = .{
3838 .fp_register = Register.rbp.dwarfLocOpDeref(), // TODO handle -fomit-frame-pointer
3839 .offset = -off,
3840 },
3841 }),
38533842
3854 else => unreachable, // not a valid function parameter3843 else => unreachable, // not a valid function parameter
3855 }3844 }
src/link/Dwarf.zig+46
...@@ -560,6 +560,52 @@ pub const DeclState = struct {...@@ -560,6 +560,52 @@ pub const DeclState = struct {
560 },560 },
561 }561 }
562 }562 }
563
564 pub fn genArgDbgInfo(
565 self: *DeclState,
566 name: [:0]const u8,
567 ty: Type,
568 atom: *Atom,
569 loc: union(enum) {
570 register: u8,
571 stack: struct { fp_register: u8, offset: i32 },
572 },
573 ) error{OutOfMemory}!void {
574 const dbg_info = &self.dbg_info;
575 const name_with_null = name.ptr[0 .. name.len + 1];
576
577 switch (loc) {
578 .register => |reg| {
579 try dbg_info.ensureUnusedCapacity(3);
580 dbg_info.appendAssumeCapacity(@enumToInt(AbbrevKind.parameter));
581 dbg_info.appendSliceAssumeCapacity(&[2]u8{ // DW.AT.location, DW.FORM.exprloc
582 1, // ULEB128 dwarf expression length
583 reg,
584 });
585 try dbg_info.ensureUnusedCapacity(5 + name_with_null.len);
586 const index = dbg_info.items.len;
587 try self.addTypeRelocGlobal(atom, ty, @intCast(u32, index)); // DW.AT.type, DW.FORM.ref4
588 dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string
589
590 },
591 .stack => |info| {
592 try dbg_info.ensureUnusedCapacity(8);
593 dbg_info.appendAssumeCapacity(@enumToInt(AbbrevKind.parameter));
594 const fixup = dbg_info.items.len;
595 dbg_info.appendSliceAssumeCapacity(&[2]u8{ // DW.AT.location, DW.FORM.exprloc
596 1, // we will backpatch it after we encode the displacement in LEB128
597 info.fp_register, // frame pointer
598 });
599 leb128.writeILEB128(dbg_info.writer(), info.offset) catch unreachable;
600 dbg_info.items[fixup] += @intCast(u8, dbg_info.items.len - fixup - 2);
601 try dbg_info.ensureUnusedCapacity(5 + name_with_null.len);
602 const index = dbg_info.items.len;
603 try self.addTypeRelocGlobal(atom, ty, @intCast(u32, index));
604 dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string
605
606 },
607 }
608 }
563};609};
564610
565pub const AbbrevEntry = struct {611pub const AbbrevEntry = struct {