| ... | ... | @@ -851,6 +851,10 @@ pub fn commitDeclState( |
| 851 | 851 | const file_pos = debug_line_sect.offset + src_fn.off; |
| 852 | 852 | try pwriteDbgLineNops(d_sym.file, file_pos, 0, &[0]u8{}, src_fn.len); |
| 853 | 853 | }, |
| 854 | .wasm => { |
| 855 | const wasm_file = file.cast(File.Wasm).?; |
| 856 | writeDbgLineNopsBuffered(wasm_file.debug_line.items, src_fn.off, 0, &.{}, src_fn.len); |
| 857 | }, |
| 854 | 858 | else => unreachable, |
| 855 | 859 | } |
| 856 | 860 | // TODO Look at the free list before appending at the end. |
| ... | ... | @@ -972,9 +976,16 @@ pub fn commitDeclState( |
| 972 | 976 | mem.set(u8, debug_line.items[segment.size..], 0); |
| 973 | 977 | } |
| 974 | 978 | segment.size = needed_size; |
| 979 | debug_line.items.len = needed_size; |
| 975 | 980 | } |
| 976 | 981 | const offset = segment.offset + src_fn.off; |
| 977 | | mem.copy(u8, debug_line.items[offset..], dbg_line_buffer.items); |
| 982 | writeDbgLineNopsBuffered( |
| 983 | debug_line.items, |
| 984 | offset, |
| 985 | prev_padding_size, |
| 986 | dbg_line_buffer.items, |
| 987 | next_padding_size, |
| 988 | ); |
| 978 | 989 | }, |
| 979 | 990 | else => unreachable, |
| 980 | 991 | } |
| ... | ... | @@ -1114,7 +1125,8 @@ fn updateDeclDebugInfoAllocation(self: *Dwarf, file: *File, atom: *Atom, len: u3 |
| 1114 | 1125 | try pwriteDbgInfoNops(d_sym.file, file_pos, 0, &[0]u8{}, atom.len, false); |
| 1115 | 1126 | }, |
| 1116 | 1127 | .wasm => { |
| 1117 | | log.debug(" todo: updateDeclDebugInfoAllocation for Wasm: {d}", .{atom.len}); |
| 1128 | const wasm_file = file.cast(File.Wasm).?; |
| 1129 | writeDbgInfoNopsBuffered(wasm_file.debug_info.items, atom.off, 0, &.{0}, atom.len, false); |
| 1118 | 1130 | }, |
| 1119 | 1131 | else => unreachable, |
| 1120 | 1132 | } |
| ... | ... | @@ -1253,9 +1265,17 @@ fn writeDeclDebugInfo(self: *Dwarf, file: *File, atom: *Atom, dbg_info_buf: []co |
| 1253 | 1265 | mem.set(u8, debug_info.items[segment.size..], 0); |
| 1254 | 1266 | } |
| 1255 | 1267 | segment.size = needed_size; |
| 1268 | debug_info.items.len = needed_size; |
| 1256 | 1269 | } |
| 1257 | 1270 | const offset = segment.offset + atom.off; |
| 1258 | | mem.copy(u8, debug_info.items[offset..], dbg_info_buf); |
| 1271 | writeDbgInfoNopsBuffered( |
| 1272 | debug_info.items, |
| 1273 | offset, |
| 1274 | prev_padding_size, |
| 1275 | dbg_info_buf, |
| 1276 | next_padding_size, |
| 1277 | trailing_zero, |
| 1278 | ); |
| 1259 | 1279 | }, |
| 1260 | 1280 | else => unreachable, |
| 1261 | 1281 | } |
| ... | ... | @@ -1643,7 +1663,7 @@ pub fn writeDbgInfoHeader(self: *Dwarf, file: *File, module: *Module, low_pc: u6 |
| 1643 | 1663 | }, |
| 1644 | 1664 | .wasm => { |
| 1645 | 1665 | const wasm_file = file.cast(File.Wasm).?; |
| 1646 | | mem.copy(u8, wasm_file.debug_info.items, di_buf.items); |
| 1666 | writeDbgInfoNopsBuffered(wasm_file.debug_info.items, 0, 0, di_buf.items, jmp_amt, false); |
| 1647 | 1667 | }, |
| 1648 | 1668 | else => unreachable, |
| 1649 | 1669 | } |
| ... | ... | @@ -1738,6 +1758,45 @@ fn pwriteDbgLineNops( |
| 1738 | 1758 | try file.pwritevAll(vecs[0..vec_index], offset - prev_padding_size); |
| 1739 | 1759 | } |
| 1740 | 1760 | |
| 1761 | fn writeDbgLineNopsBuffered( |
| 1762 | buf: []u8, |
| 1763 | offset: u32, |
| 1764 | prev_padding_size: usize, |
| 1765 | content: []const u8, |
| 1766 | next_padding_size: usize, |
| 1767 | ) void { |
| 1768 | assert(buf.len >= content.len + prev_padding_size + next_padding_size); |
| 1769 | const tracy = trace(@src()); |
| 1770 | defer tracy.end(); |
| 1771 | |
| 1772 | const three_byte_nop = [3]u8{ DW.LNS.advance_pc, 0b1000_0000, 0 }; |
| 1773 | { |
| 1774 | var padding_left = prev_padding_size; |
| 1775 | if (padding_left % 2 != 0) { |
| 1776 | buf[offset - padding_left ..][0..3].* = three_byte_nop; |
| 1777 | padding_left -= 3; |
| 1778 | } |
| 1779 | |
| 1780 | while (padding_left > 0) : (padding_left -= 1) { |
| 1781 | buf[offset - padding_left] = DW.LNS.negate_stmt; |
| 1782 | } |
| 1783 | } |
| 1784 | |
| 1785 | mem.copy(u8, buf[offset..], content); |
| 1786 | |
| 1787 | { |
| 1788 | var padding_left = next_padding_size; |
| 1789 | if (padding_left % 2 != 0) { |
| 1790 | buf[offset + content.len + padding_left ..][0..3].* = three_byte_nop; |
| 1791 | padding_left -= 3; |
| 1792 | } |
| 1793 | |
| 1794 | while (padding_left > 0) : (padding_left -= 1) { |
| 1795 | buf[offset + content.len + padding_left] = DW.LNS.negate_stmt; |
| 1796 | } |
| 1797 | } |
| 1798 | } |
| 1799 | |
| 1741 | 1800 | /// Writes to the file a buffer, prefixed and suffixed by the specified number of |
| 1742 | 1801 | /// bytes of padding. |
| 1743 | 1802 | fn pwriteDbgInfoNops( |
| ... | ... | @@ -1810,6 +1869,38 @@ fn pwriteDbgInfoNops( |
| 1810 | 1869 | try file.pwritevAll(vecs[0..vec_index], offset - prev_padding_size); |
| 1811 | 1870 | } |
| 1812 | 1871 | |
| 1872 | fn writeDbgInfoNopsBuffered( |
| 1873 | buf: []u8, |
| 1874 | offset: u32, |
| 1875 | prev_padding_size: usize, |
| 1876 | content: []const u8, |
| 1877 | next_padding_size: usize, |
| 1878 | trailing_zero: bool, |
| 1879 | ) void { |
| 1880 | assert(buf.len >= content.len + prev_padding_size + next_padding_size + @boolToInt(trailing_zero)); |
| 1881 | const tracy = trace(@src()); |
| 1882 | defer tracy.end(); |
| 1883 | |
| 1884 | { |
| 1885 | var padding_left = prev_padding_size; |
| 1886 | while (padding_left > 0) : (padding_left -= 1) { |
| 1887 | buf[offset - padding_left] = @enumToInt(AbbrevKind.pad1); |
| 1888 | } |
| 1889 | } |
| 1890 | |
| 1891 | mem.copy(u8, buf[offset..], content); |
| 1892 | { |
| 1893 | var padding_left = next_padding_size; |
| 1894 | while (padding_left > 0) : (padding_left -= 1) { |
| 1895 | buf[offset + content.len + padding_left] = @enumToInt(AbbrevKind.pad1); |
| 1896 | } |
| 1897 | } |
| 1898 | |
| 1899 | if (trailing_zero) { |
| 1900 | buf[offset + content.len + next_padding_size] = 0; |
| 1901 | } |
| 1902 | } |
| 1903 | |
| 1813 | 1904 | pub fn writeDbgAranges(self: *Dwarf, file: *File, addr: u64, size: u64) !void { |
| 1814 | 1905 | const target_endian = self.target.cpu.arch.endian(); |
| 1815 | 1906 | const init_len_size: usize = if (self.tag == .macho) |
| ... | ... | @@ -1909,6 +2000,11 @@ pub fn writeDbgAranges(self: *Dwarf, file: *File, addr: u64, size: u64) !void { |
| 1909 | 2000 | const file_pos = debug_aranges_sect.offset; |
| 1910 | 2001 | try d_sym.file.pwriteAll(di_buf.items, file_pos); |
| 1911 | 2002 | }, |
| 2003 | .wasm => { |
| 2004 | const wasm_file = file.cast(File.Wasm).?; |
| 2005 | try wasm_file.debug_aranges.resize(wasm_file.base.allocator, needed_size); |
| 2006 | mem.copy(u8, wasm_file.debug_aranges.items, di_buf.items); |
| 2007 | }, |
| 1912 | 2008 | else => unreachable, |
| 1913 | 2009 | } |
| 1914 | 2010 | } |
| ... | ... | @@ -2030,7 +2126,7 @@ pub fn writeDbgLineHeader(self: *Dwarf, file: *File, module: *Module) !void { |
| 2030 | 2126 | }, |
| 2031 | 2127 | .wasm => { |
| 2032 | 2128 | const wasm_file = file.cast(File.Wasm).?; |
| 2033 | | mem.copy(u8, wasm_file.debug_line.items, di_buf.items); |
| 2129 | writeDbgLineNopsBuffered(wasm_file.debug_line.items, 0, 0, di_buf.items, jmp_amt); |
| 2034 | 2130 | }, |
| 2035 | 2131 | else => unreachable, |
| 2036 | 2132 | } |