authorgravatar for jacoblevgw@gmail.comJacob G-W <jacoblevgw@gmail.com> 2022-01-02 15:52:25-05:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-01-06 13:17:00+01:00
logb47530b9fef28d32747b0f6978ad4b71e5fc5df9
tree0a38a393d58ec9bbce5bb0dfa1be1f399efeaf91
parent1d55e4cae10e95841a5fd457aed6c84595994fe1

plan9: fix .z symbol in debuginfo

This allows the `acid` debugger on plan9 to be used to debug a zig source file without patching `acid`! The patch adds a second `z` symbol. This z symbol has a value of 0, which means that it pops the history stack. We put a very large number for the value of the second symbol because it has to be at least as large as the linecount of the file. The debuginfo format is meant to be used with c files, where the stack would look something like this: ``` -> Line: 0x1 (1) Name: 0x1/0x2/0x3/0xe/0x13/0x1b (/sys/src/libc/port/malloc.c) -> Line: 0x2 (2) Name: 0x1/0x6/0x7/0x8 (/amd64/include/u.h) -> Line: 0x4f (79) Name: () -> Line: 0x50 (80) Name: 0x1/0x2/0x7/0x9 (/sys/include/libc.h) -> Line: 0x358 (856) Name: () -> Line: 0x359 (857) Name: 0x1/0x2/0x7/0x1c (/sys/include/pool.h) -> Line: 0x392 (914) Name: () -> Line: 0x393 (915) Name: 0x1/0x2/0x7/0x1d (/sys/include/tos.h) -> Line: 0x3ab (939) Name: () -> Line: 0x4eb (1259) Name: () ``` however in zig, we do not use includes and .h files, so we only need the first and last items in the stack: the source file that the symbols belong to, and the pop symbol with a null name and a value of the total linecount of the preprocessed source. Since there is no preprocessing in zig, we just make the linecount very large. There do not appear to be any downsides to this approach. If this causes a bug in the future, a simple fix would be to make the pop symbol just have the value of how many newlines are in the source file.

1 files changed, 10 insertions(+), 2 deletions(-)

src/link/Plan9.zig+10-2
...@@ -172,6 +172,7 @@ fn putFn(self: *Plan9, decl: *Module.Decl, out: FnDeclOutput) !void {...@@ -172,6 +172,7 @@ fn putFn(self: *Plan9, decl: *Module.Decl, out: FnDeclOutput) !void {
172 // each file gets a symbol172 // each file gets a symbol
173 fn_map_res.value_ptr.* = .{173 fn_map_res.value_ptr.* = .{
174 .sym_index = blk: {174 .sym_index = blk: {
175 try self.syms.append(gpa, undefined);
175 try self.syms.append(gpa, undefined);176 try self.syms.append(gpa, undefined);
176 break :blk @intCast(u32, self.syms.items.len - 1);177 break :blk @intCast(u32, self.syms.items.len - 1);
177 },178 },
...@@ -194,11 +195,17 @@ fn putFn(self: *Plan9, decl: *Module.Decl, out: FnDeclOutput) !void {...@@ -194,11 +195,17 @@ fn putFn(self: *Plan9, decl: *Module.Decl, out: FnDeclOutput) !void {
194 // null terminate195 // null terminate
195 try a.append(0);196 try a.append(0);
196 const final = a.toOwnedSlice();197 const final = a.toOwnedSlice();
197 self.syms.items[fn_map_res.value_ptr.sym_index] = .{198 self.syms.items[fn_map_res.value_ptr.sym_index - 1] = .{
198 .type = .z,199 .type = .z,
199 .value = 1,200 .value = 1,
200 .name = final,201 .name = final,
201 };202 };
203 self.syms.items[fn_map_res.value_ptr.sym_index] = .{
204 .type = .z,
205 // just put a giant number, no source file will have this many newlines
206 .value = std.math.maxInt(u32),
207 .name = &.{ 0, 0 },
208 };
202 }209 }
203}210}
204211
...@@ -705,7 +712,8 @@ pub fn writeSyms(self: *Plan9, buf: *std.ArrayList(u8)) !void {...@@ -705,7 +712,8 @@ pub fn writeSyms(self: *Plan9, buf: *std.ArrayList(u8)) !void {
705 var it_file = self.fn_decl_table.iterator();712 var it_file = self.fn_decl_table.iterator();
706 while (it_file.next()) |fentry| {713 while (it_file.next()) |fentry| {
707 var symidx_and_submap = fentry.value_ptr;714 var symidx_and_submap = fentry.value_ptr;
708 // write the z symbol715 // write the z symbols
716 try self.writeSym(writer, self.syms.items[symidx_and_submap.sym_index - 1]);
709 try self.writeSym(writer, self.syms.items[symidx_and_submap.sym_index]);717 try self.writeSym(writer, self.syms.items[symidx_and_submap.sym_index]);
710718
711 // write all the decls come from the file of the z symbol719 // write all the decls come from the file of the z symbol