aboutsummaryrefslogtreecommitdiff
path: root/src/link/Dwarf.zig
diff options
context:
space:
mode:
authorLuuk de Gram <luuk@degram.dev>2022-05-04 21:25:33 +0200
committerLuuk de Gram <luuk@degram.dev>2022-05-09 18:51:46 +0200
commit2ae2ac33d9ddd1fb181e08a811d97b1bf238bced (patch)
treea9b3d1f461ef443259d947f3840cb4e3da5e19b6 /src/link/Dwarf.zig
parent9b6b7034c20a0089b88e58b5142c91b2d26bcef8 (diff)
downloadzig-2ae2ac33d9ddd1fb181e08a811d97b1bf238bced.tar.gz
zig-2ae2ac33d9ddd1fb181e08a811d97b1bf238bced.zip
wasm: Emit debug sections
This commit adds the ability to emit the following debug sections: .debug_info .debug_abbrev .debug_line .debug_str Line information and files are now being loaded correctly by browser debuggers.
Diffstat (limited to 'src/link/Dwarf.zig')
-rw-r--r--src/link/Dwarf.zig56
1 files changed, 45 insertions, 11 deletions
diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig
index bf054c524c..a7d2744491 100644
--- a/src/link/Dwarf.zig
+++ b/src/link/Dwarf.zig
@@ -963,21 +963,18 @@ pub fn commitDeclState(
const wasm_file = file.cast(File.Wasm).?;
const segment_index = try wasm_file.getDebugLineIndex();
const segment = &wasm_file.segments.items[segment_index];
- const debug_atom = wasm_file.atoms.get(segment_index).?;
+ const debug_line = &wasm_file.debug_line;
if (needed_size != segment.size) {
log.debug(" needed size does not equal allocated size: {d}", .{needed_size});
if (needed_size > segment.size) {
- log.debug(" allocating {d} bytes for debug line information", .{needed_size - segment.size});
- try debug_atom.code.resize(self.allocator, needed_size);
- std.mem.set(u8, debug_atom.code.items[segment.size..], 0);
+ log.debug(" allocating {d} bytes for 'debug line' information", .{needed_size - segment.size});
+ try debug_line.resize(self.allocator, needed_size);
+ mem.set(u8, debug_line.items[segment.size..], 0);
}
- debug_atom.size = needed_size;
segment.size = needed_size;
}
- // since we can tighly pack the debug lines, wasm does not require
- // us to pad with Nops.
const offset = segment.offset + src_fn.off;
- std.mem.copy(u8, debug_atom.code.items[offset..], dbg_line_buffer.items);
+ mem.copy(u8, debug_line.items[offset..], dbg_line_buffer.items);
},
else => unreachable,
}
@@ -1116,7 +1113,9 @@ fn updateDeclDebugInfoAllocation(self: *Dwarf, file: *File, atom: *Atom, len: u3
const file_pos = debug_info_sect.offset + atom.off;
try pwriteDbgInfoNops(d_sym.file, file_pos, 0, &[0]u8{}, atom.len, false);
},
- .wasm => {},
+ .wasm => {
+ log.debug(" todo: updateDeclDebugInfoAllocation for Wasm: {d}", .{atom.len});
+ },
else => unreachable,
}
// TODO Look at the free list before appending at the end.
@@ -1241,6 +1240,23 @@ fn writeDeclDebugInfo(self: *Dwarf, file: *File, atom: *Atom, dbg_info_buf: []co
trailing_zero,
);
},
+ .wasm => {
+ const wasm_file = file.cast(File.Wasm).?;
+ const segment_index = try wasm_file.getDebugInfoIndex();
+ const segment = &wasm_file.segments.items[segment_index];
+ const debug_info = &wasm_file.debug_info;
+ if (needed_size != segment.size) {
+ log.debug(" needed size does not equal allocated size: {d}", .{needed_size});
+ if (needed_size > segment.size) {
+ log.debug(" allocating {d} bytes for 'debug info' information", .{needed_size - segment.size});
+ try debug_info.resize(self.allocator, needed_size);
+ mem.set(u8, debug_info.items[segment.size..], 0);
+ }
+ segment.size = needed_size;
+ }
+ const offset = segment.offset + atom.off;
+ mem.copy(u8, debug_info.items[offset..], dbg_info_buf);
+ },
else => unreachable,
}
}
@@ -1279,8 +1295,7 @@ pub fn updateDeclLineNumber(self: *Dwarf, file: *File, decl: *const Module.Decl)
const segment_index = wasm_file.getDebugLineIndex() catch unreachable;
const segment = wasm_file.segments.items[segment_index];
const offset = segment.offset + decl.fn_link.wasm.src_fn.off + self.getRelocDbgLineOff();
- const debug_atom = wasm_file.atoms.get(segment_index).?;
- std.mem.copy(u8, debug_atom.code.items[offset..], &data);
+ mem.copy(u8, wasm_file.debug_line.items[offset..], &data);
},
else => unreachable,
}
@@ -1514,6 +1529,11 @@ pub fn writeDbgAbbrev(self: *Dwarf, file: *File) !void {
const file_pos = debug_abbrev_sect.offset + abbrev_offset;
try d_sym.file.pwriteAll(&abbrev_buf, file_pos);
},
+ .wasm => {
+ const wasm_file = file.cast(File.Wasm).?;
+ try wasm_file.debug_abbrev.resize(wasm_file.base.allocator, needed_size);
+ mem.copy(u8, wasm_file.debug_abbrev.items, &abbrev_buf);
+ },
else => unreachable,
}
}
@@ -1621,6 +1641,10 @@ pub fn writeDbgInfoHeader(self: *Dwarf, file: *File, module: *Module, low_pc: u6
const file_pos = debug_info_sect.offset;
try pwriteDbgInfoNops(d_sym.file, file_pos, 0, di_buf.items, jmp_amt, false);
},
+ .wasm => {
+ const wasm_file = file.cast(File.Wasm).?;
+ mem.copy(u8, wasm_file.debug_info.items, di_buf.items);
+ },
else => unreachable,
}
}
@@ -2004,6 +2028,10 @@ pub fn writeDbgLineHeader(self: *Dwarf, file: *File, module: *Module) !void {
const file_pos = debug_line_sect.offset;
try pwriteDbgLineNops(d_sym.file, file_pos, 0, di_buf.items, jmp_amt);
},
+ .wasm => {
+ const wasm_file = file.cast(File.Wasm).?;
+ mem.copy(u8, wasm_file.debug_line.items, di_buf.items);
+ },
else => unreachable,
}
}
@@ -2127,6 +2155,8 @@ pub fn flushModule(self: *Dwarf, file: *File, module: *Module) !void {
const debug_info_sect = &dwarf_segment.sections.items[d_sym.debug_info_section_index.?];
break :blk debug_info_sect.offset;
},
+ // for wasm, the offset is always 0 as we write to memory first
+ .wasm => break :blk @as(u32, 0),
else => unreachable,
}
};
@@ -2145,6 +2175,10 @@ pub fn flushModule(self: *Dwarf, file: *File, module: *Module) !void {
const d_sym = &macho_file.d_sym.?;
try d_sym.file.pwriteAll(&buf, file_pos + reloc.atom.off + reloc.offset);
},
+ .wasm => {
+ const wasm_file = file.cast(File.Wasm).?;
+ mem.copy(u8, wasm_file.debug_info.items[reloc.atom.off + reloc.offset ..], &buf);
+ },
else => unreachable,
}
}