aboutsummaryrefslogtreecommitdiff
path: root/src/link/Dwarf.zig
diff options
context:
space:
mode:
authorLuuk de Gram <luuk@degram.dev>2022-09-06 20:21:33 +0200
committerLuuk de Gram <luuk@degram.dev>2022-09-07 18:59:36 +0200
commita8d137d05ae36870d4e896cf5e37b591d9fa219c (patch)
tree720dde8e8f150bb6bb2e63e5506ca337e50eee3d /src/link/Dwarf.zig
parent971327d6e0a2cdcfd1a7695d1dea86dbbebd730e (diff)
downloadzig-a8d137d05ae36870d4e896cf5e37b591d9fa219c.tar.gz
zig-a8d137d05ae36870d4e896cf5e37b591d9fa219c.zip
wasm-linker: support incremental debug info
Although the wasm-linker previously already supported debug information in incremental-mode, this was no longer working as-is with the addition of supporting object-file-parsed debug information. This commit implements the Zig-created debug information structure from scratch which is a lot more robust and also allows being linked with debug information from other object files.
Diffstat (limited to 'src/link/Dwarf.zig')
-rw-r--r--src/link/Dwarf.zig73
1 files changed, 27 insertions, 46 deletions
diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig
index 671425ab71..474c822ae6 100644
--- a/src/link/Dwarf.zig
+++ b/src/link/Dwarf.zig
@@ -861,9 +861,7 @@ pub fn commitDeclState(
},
.wasm => {
const wasm_file = file.cast(File.Wasm).?;
- const segment_index = wasm_file.debug_line_index.?;
- const atom = wasm_file.atoms.get(segment_index).?;
- const debug_line = atom.getFirstZigAtom().code;
+ const debug_line = wasm_file.debug_line_atom.?.code;
writeDbgLineNopsBuffered(debug_line.items, src_fn.off, 0, &.{}, src_fn.len);
},
else => unreachable,
@@ -975,24 +973,21 @@ pub fn commitDeclState(
},
.wasm => {
const wasm_file = file.cast(File.Wasm).?;
- const segment_index = wasm_file.debug_line_index.?;
- const segment = &wasm_file.segments.items[segment_index];
- const atom = wasm_file.atoms.get(segment_index).?;
- const debug_line = &atom.getFirstZigAtom().code;
- if (needed_size != segment.size) {
+ const atom = wasm_file.debug_line_atom.?;
+ const debug_line = &atom.code;
+ const segment_size = debug_line.items.len;
+ 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});
+ if (needed_size > segment_size) {
+ 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);
+ mem.set(u8, debug_line.items[segment_size..], 0);
}
- segment.size = needed_size;
debug_line.items.len = needed_size;
}
- const offset = segment.offset + src_fn.off;
writeDbgLineNopsBuffered(
debug_line.items,
- offset,
+ src_fn.off,
prev_padding_size,
dbg_line_buffer.items,
next_padding_size,
@@ -1150,12 +1145,8 @@ fn updateDeclDebugInfoAllocation(self: *Dwarf, file: *File, atom: *Atom, len: u3
},
.wasm => {
const wasm_file = file.cast(File.Wasm).?;
- const segment_index = wasm_file.debug_info_index.?;
- const segment = &wasm_file.segments.items[segment_index];
- const info_atom = wasm_file.atoms.get(segment_index).?;
- const debug_info = &info_atom.getFirstZigAtom().code;
- const offset = segment.offset + atom.off;
- try writeDbgInfoNopsToArrayList(gpa, debug_info, offset, 0, &.{0}, atom.len, false);
+ const debug_info = &wasm_file.debug_info_atom.?.code;
+ try writeDbgInfoNopsToArrayList(gpa, debug_info, atom.off, 0, &.{0}, atom.len, false);
},
else => unreachable,
}
@@ -1282,28 +1273,25 @@ fn writeDeclDebugInfo(self: *Dwarf, file: *File, atom: *Atom, dbg_info_buf: []co
},
.wasm => {
const wasm_file = file.cast(File.Wasm).?;
- const segment_index = wasm_file.debug_info_index.?;
- const segment = &wasm_file.segments.items[segment_index];
- const info_atom = wasm_file.atoms.get(segment_index).?;
- const debug_info = &info_atom.getFirstZigAtom().code;
- if (needed_size != segment.size) {
+ const info_atom = wasm_file.debug_info_atom.?;
+ const debug_info = &info_atom.code;
+ const segment_size = debug_info.items.len;
+ 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});
+ 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);
+ mem.set(u8, debug_info.items[segment_size..], 0);
}
- segment.size = needed_size;
debug_info.items.len = needed_size;
}
- const offset = segment.offset + atom.off;
log.debug(" writeDbgInfoNopsToArrayList debug_info_len={d} offset={d} content_len={d} next_padding_size={d}", .{
- debug_info.items.len, offset, dbg_info_buf.len, next_padding_size,
+ debug_info.items.len, atom.off, dbg_info_buf.len, next_padding_size,
});
try writeDbgInfoNopsToArrayList(
gpa,
debug_info,
- offset,
+ atom.off,
prev_padding_size,
dbg_info_buf,
next_padding_size,
@@ -1344,10 +1332,8 @@ pub fn updateDeclLineNumber(self: *Dwarf, file: *File, decl: *const Module.Decl)
},
.wasm => {
const wasm_file = file.cast(File.Wasm).?;
- const segment_index = wasm_file.debug_line_index.?;
- const segment = wasm_file.segments.items[segment_index];
- const offset = segment.offset + decl.fn_link.wasm.src_fn.off + self.getRelocDbgLineOff();
- const atom = wasm_file.atoms.get(segment_index).?.getFirstZigAtom();
+ const offset = decl.fn_link.wasm.src_fn.off + self.getRelocDbgLineOff();
+ const atom = wasm_file.debug_line_atom.?;
mem.copy(u8, atom.code.items[offset..], &data);
},
else => unreachable,
@@ -1584,8 +1570,7 @@ pub fn writeDbgAbbrev(self: *Dwarf, file: *File) !void {
},
.wasm => {
const wasm_file = file.cast(File.Wasm).?;
- const segment_index = wasm_file.debug_abbrev_index.?;
- const debug_abbrev = &wasm_file.atoms.get(segment_index).?.getFirstZigAtom().code;
+ const debug_abbrev = &wasm_file.debug_abbrev_atom.?.code;
try debug_abbrev.resize(wasm_file.base.allocator, needed_size);
mem.copy(u8, debug_abbrev.items, &abbrev_buf);
},
@@ -1697,8 +1682,7 @@ pub fn writeDbgInfoHeader(self: *Dwarf, file: *File, module: *Module, low_pc: u6
},
.wasm => {
const wasm_file = file.cast(File.Wasm).?;
- const segment_index = wasm_file.debug_info_index.?;
- const debug_info = &wasm_file.atoms.get(segment_index).?.getFirstZigAtom().code;
+ const debug_info = &wasm_file.debug_info_atom.?.code;
try writeDbgInfoNopsToArrayList(self.allocator, debug_info, 0, 0, di_buf.items, jmp_amt, false);
},
else => unreachable,
@@ -2028,8 +2012,7 @@ pub fn writeDbgAranges(self: *Dwarf, file: *File, addr: u64, size: u64) !void {
},
.wasm => {
const wasm_file = file.cast(File.Wasm).?;
- const segment_index = wasm_file.debug_ranges_index.?;
- const debug_ranges = &wasm_file.atoms.get(segment_index).?.getFirstZigAtom().code;
+ const debug_ranges = &wasm_file.debug_ranges_atom.?.code;
try debug_ranges.resize(wasm_file.base.allocator, needed_size);
mem.copy(u8, debug_ranges.items, di_buf.items);
},
@@ -2153,8 +2136,7 @@ pub fn writeDbgLineHeader(self: *Dwarf, file: *File, module: *Module) !void {
},
.wasm => {
const wasm_file = file.cast(File.Wasm).?;
- const segment_index = wasm_file.debug_line_index.?;
- const debug_line = wasm_file.atoms.get(segment_index).?.getFirstZigAtom().code;
+ const debug_line = wasm_file.debug_line_atom.?.code;
writeDbgLineNopsBuffered(debug_line.items, 0, 0, di_buf.items, jmp_amt);
},
else => unreachable,
@@ -2303,8 +2285,7 @@ pub fn flushModule(self: *Dwarf, file: *File, module: *Module) !void {
},
.wasm => {
const wasm_file = file.cast(File.Wasm).?;
- const segment_index = wasm_file.debug_info_index.?;
- const debug_info = wasm_file.atoms.get(segment_index).?.getFirstZigAtom().code;
+ const debug_info = wasm_file.debug_info_atom.?.code;
mem.copy(u8, debug_info.items[reloc.atom.off + reloc.offset ..], &buf);
},
else => unreachable,