authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2020-12-30 21:49:06+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2020-12-31 10:19:04+01:00
logd189614647d6c4195081e40f08f92e15db153592
treee42c10ca749a165cea2d9fea8b668041003bfabb
parent60b3c4ae3ce1359779745392d4fb169fdff158d4

macho: move updateDeclLineNumber logic to DebugSymbols


2 files changed, 25 insertions(+), 19 deletions(-)

src/link/MachO.zig+3-19
......@@ -1460,25 +1460,9 @@ pub fn updateDecl(self: *MachO, module: *Module, decl: *Module.Decl) !void {
14601460}
14611461
14621462pub fn updateDeclLineNumber(self: *MachO, module: *Module, decl: *const Module.Decl) !void {
1463 const tracy = trace(@src());
1464 defer tracy.end();
1465
1466 const container_scope = decl.scope.cast(Module.Scope.Container).?;
1467 const tree = container_scope.file_scope.contents.tree;
1468 const file_ast_decls = tree.root_node.decls();
1469 // TODO Look into improving the performance here by adding a token-index-to-line
1470 // lookup table. Currently this involves scanning over the source code for newlines.
1471 const fn_proto = file_ast_decls[decl.src_index].castTag(.FnProto).?;
1472 const block = fn_proto.getBodyNode().?.castTag(.Block).?;
1473 const line_delta = std.zig.lineDelta(tree.source, 0, tree.token_locs[block.lbrace].start);
1474 const casted_line_off = @intCast(u28, line_delta);
1475
1476 const dwarf_segment = &self.d_sym.?.load_commands.items[self.d_sym.?.dwarf_segment_cmd_index.?].Segment;
1477 const shdr = &dwarf_segment.sections.items[self.d_sym.?.debug_line_section_index.?];
1478 const file_pos = shdr.offset + decl.fn_link.macho.off + DebugSymbols.getRelocDbgLineOff();
1479 var data: [4]u8 = undefined;
1480 leb.writeUnsignedFixed(4, &data, casted_line_off);
1481 try self.d_sym.?.file.pwriteAll(&data, file_pos);
1463 if (self.d_sym) |*ds| {
1464 try ds.updateDeclLineNumber(module, decl);
1465 }
14821466}
14831467
14841468pub fn updateDeclExports(
src/link/MachO/DebugSymbols.zig+22
......@@ -1239,3 +1239,25 @@ pub fn pwriteDbgInfoNops(
12391239
12401240 try self.file.pwritevAll(vecs[0..vec_index], offset - prev_padding_size);
12411241}
1242
1243pub fn updateDeclLineNumber(self: *DebugSymbols, module: *Module, decl: *const Module.Decl) !void {
1244 const tracy = trace(@src());
1245 defer tracy.end();
1246
1247 const container_scope = decl.scope.cast(Module.Scope.Container).?;
1248 const tree = container_scope.file_scope.contents.tree;
1249 const file_ast_decls = tree.root_node.decls();
1250 // TODO Look into improving the performance here by adding a token-index-to-line
1251 // lookup table. Currently this involves scanning over the source code for newlines.
1252 const fn_proto = file_ast_decls[decl.src_index].castTag(.FnProto).?;
1253 const block = fn_proto.getBodyNode().?.castTag(.Block).?;
1254 const line_delta = std.zig.lineDelta(tree.source, 0, tree.token_locs[block.lbrace].start);
1255 const casted_line_off = @intCast(u28, line_delta);
1256
1257 const dwarf_segment = &self.load_commands.items[self.dwarf_segment_cmd_index.?].Segment;
1258 const shdr = &dwarf_segment.sections.items[self.debug_line_section_index.?];
1259 const file_pos = shdr.offset + decl.fn_link.macho.off + getRelocDbgLineOff();
1260 var data: [4]u8 = undefined;
1261 leb.writeUnsignedFixed(4, &data, casted_line_off);
1262 try self.file.pwriteAll(&data, file_pos);
1263}