| author | |
| committer | |
| log | d189614647d6c4195081e40f08f92e15db153592 |
| tree | e42c10ca749a165cea2d9fea8b668041003bfabb |
| parent | 60b3c4ae3ce1359779745392d4fb169fdff158d4 |
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 { | ... | @@ -1460,25 +1460,9 @@ pub fn updateDecl(self: *MachO, module: *Module, decl: *Module.Decl) !void { |
| 1460 | } | 1460 | } |
| 1461 | 1461 | ||
| 1462 | pub fn updateDeclLineNumber(self: *MachO, module: *Module, decl: *const Module.Decl) !void { | 1462 | pub fn updateDeclLineNumber(self: *MachO, module: *Module, decl: *const Module.Decl) !void { |
| 1463 | const tracy = trace(@src()); | 1463 | if (self.d_sym) |*ds| { |
| 1464 | defer tracy.end(); | 1464 | try ds.updateDeclLineNumber(module, decl); |
| 1465 | 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); | ||
| 1482 | } | 1466 | } |
| 1483 | 1467 | ||
| 1484 | pub fn updateDeclExports( | 1468 | pub fn updateDeclExports( |
src/link/MachO/DebugSymbols.zig+22| ... | @@ -1239,3 +1239,25 @@ pub fn pwriteDbgInfoNops( | ... | @@ -1239,3 +1239,25 @@ pub fn pwriteDbgInfoNops( |
| 1239 | 1239 | ||
| 1240 | try self.file.pwritevAll(vecs[0..vec_index], offset - prev_padding_size); | 1240 | try self.file.pwritevAll(vecs[0..vec_index], offset - prev_padding_size); |
| 1241 | } | 1241 | } |
| 1242 | |||
| 1243 | pub 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 | } |