diff options
| author | Luuk de Gram <luuk@degram.dev> | 2022-09-06 20:21:33 +0200 |
|---|---|---|
| committer | Luuk de Gram <luuk@degram.dev> | 2022-09-07 18:59:36 +0200 |
| commit | a8d137d05ae36870d4e896cf5e37b591d9fa219c (patch) | |
| tree | 720dde8e8f150bb6bb2e63e5506ca337e50eee3d /src/link/Dwarf.zig | |
| parent | 971327d6e0a2cdcfd1a7695d1dea86dbbebd730e (diff) | |
| download | zig-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.zig | 73 |
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, |
