| ... | ... | @@ -1,4 +1,4 @@ |
| 1 | | gpa: std.mem.Allocator, |
| 1 | gpa: Allocator, |
| 2 | 2 | bin_file: *link.File, |
| 3 | 3 | format: DW.Format, |
| 4 | 4 | endian: std.builtin.Endian, |
| ... | ... | @@ -21,6 +21,7 @@ debug_rnglists: DebugRngLists, |
| 21 | 21 | debug_str: StringSection, |
| 22 | 22 | |
| 23 | 23 | pub const UpdateError = error{ |
| 24 | WriteFailed, |
| 24 | 25 | ReinterpretDeclRef, |
| 25 | 26 | Unimplemented, |
| 26 | 27 | EndOfStream, |
| ... | ... | @@ -50,7 +51,7 @@ const ModInfo = struct { |
| 50 | 51 | dirs: std.AutoArrayHashMapUnmanaged(Unit.Index, void), |
| 51 | 52 | files: std.AutoArrayHashMapUnmanaged(Zcu.File.Index, void), |
| 52 | 53 | |
| 53 | | fn deinit(mod_info: *ModInfo, gpa: std.mem.Allocator) void { |
| 54 | fn deinit(mod_info: *ModInfo, gpa: Allocator) void { |
| 54 | 55 | mod_info.dirs.deinit(gpa); |
| 55 | 56 | mod_info.files.deinit(gpa); |
| 56 | 57 | mod_info.* = undefined; |
| ... | ... | @@ -220,7 +221,7 @@ const StringSection = struct { |
| 220 | 221 | .section = Section.init, |
| 221 | 222 | }; |
| 222 | 223 | |
| 223 | | fn deinit(str_sec: *StringSection, gpa: std.mem.Allocator) void { |
| 224 | fn deinit(str_sec: *StringSection, gpa: Allocator) void { |
| 224 | 225 | str_sec.contents.deinit(gpa); |
| 225 | 226 | str_sec.map.deinit(gpa); |
| 226 | 227 | str_sec.section.deinit(gpa); |
| ... | ... | @@ -297,7 +298,7 @@ pub const Section = struct { |
| 297 | 298 | .len = 0, |
| 298 | 299 | }; |
| 299 | 300 | |
| 300 | | fn deinit(sec: *Section, gpa: std.mem.Allocator) void { |
| 301 | fn deinit(sec: *Section, gpa: Allocator) void { |
| 301 | 302 | for (sec.units.items) |*unit| unit.deinit(gpa); |
| 302 | 303 | sec.units.deinit(gpa); |
| 303 | 304 | sec.* = undefined; |
| ... | ... | @@ -357,7 +358,7 @@ pub const Section = struct { |
| 357 | 358 | if (sec.last == unit.toOptional()) sec.last = unit_ptr.prev; |
| 358 | 359 | } |
| 359 | 360 | |
| 360 | | fn popUnit(sec: *Section, gpa: std.mem.Allocator) void { |
| 361 | fn popUnit(sec: *Section, gpa: Allocator) void { |
| 361 | 362 | const unit_index: Unit.Index = @enumFromInt(sec.units.items.len - 1); |
| 362 | 363 | sec.unlinkUnit(unit_index); |
| 363 | 364 | var unit = sec.units.pop().?; |
| ... | ... | @@ -518,7 +519,7 @@ const Unit = struct { |
| 518 | 519 | unit.cross_section_relocs.clearRetainingCapacity(); |
| 519 | 520 | } |
| 520 | 521 | |
| 521 | | fn deinit(unit: *Unit, gpa: std.mem.Allocator) void { |
| 522 | fn deinit(unit: *Unit, gpa: Allocator) void { |
| 522 | 523 | for (unit.entries.items) |*entry| entry.deinit(gpa); |
| 523 | 524 | unit.entries.deinit(gpa); |
| 524 | 525 | unit.cross_unit_relocs.deinit(gpa); |
| ... | ... | @@ -526,7 +527,7 @@ const Unit = struct { |
| 526 | 527 | unit.* = undefined; |
| 527 | 528 | } |
| 528 | 529 | |
| 529 | | fn addEntry(unit: *Unit, gpa: std.mem.Allocator) std.mem.Allocator.Error!Entry.Index { |
| 530 | fn addEntry(unit: *Unit, gpa: Allocator) Allocator.Error!Entry.Index { |
| 530 | 531 | if (unit.free.unwrap()) |entry| { |
| 531 | 532 | const entry_ptr = unit.getEntry(entry); |
| 532 | 533 | unit.free = entry_ptr.next; |
| ... | ... | @@ -780,7 +781,7 @@ const Entry = struct { |
| 780 | 781 | entry.external_relocs.clearRetainingCapacity(); |
| 781 | 782 | } |
| 782 | 783 | |
| 783 | | fn deinit(entry: *Entry, gpa: std.mem.Allocator) void { |
| 784 | fn deinit(entry: *Entry, gpa: Allocator) void { |
| 784 | 785 | entry.cross_entry_relocs.deinit(gpa); |
| 785 | 786 | entry.cross_unit_relocs.deinit(gpa); |
| 786 | 787 | entry.cross_section_relocs.deinit(gpa); |
| ... | ... | @@ -1133,7 +1134,7 @@ pub const Loc = union(enum) { |
| 1133 | 1134 | }; |
| 1134 | 1135 | } |
| 1135 | 1136 | |
| 1136 | | fn writeReg(reg: u32, op0: u8, opx: u8, writer: anytype) @TypeOf(writer).Error!void { |
| 1137 | fn writeReg(reg: u32, op0: u8, opx: u8, writer: anytype) !void { |
| 1137 | 1138 | if (std.math.cast(u5, reg)) |small_reg| { |
| 1138 | 1139 | try writer.writeByte(op0 + small_reg); |
| 1139 | 1140 | } else { |
| ... | ... | @@ -1142,7 +1143,7 @@ pub const Loc = union(enum) { |
| 1142 | 1143 | } |
| 1143 | 1144 | } |
| 1144 | 1145 | |
| 1145 | | fn write(loc: Loc, adapter: anytype) UpdateError!void { |
| 1146 | fn write(loc: Loc, adapter: anytype) !void { |
| 1146 | 1147 | const writer = adapter.writer(); |
| 1147 | 1148 | switch (loc) { |
| 1148 | 1149 | .empty => {}, |
| ... | ... | @@ -1712,15 +1713,15 @@ pub const WipNav = struct { |
| 1712 | 1713 | wip_nav.func = func; |
| 1713 | 1714 | } |
| 1714 | 1715 | |
| 1715 | | fn externalReloc(wip_nav: *WipNav, sec: *Section, reloc: ExternalReloc) std.mem.Allocator.Error!void { |
| 1716 | fn externalReloc(wip_nav: *WipNav, sec: *Section, reloc: ExternalReloc) Allocator.Error!void { |
| 1716 | 1717 | try sec.getUnit(wip_nav.unit).getEntry(wip_nav.entry).external_relocs.append(wip_nav.dwarf.gpa, reloc); |
| 1717 | 1718 | } |
| 1718 | 1719 | |
| 1719 | | pub fn infoExternalReloc(wip_nav: *WipNav, reloc: ExternalReloc) std.mem.Allocator.Error!void { |
| 1720 | pub fn infoExternalReloc(wip_nav: *WipNav, reloc: ExternalReloc) Allocator.Error!void { |
| 1720 | 1721 | try wip_nav.externalReloc(&wip_nav.dwarf.debug_info.section, reloc); |
| 1721 | 1722 | } |
| 1722 | 1723 | |
| 1723 | | fn frameExternalReloc(wip_nav: *WipNav, reloc: ExternalReloc) std.mem.Allocator.Error!void { |
| 1724 | fn frameExternalReloc(wip_nav: *WipNav, reloc: ExternalReloc) Allocator.Error!void { |
| 1724 | 1725 | try wip_nav.externalReloc(&wip_nav.dwarf.debug_frame.section, reloc); |
| 1725 | 1726 | } |
| 1726 | 1727 | |
| ... | ... | @@ -1768,33 +1769,33 @@ pub const WipNav = struct { |
| 1768 | 1769 | } |
| 1769 | 1770 | |
| 1770 | 1771 | const ExprLocCounter = struct { |
| 1771 | | const Stream = std.io.CountingWriter(std.io.NullWriter); |
| 1772 | | stream: Stream, |
| 1772 | stream: Writer.Discarding, |
| 1773 | 1773 | section_offset_bytes: u32, |
| 1774 | 1774 | address_size: AddressSize, |
| 1775 | | fn init(dwarf: *Dwarf) ExprLocCounter { |
| 1775 | fn init(dwarf: *Dwarf, trash_buffer: []u8) ExprLocCounter { |
| 1776 | 1776 | return .{ |
| 1777 | | .stream = std.io.countingWriter(std.io.null_writer), |
| 1777 | .stream = .init(trash_buffer), |
| 1778 | 1778 | .section_offset_bytes = dwarf.sectionOffsetBytes(), |
| 1779 | 1779 | .address_size = dwarf.address_size, |
| 1780 | 1780 | }; |
| 1781 | 1781 | } |
| 1782 | | fn writer(counter: *ExprLocCounter) Stream.Writer { |
| 1783 | | return counter.stream.writer(); |
| 1782 | fn writer(counter: *ExprLocCounter) *Writer { |
| 1783 | return &counter.stream.writer; |
| 1784 | 1784 | } |
| 1785 | 1785 | fn endian(_: ExprLocCounter) std.builtin.Endian { |
| 1786 | 1786 | return @import("builtin").cpu.arch.endian(); |
| 1787 | 1787 | } |
| 1788 | 1788 | fn addrSym(counter: *ExprLocCounter, _: u32) error{}!void { |
| 1789 | | counter.stream.bytes_written += @intFromEnum(counter.address_size); |
| 1789 | counter.stream.count += @intFromEnum(counter.address_size); |
| 1790 | 1790 | } |
| 1791 | 1791 | fn infoEntry(counter: *ExprLocCounter, _: Unit.Index, _: Entry.Index) error{}!void { |
| 1792 | | counter.stream.bytes_written += counter.section_offset_bytes; |
| 1792 | counter.stream.count += counter.section_offset_bytes; |
| 1793 | 1793 | } |
| 1794 | 1794 | }; |
| 1795 | 1795 | |
| 1796 | 1796 | fn infoExprLoc(wip_nav: *WipNav, loc: Loc) UpdateError!void { |
| 1797 | | var counter: ExprLocCounter = .init(wip_nav.dwarf); |
| 1797 | var trash_buffer: [64]u8 = undefined; |
| 1798 | var counter: ExprLocCounter = .init(wip_nav.dwarf, &trash_buffer); |
| 1798 | 1799 | try loc.write(&counter); |
| 1799 | 1800 | |
| 1800 | 1801 | const adapter: struct { |
| ... | ... | @@ -1812,7 +1813,7 @@ pub const WipNav = struct { |
| 1812 | 1813 | try ctx.wip_nav.infoSectionOffset(.debug_info, unit, entry, 0); |
| 1813 | 1814 | } |
| 1814 | 1815 | } = .{ .wip_nav = wip_nav }; |
| 1815 | | try uleb128(adapter.writer(), counter.stream.bytes_written); |
| 1816 | try uleb128(adapter.writer(), counter.stream.fullCount()); |
| 1816 | 1817 | try loc.write(adapter); |
| 1817 | 1818 | } |
| 1818 | 1819 | |
| ... | ... | @@ -1826,7 +1827,8 @@ pub const WipNav = struct { |
| 1826 | 1827 | } |
| 1827 | 1828 | |
| 1828 | 1829 | fn frameExprLoc(wip_nav: *WipNav, loc: Loc) UpdateError!void { |
| 1829 | | var counter: ExprLocCounter = .init(wip_nav.dwarf); |
| 1830 | var trash_buffer: [64]u8 = undefined; |
| 1831 | var counter: ExprLocCounter = .init(wip_nav.dwarf, &trash_buffer); |
| 1830 | 1832 | try loc.write(&counter); |
| 1831 | 1833 | |
| 1832 | 1834 | const adapter: struct { |
| ... | ... | @@ -1844,7 +1846,7 @@ pub const WipNav = struct { |
| 1844 | 1846 | try ctx.wip_nav.sectionOffset(.debug_frame, .debug_info, unit, entry, 0); |
| 1845 | 1847 | } |
| 1846 | 1848 | } = .{ .wip_nav = wip_nav }; |
| 1847 | | try uleb128(adapter.writer(), counter.stream.bytes_written); |
| 1849 | try uleb128(adapter.writer(), counter.stream.fullCount()); |
| 1848 | 1850 | try loc.write(adapter); |
| 1849 | 1851 | } |
| 1850 | 1852 | |
| ... | ... | @@ -1922,7 +1924,7 @@ pub const WipNav = struct { |
| 1922 | 1924 | try wip_nav.infoSectionOffset(.debug_info, unit, entry, 0); |
| 1923 | 1925 | } |
| 1924 | 1926 | |
| 1925 | | fn refForward(wip_nav: *WipNav) std.mem.Allocator.Error!u32 { |
| 1927 | fn refForward(wip_nav: *WipNav) Allocator.Error!u32 { |
| 1926 | 1928 | const dwarf = wip_nav.dwarf; |
| 1927 | 1929 | const cross_entry_relocs = &dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(wip_nav.entry).cross_entry_relocs; |
| 1928 | 1930 | const reloc_index: u32 = @intCast(cross_entry_relocs.items.len); |
| ... | ... | @@ -6022,14 +6024,14 @@ fn sectionOffsetBytes(dwarf: *Dwarf) u32 { |
| 6022 | 6024 | |
| 6023 | 6025 | fn uleb128Bytes(value: anytype) u32 { |
| 6024 | 6026 | var trash_buffer: [64]u8 = undefined; |
| 6025 | | var d: std.Io.Writer.Discarding = .init(&trash_buffer); |
| 6027 | var d: Writer.Discarding = .init(&trash_buffer); |
| 6026 | 6028 | d.writer.writeUleb128(value) catch unreachable; |
| 6027 | 6029 | return @intCast(d.count + d.writer.end); |
| 6028 | 6030 | } |
| 6029 | 6031 | |
| 6030 | 6032 | fn sleb128Bytes(value: anytype) u32 { |
| 6031 | 6033 | var trash_buffer: [64]u8 = undefined; |
| 6032 | | var d: std.Io.Writer.Discarding = .init(&trash_buffer); |
| 6034 | var d: Writer.Discarding = .init(&trash_buffer); |
| 6033 | 6035 | d.writer.writeSleb128(value) catch unreachable; |
| 6034 | 6036 | return @intCast(d.count + d.writer.end); |
| 6035 | 6037 | } |
| ... | ... | @@ -6057,3 +6059,5 @@ const sleb128 = std.leb.writeIleb128; |
| 6057 | 6059 | const std = @import("std"); |
| 6058 | 6060 | const target_info = @import("../target.zig"); |
| 6059 | 6061 | const uleb128 = std.leb.writeUleb128; |
| 6062 | const Allocator = std.mem.Allocator; |
| 6063 | const Writer = std.Io.Writer; |