authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-07 22:06:31-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-07 22:26:42-07:00
log281f657377c46180e0c7044e6ac0c7b8b69ef892
tree49c9e9f8c69b800c998b1d7b99fc71f7463d2903
parentc5a5983150c41843f30e136471e77fd3623a7510

Revert "random patches from another branch"

This reverts commit 76ed05523d6327789a8365571b67a214ac527ef9. they don't work

1 files changed, 636 insertions(+), 715 deletions(-)

src/link/Dwarf.zig+636-715
...@@ -1,4 +1,4 @@...@@ -1,4 +1,4 @@
1gpa: Allocator,1gpa: std.mem.Allocator,
2bin_file: *link.File,2bin_file: *link.File,
3format: DW.Format,3format: DW.Format,
4endian: std.builtin.Endian,4endian: std.builtin.Endian,
...@@ -50,7 +50,7 @@ const ModInfo = struct {...@@ -50,7 +50,7 @@ const ModInfo = struct {
50 dirs: std.AutoArrayHashMapUnmanaged(Unit.Index, void),50 dirs: std.AutoArrayHashMapUnmanaged(Unit.Index, void),
51 files: std.AutoArrayHashMapUnmanaged(Zcu.File.Index, void),51 files: std.AutoArrayHashMapUnmanaged(Zcu.File.Index, void),
5252
53 fn deinit(mod_info: *ModInfo, gpa: Allocator) void {53 fn deinit(mod_info: *ModInfo, gpa: std.mem.Allocator) void {
54 mod_info.dirs.deinit(gpa);54 mod_info.dirs.deinit(gpa);
55 mod_info.files.deinit(gpa);55 mod_info.files.deinit(gpa);
56 mod_info.* = undefined;56 mod_info.* = undefined;
...@@ -220,13 +220,13 @@ const StringSection = struct {...@@ -220,13 +220,13 @@ const StringSection = struct {
220 .section = Section.init,220 .section = Section.init,
221 };221 };
222222
223 fn deinit(str_sec: *StringSection, gpa: Allocator) void {223 fn deinit(str_sec: *StringSection, gpa: std.mem.Allocator) void {
224 str_sec.contents.deinit(gpa);224 str_sec.contents.deinit(gpa);
225 str_sec.map.deinit(gpa);225 str_sec.map.deinit(gpa);
226 str_sec.section.deinit(gpa);226 str_sec.section.deinit(gpa);
227 }227 }
228228
229 fn addString(str_sec: *StringSection, dwarf: *Dwarf, str: []const u8) !Entry.Index {229 fn addString(str_sec: *StringSection, dwarf: *Dwarf, str: []const u8) UpdateError!Entry.Index {
230 const gop = try str_sec.map.getOrPutAdapted(dwarf.gpa, str, Adapter{ .str_sec = str_sec });230 const gop = try str_sec.map.getOrPutAdapted(dwarf.gpa, str, Adapter{ .str_sec = str_sec });
231 const entry: Entry.Index = @enumFromInt(gop.index);231 const entry: Entry.Index = @enumFromInt(gop.index);
232 if (!gop.found_existing) {232 if (!gop.found_existing) {
...@@ -297,7 +297,7 @@ pub const Section = struct {...@@ -297,7 +297,7 @@ pub const Section = struct {
297 .len = 0,297 .len = 0,
298 };298 };
299299
300 fn deinit(sec: *Section, gpa: Allocator) void {300 fn deinit(sec: *Section, gpa: std.mem.Allocator) void {
301 for (sec.units.items) |*unit| unit.deinit(gpa);301 for (sec.units.items) |*unit| unit.deinit(gpa);
302 sec.units.deinit(gpa);302 sec.units.deinit(gpa);
303 sec.* = undefined;303 sec.* = undefined;
...@@ -357,7 +357,7 @@ pub const Section = struct {...@@ -357,7 +357,7 @@ pub const Section = struct {
357 if (sec.last == unit.toOptional()) sec.last = unit_ptr.prev;357 if (sec.last == unit.toOptional()) sec.last = unit_ptr.prev;
358 }358 }
359359
360 fn popUnit(sec: *Section, gpa: Allocator) void {360 fn popUnit(sec: *Section, gpa: std.mem.Allocator) void {
361 const unit_index: Unit.Index = @enumFromInt(sec.units.items.len - 1);361 const unit_index: Unit.Index = @enumFromInt(sec.units.items.len - 1);
362 sec.unlinkUnit(unit_index);362 sec.unlinkUnit(unit_index);
363 var unit = sec.units.pop().?;363 var unit = sec.units.pop().?;
...@@ -518,7 +518,7 @@ const Unit = struct {...@@ -518,7 +518,7 @@ const Unit = struct {
518 unit.cross_section_relocs.clearRetainingCapacity();518 unit.cross_section_relocs.clearRetainingCapacity();
519 }519 }
520520
521 fn deinit(unit: *Unit, gpa: Allocator) void {521 fn deinit(unit: *Unit, gpa: std.mem.Allocator) void {
522 for (unit.entries.items) |*entry| entry.deinit(gpa);522 for (unit.entries.items) |*entry| entry.deinit(gpa);
523 unit.entries.deinit(gpa);523 unit.entries.deinit(gpa);
524 unit.cross_unit_relocs.deinit(gpa);524 unit.cross_unit_relocs.deinit(gpa);
...@@ -526,7 +526,7 @@ const Unit = struct {...@@ -526,7 +526,7 @@ const Unit = struct {
526 unit.* = undefined;526 unit.* = undefined;
527 }527 }
528528
529 fn addEntry(unit: *Unit, gpa: Allocator) Allocator.Error!Entry.Index {529 fn addEntry(unit: *Unit, gpa: std.mem.Allocator) std.mem.Allocator.Error!Entry.Index {
530 if (unit.free.unwrap()) |entry| {530 if (unit.free.unwrap()) |entry| {
531 const entry_ptr = unit.getEntry(entry);531 const entry_ptr = unit.getEntry(entry);
532 unit.free = entry_ptr.next;532 unit.free = entry_ptr.next;
...@@ -648,33 +648,35 @@ const Unit = struct {...@@ -648,33 +648,35 @@ const Unit = struct {
648 assert(len >= unit.trailer_len);648 assert(len >= unit.trailer_len);
649 if (sec == &dwarf.debug_line.section) {649 if (sec == &dwarf.debug_line.section) {
650 var buf: [1 + uleb128Bytes(std.math.maxInt(u32)) + 1]u8 = undefined;650 var buf: [1 + uleb128Bytes(std.math.maxInt(u32)) + 1]u8 = undefined;
651 var bw: Writer = .fixed(&buf);651 var fbs = std.io.fixedBufferStream(&buf);
652 bw.writeByte(DW.LNS.extended_op) catch unreachable;652 const writer = fbs.writer();
653 const extended_op_bytes = bw.end;653 writer.writeByte(DW.LNS.extended_op) catch unreachable;
654 const extended_op_bytes = fbs.pos;
654 var op_len_bytes: u5 = 1;655 var op_len_bytes: u5 = 1;
655 while (true) switch (std.math.order(len - extended_op_bytes - op_len_bytes, @as(u32, 1) << 7 * op_len_bytes)) {656 while (true) switch (std.math.order(len - extended_op_bytes - op_len_bytes, @as(u32, 1) << 7 * op_len_bytes)) {
656 .lt => break bw.writeLeb128(len - extended_op_bytes - op_len_bytes) catch unreachable,657 .lt => break uleb128(writer, len - extended_op_bytes - op_len_bytes) catch unreachable,
657 .eq => {658 .eq => {
658 // no length will ever work, so undercount and futz with the leb encoding to make up the missing byte659 // no length will ever work, so undercount and futz with the leb encoding to make up the missing byte
659 op_len_bytes += 1;660 op_len_bytes += 1;
660 std.leb.writeUnsignedExtended((bw.writableSlice(op_len_bytes) catch unreachable), len - extended_op_bytes - op_len_bytes);661 std.leb.writeUnsignedExtended(buf[fbs.pos..][0..op_len_bytes], len - extended_op_bytes - op_len_bytes);
662 fbs.pos += op_len_bytes;
661 break;663 break;
662 },664 },
663 .gt => op_len_bytes += 1,665 .gt => op_len_bytes += 1,
664 };666 };
665 assert(bw.end == extended_op_bytes + op_len_bytes);667 assert(fbs.pos == extended_op_bytes + op_len_bytes);
666 bw.writeByte(DW.LNE.padding) catch unreachable;668 writer.writeByte(DW.LNE.padding) catch unreachable;
667 assert(bw.end >= unit.trailer_len and bw.end <= len);669 assert(fbs.pos >= unit.trailer_len and fbs.pos <= len);
668 return dwarf.getFile().?.pwriteAll(bw.getWritten(), sec.off(dwarf) + start);670 return dwarf.getFile().?.pwriteAll(fbs.getWritten(), sec.off(dwarf) + start);
669 }671 }
670 var trailer_bw: Writer = .fixed(try dwarf.gpa.alloc(u8, len));672 var trailer = try std.ArrayList(u8).initCapacity(dwarf.gpa, len);
671 defer dwarf.gpa.free(trailer_bw.buffer);673 defer trailer.deinit();
672 const fill_byte: u8 = if (sec == &dwarf.debug_abbrev.section) fill: {674 const fill_byte: u8 = if (sec == &dwarf.debug_abbrev.section) fill: {
673 assert(uleb128Bytes(@intFromEnum(AbbrevCode.null)) == 1);675 assert(uleb128Bytes(@intFromEnum(AbbrevCode.null)) == 1);
674 trailer_bw.writeByte(@intFromEnum(AbbrevCode.null)) catch unreachable;676 trailer.appendAssumeCapacity(@intFromEnum(AbbrevCode.null));
675 break :fill @intFromEnum(AbbrevCode.null);677 break :fill @intFromEnum(AbbrevCode.null);
676 } else if (sec == &dwarf.debug_aranges.section) fill: {678 } else if (sec == &dwarf.debug_aranges.section) fill: {
677 trailer_bw.splatByteAll(0, @intFromEnum(dwarf.address_size) * 2) catch unreachable;679 trailer.appendNTimesAssumeCapacity(0, @intFromEnum(dwarf.address_size) * 2);
678 break :fill 0;680 break :fill 0;
679 } else if (sec == &dwarf.debug_frame.section) fill: {681 } else if (sec == &dwarf.debug_frame.section) fill: {
680 switch (dwarf.debug_frame.header.format) {682 switch (dwarf.debug_frame.header.format) {
...@@ -682,49 +684,49 @@ const Unit = struct {...@@ -682,49 +684,49 @@ const Unit = struct {
682 .debug_frame, .eh_frame => |format| {684 .debug_frame, .eh_frame => |format| {
683 const unit_len = len - dwarf.unitLengthBytes();685 const unit_len = len - dwarf.unitLengthBytes();
684 switch (dwarf.format) {686 switch (dwarf.format) {
685 .@"32" => trailer_bw.writeInt(u32, @intCast(unit_len), dwarf.endian) catch unreachable,687 .@"32" => std.mem.writeInt(u32, trailer.addManyAsArrayAssumeCapacity(4), @intCast(unit_len), dwarf.endian),
686 .@"64" => {688 .@"64" => {
687 trailer_bw.writeInt(u32, std.math.maxInt(u32), dwarf.endian) catch unreachable;689 std.mem.writeInt(u32, trailer.addManyAsArrayAssumeCapacity(4), std.math.maxInt(u32), dwarf.endian);
688 trailer_bw.writeInt(u64, unit_len, dwarf.endian) catch unreachable;690 std.mem.writeInt(u64, trailer.addManyAsArrayAssumeCapacity(8), unit_len, dwarf.endian);
689 },691 },
690 }692 }
691 switch (format) {693 switch (format) {
692 .none => unreachable,694 .none => unreachable,
693 .debug_frame => {695 .debug_frame => {
694 switch (dwarf.format) {696 switch (dwarf.format) {
695 .@"32" => trailer_bw.writeInt(u32, std.math.maxInt(u32), dwarf.endian) catch unreachable,697 .@"32" => std.mem.writeInt(u32, trailer.addManyAsArrayAssumeCapacity(4), std.math.maxInt(u32), dwarf.endian),
696 .@"64" => trailer_bw.writeInt(u64, std.math.maxInt(u64), dwarf.endian) catch unreachable,698 .@"64" => std.mem.writeInt(u64, trailer.addManyAsArrayAssumeCapacity(8), std.math.maxInt(u64), dwarf.endian),
697 }699 }
698 trailer_bw.writeByte(4) catch unreachable;700 trailer.appendAssumeCapacity(4);
699 trailer_bw.writeAll("\x00") catch unreachable;701 trailer.appendSliceAssumeCapacity("\x00");
700 trailer_bw.writeByte(@intFromEnum(dwarf.address_size)) catch unreachable;702 trailer.appendAssumeCapacity(@intFromEnum(dwarf.address_size));
701 trailer_bw.writeByte(0) catch unreachable;703 trailer.appendAssumeCapacity(0);
702 },704 },
703 .eh_frame => {705 .eh_frame => {
704 trailer_bw.writeInt(u32, 0, dwarf.endian) catch unreachable;706 std.mem.writeInt(u32, trailer.addManyAsArrayAssumeCapacity(4), 0, dwarf.endian);
705 trailer_bw.writeByte(1) catch unreachable;707 trailer.appendAssumeCapacity(1);
706 trailer_bw.writeAll("\x00") catch unreachable;708 trailer.appendSliceAssumeCapacity("\x00");
707 },709 },
708 }710 }
709 trailer_bw.writeUleb128(1) catch unreachable;711 uleb128(trailer.fixedWriter(), 1) catch unreachable;
710 trailer_bw.writeSleb128(1) catch unreachable;712 sleb128(trailer.fixedWriter(), 1) catch unreachable;
711 trailer_bw.writeUleb128(0) catch unreachable;713 uleb128(trailer.fixedWriter(), 0) catch unreachable;
712 },714 },
713 }715 }
714 trailer_bw.splatByteAll(DW.CFA.nop, unit.trailer_len - trailer_bw.end) catch unreachable;716 trailer.appendNTimesAssumeCapacity(DW.CFA.nop, unit.trailer_len - trailer.items.len);
715 break :fill DW.CFA.nop;717 break :fill DW.CFA.nop;
716 } else if (sec == &dwarf.debug_info.section) fill: {718 } else if (sec == &dwarf.debug_info.section) fill: {
717 assert(uleb128Bytes(@intFromEnum(AbbrevCode.null)) == 1);719 assert(uleb128Bytes(@intFromEnum(AbbrevCode.null)) == 1);
718 trailer_bw.splatByteAll(@intFromEnum(AbbrevCode.null), 2) catch unreachable;720 trailer.appendNTimesAssumeCapacity(@intFromEnum(AbbrevCode.null), 2);
719 break :fill @intFromEnum(AbbrevCode.null);721 break :fill @intFromEnum(AbbrevCode.null);
720 } else if (sec == &dwarf.debug_rnglists.section) fill: {722 } else if (sec == &dwarf.debug_rnglists.section) fill: {
721 trailer_bw.writeByte(DW.RLE.end_of_list) catch unreachable;723 trailer.appendAssumeCapacity(DW.RLE.end_of_list);
722 break :fill DW.RLE.end_of_list;724 break :fill DW.RLE.end_of_list;
723 } else unreachable;725 } else unreachable;
724 assert(trailer_bw.end == unit.trailer_len);726 assert(trailer.items.len == unit.trailer_len);
725 trailer_bw.splatByteAll(fill_byte, len - unit.trailer_len) catch unreachable;727 trailer.appendNTimesAssumeCapacity(fill_byte, len - unit.trailer_len);
726 assert(trailer_bw.end == len);728 assert(trailer.items.len == len);
727 try dwarf.getFile().?.pwriteAll(trailer_bw.buffer, sec.off(dwarf) + start);729 try dwarf.getFile().?.pwriteAll(trailer.items, sec.off(dwarf) + start);
728 }730 }
729731
730 fn resolveRelocs(unit: *Unit, sec: *Section, dwarf: *Dwarf) RelocError!void {732 fn resolveRelocs(unit: *Unit, sec: *Section, dwarf: *Dwarf) RelocError!void {
...@@ -778,7 +780,7 @@ const Entry = struct {...@@ -778,7 +780,7 @@ const Entry = struct {
778 entry.external_relocs.clearRetainingCapacity();780 entry.external_relocs.clearRetainingCapacity();
779 }781 }
780782
781 fn deinit(entry: *Entry, gpa: Allocator) void {783 fn deinit(entry: *Entry, gpa: std.mem.Allocator) void {
782 entry.cross_entry_relocs.deinit(gpa);784 entry.cross_entry_relocs.deinit(gpa);
783 entry.cross_unit_relocs.deinit(gpa);785 entry.cross_unit_relocs.deinit(gpa);
784 entry.cross_section_relocs.deinit(gpa);786 entry.cross_section_relocs.deinit(gpa);
...@@ -831,52 +833,52 @@ const Entry = struct {...@@ -831,52 +833,52 @@ const Entry = struct {
831 1 + uleb128Bytes(std.math.maxInt(u32)) + 1,833 1 + uleb128Bytes(std.math.maxInt(u32)) + 1,
832 )834 )
833 ]u8 = undefined;835 ]u8 = undefined;
834 var bw: Writer = .fixed(&buf);836 var fbs = std.io.fixedBufferStream(&buf);
837 const writer = fbs.writer();
835 if (sec == &dwarf.debug_info.section) switch (len) {838 if (sec == &dwarf.debug_info.section) switch (len) {
836 0 => {},839 0 => {},
837 1 => bw.writeLeb128(try dwarf.refAbbrevCode(.pad_1)) catch unreachable,840 1 => uleb128(writer, try dwarf.refAbbrevCode(.pad_1)) catch unreachable,
838 else => {841 else => {
839 bw.writeLeb128(try dwarf.refAbbrevCode(.pad_n)) catch unreachable;842 uleb128(writer, try dwarf.refAbbrevCode(.pad_n)) catch unreachable;
840 const abbrev_code_bytes = bw.end;843 const abbrev_code_bytes = fbs.pos;
841 var block_len_bytes: u5 = 1;844 var block_len_bytes: u5 = 1;
842 while (true) switch (std.math.order(len - abbrev_code_bytes - block_len_bytes, @as(u32, 1) << 7 * block_len_bytes)) {845 while (true) switch (std.math.order(len - abbrev_code_bytes - block_len_bytes, @as(u32, 1) << 7 * block_len_bytes)) {
843 .lt => break bw.writeLeb128(len - abbrev_code_bytes - block_len_bytes) catch unreachable,846 .lt => break uleb128(writer, len - abbrev_code_bytes - block_len_bytes) catch unreachable,
844 .eq => {847 .eq => {
845 // no length will ever work, so undercount and futz with the leb encoding to make up the missing byte848 // no length will ever work, so undercount and futz with the leb encoding to make up the missing byte
846 block_len_bytes += 1;849 block_len_bytes += 1;
847 std.leb.writeUnsignedExtended((try bw.writableSlice(block_len_bytes)), len - abbrev_code_bytes - block_len_bytes);850 std.leb.writeUnsignedExtended(buf[fbs.pos..][0..block_len_bytes], len - abbrev_code_bytes - block_len_bytes);
851 fbs.pos += block_len_bytes;
848 break;852 break;
849 },853 },
850 .gt => block_len_bytes += 1,854 .gt => block_len_bytes += 1,
851 };855 };
852 assert(bw.end == abbrev_code_bytes + block_len_bytes);856 assert(fbs.pos == abbrev_code_bytes + block_len_bytes);
853 },857 },
854 } else if (sec == &dwarf.debug_line.section) switch (len) {858 } else if (sec == &dwarf.debug_line.section) switch (len) {
855 0 => {},859 0 => {},
856 1 => bw.writeByte(DW.LNS.const_add_pc) catch unreachable,860 1 => writer.writeByte(DW.LNS.const_add_pc) catch unreachable,
857 else => {861 else => {
858 bw.writeByte(DW.LNS.extended_op) catch unreachable;862 writer.writeByte(DW.LNS.extended_op) catch unreachable;
859 const extended_op_bytes = bw.end;863 const extended_op_bytes = fbs.pos;
860 var op_len_bytes: u5 = 1;864 var op_len_bytes: u5 = 1;
861 while (true) switch (std.math.order(len - extended_op_bytes - op_len_bytes, @as(u32, 1) << 7 * op_len_bytes)) {865 while (true) switch (std.math.order(len - extended_op_bytes - op_len_bytes, @as(u32, 1) << 7 * op_len_bytes)) {
862 .lt => break bw.writeLeb128(len - extended_op_bytes - op_len_bytes) catch unreachable,866 .lt => break uleb128(writer, len - extended_op_bytes - op_len_bytes) catch unreachable,
863 .eq => {867 .eq => {
864 // no length will ever work, so undercount and futz with the leb encoding to make up the missing byte868 // no length will ever work, so undercount and futz with the leb encoding to make up the missing byte
865 op_len_bytes += 1;869 op_len_bytes += 1;
866 std.leb.writeUnsignedExtended(870 std.leb.writeUnsignedExtended(buf[fbs.pos..][0..op_len_bytes], len - extended_op_bytes - op_len_bytes);
867 (bw.writableSlice(op_len_bytes) catch unreachable),871 fbs.pos += op_len_bytes;
868 len - extended_op_bytes - op_len_bytes,
869 );
870 break;872 break;
871 },873 },
872 .gt => op_len_bytes += 1,874 .gt => op_len_bytes += 1,
873 };875 };
874 assert(bw.end == extended_op_bytes + op_len_bytes);876 assert(fbs.pos == extended_op_bytes + op_len_bytes);
875 if (len > 2) bw.writeByte(DW.LNE.padding) catch unreachable;877 if (len > 2) writer.writeByte(DW.LNE.padding) catch unreachable;
876 },878 },
877 } else assert(!sec.pad_entries_to_ideal and len == 0);879 } else assert(!sec.pad_entries_to_ideal and len == 0);
878 assert(bw.end <= len);880 assert(fbs.pos <= len);
879 try dwarf.getFile().?.pwriteAll(bw.getWritten(), sec.off(dwarf) + unit.off + unit.header_len + start);881 try dwarf.getFile().?.pwriteAll(fbs.getWritten(), sec.off(dwarf) + unit.off + unit.header_len + start);
880 }882 }
881883
882 fn resize(entry_ptr: *Entry, unit: *Unit, sec: *Section, dwarf: *Dwarf, len: u32) UpdateError!void {884 fn resize(entry_ptr: *Entry, unit: *Unit, sec: *Section, dwarf: *Dwarf, len: u32) UpdateError!void {
...@@ -1131,149 +1133,150 @@ pub const Loc = union(enum) {...@@ -1131,149 +1133,150 @@ pub const Loc = union(enum) {
1131 };1133 };
1132 }1134 }
11331135
1134 fn writeReg(bw: *Writer, reg: u32, op0: u8, opx: u8) Writer.Error!void {1136 fn writeReg(reg: u32, op0: u8, opx: u8, writer: anytype) @TypeOf(writer).Error!void {
1135 if (std.math.cast(u5, reg)) |small_reg| {1137 if (std.math.cast(u5, reg)) |small_reg| {
1136 try bw.writeByte(op0 + small_reg);1138 try writer.writeByte(op0 + small_reg);
1137 } else {1139 } else {
1138 try bw.writeByte(opx);1140 try writer.writeByte(opx);
1139 try bw.writeLeb128(reg);1141 try uleb128(writer, reg);
1140 }1142 }
1141 }1143 }
11421144
1143 fn write(loc: Loc, bw: *Writer, adapter: anytype) UpdateError!void {1145 fn write(loc: Loc, adapter: anytype) UpdateError!void {
1146 const writer = adapter.writer();
1144 switch (loc) {1147 switch (loc) {
1145 .empty => {},1148 .empty => {},
1146 .addr_reloc => |sym_index| {1149 .addr_reloc => |sym_index| {
1147 try bw.writeByte(DW.OP.addr);1150 try writer.writeByte(DW.OP.addr);
1148 try adapter.addrSym(sym_index);1151 try adapter.addrSym(sym_index);
1149 },1152 },
1150 .deref => |addr| {1153 .deref => |addr| {
1151 try addr.write(adapter);1154 try addr.write(adapter);
1152 try bw.writeByte(DW.OP.deref);1155 try writer.writeByte(DW.OP.deref);
1153 },1156 },
1154 .constu => |constu| if (std.math.cast(u5, constu)) |lit| {1157 .constu => |constu| if (std.math.cast(u5, constu)) |lit| {
1155 try bw.writeByte(@as(u8, DW.OP.lit0) + lit);1158 try writer.writeByte(@as(u8, DW.OP.lit0) + lit);
1156 } else if (std.math.cast(u8, constu)) |const1u| {1159 } else if (std.math.cast(u8, constu)) |const1u| {
1157 try bw.writeAll(&.{ DW.OP.const1u, const1u });1160 try writer.writeAll(&.{ DW.OP.const1u, const1u });
1158 } else if (std.math.cast(u16, constu)) |const2u| {1161 } else if (std.math.cast(u16, constu)) |const2u| {
1159 try bw.writeByte(DW.OP.const2u);1162 try writer.writeByte(DW.OP.const2u);
1160 try bw.writeInt(u16, const2u, adapter.endian());1163 try writer.writeInt(u16, const2u, adapter.endian());
1161 } else if (std.math.cast(u21, constu)) |const3u| {1164 } else if (std.math.cast(u21, constu)) |const3u| {
1162 try bw.writeByte(DW.OP.constu);1165 try writer.writeByte(DW.OP.constu);
1163 try bw.writeLeb128(const3u);1166 try uleb128(writer, const3u);
1164 } else if (std.math.cast(u32, constu)) |const4u| {1167 } else if (std.math.cast(u32, constu)) |const4u| {
1165 try bw.writeByte(DW.OP.const4u);1168 try writer.writeByte(DW.OP.const4u);
1166 try bw.writeInt(u32, const4u, adapter.endian());1169 try writer.writeInt(u32, const4u, adapter.endian());
1167 } else if (std.math.cast(u49, constu)) |const7u| {1170 } else if (std.math.cast(u49, constu)) |const7u| {
1168 try bw.writeByte(DW.OP.constu);1171 try writer.writeByte(DW.OP.constu);
1169 try bw.writeLeb128(const7u);1172 try uleb128(writer, const7u);
1170 } else {1173 } else {
1171 try bw.writeByte(DW.OP.const8u);1174 try writer.writeByte(DW.OP.const8u);
1172 try bw.writeInt(u64, constu, adapter.endian());1175 try writer.writeInt(u64, constu, adapter.endian());
1173 },1176 },
1174 .consts => |consts| if (std.math.cast(i8, consts)) |const1s| {1177 .consts => |consts| if (std.math.cast(i8, consts)) |const1s| {
1175 try bw.writeAll(&.{ DW.OP.const1s, @bitCast(const1s) });1178 try writer.writeAll(&.{ DW.OP.const1s, @bitCast(const1s) });
1176 } else if (std.math.cast(i16, consts)) |const2s| {1179 } else if (std.math.cast(i16, consts)) |const2s| {
1177 try bw.writeByte(DW.OP.const2s);1180 try writer.writeByte(DW.OP.const2s);
1178 try bw.writeInt(i16, const2s, adapter.endian());1181 try writer.writeInt(i16, const2s, adapter.endian());
1179 } else if (std.math.cast(i21, consts)) |const3s| {1182 } else if (std.math.cast(i21, consts)) |const3s| {
1180 try bw.writeByte(DW.OP.consts);1183 try writer.writeByte(DW.OP.consts);
1181 try bw.writeLeb128(const3s);1184 try sleb128(writer, const3s);
1182 } else if (std.math.cast(i32, consts)) |const4s| {1185 } else if (std.math.cast(i32, consts)) |const4s| {
1183 try bw.writeByte(DW.OP.const4s);1186 try writer.writeByte(DW.OP.const4s);
1184 try bw.writeInt(i32, const4s, adapter.endian());1187 try writer.writeInt(i32, const4s, adapter.endian());
1185 } else if (std.math.cast(i49, consts)) |const7s| {1188 } else if (std.math.cast(i49, consts)) |const7s| {
1186 try bw.writeByte(DW.OP.consts);1189 try writer.writeByte(DW.OP.consts);
1187 try bw.writeLeb128(const7s);1190 try sleb128(writer, const7s);
1188 } else {1191 } else {
1189 try bw.writeByte(DW.OP.const8s);1192 try writer.writeByte(DW.OP.const8s);
1190 try bw.writeInt(i64, consts, adapter.endian());1193 try writer.writeInt(i64, consts, adapter.endian());
1191 },1194 },
1192 .plus => |plus| done: {1195 .plus => |plus| done: {
1193 if (plus[0].getConst(u0)) |_| {1196 if (plus[0].getConst(u0)) |_| {
1194 try plus[1].write(bw, adapter);1197 try plus[1].write(adapter);
1195 break :done;1198 break :done;
1196 }1199 }
1197 if (plus[1].getConst(u0)) |_| {1200 if (plus[1].getConst(u0)) |_| {
1198 try plus[0].write(bw, adapter);1201 try plus[0].write(adapter);
1199 break :done;1202 break :done;
1200 }1203 }
1201 if (plus[0].getBaseReg()) |breg| {1204 if (plus[0].getBaseReg()) |breg| {
1202 if (plus[1].getConst(i65)) |offset| {1205 if (plus[1].getConst(i65)) |offset| {
1203 try writeReg(bw, breg, DW.OP.breg0, DW.OP.bregx);1206 try writeReg(breg, DW.OP.breg0, DW.OP.bregx, writer);
1204 try bw.writeLeb128(offset);1207 try sleb128(writer, offset);
1205 break :done;1208 break :done;
1206 }1209 }
1207 }1210 }
1208 if (plus[1].getBaseReg()) |breg| {1211 if (plus[1].getBaseReg()) |breg| {
1209 if (plus[0].getConst(i65)) |offset| {1212 if (plus[0].getConst(i65)) |offset| {
1210 try writeReg(bw, breg, DW.OP.breg0, DW.OP.bregx);1213 try writeReg(breg, DW.OP.breg0, DW.OP.bregx, writer);
1211 try bw.writeLeb128(offset);1214 try sleb128(writer, offset);
1212 break :done;1215 break :done;
1213 }1216 }
1214 }1217 }
1215 if (plus[0].getConst(u64)) |uconst| {1218 if (plus[0].getConst(u64)) |uconst| {
1216 try plus[1].write(bw, adapter);1219 try plus[1].write(adapter);
1217 try bw.writeByte(DW.OP.plus_uconst);1220 try writer.writeByte(DW.OP.plus_uconst);
1218 try bw.writeLeb128(uconst);1221 try uleb128(writer, uconst);
1219 break :done;1222 break :done;
1220 }1223 }
1221 if (plus[1].getConst(u64)) |uconst| {1224 if (plus[1].getConst(u64)) |uconst| {
1222 try plus[0].write(bw, adapter);1225 try plus[0].write(adapter);
1223 try bw.writeByte(DW.OP.plus_uconst);1226 try writer.writeByte(DW.OP.plus_uconst);
1224 try bw.writeLeb128(uconst);1227 try uleb128(writer, uconst);
1225 break :done;1228 break :done;
1226 }1229 }
1227 try plus[0].write(bw, adapter);1230 try plus[0].write(adapter);
1228 try plus[1].write(bw, adapter);1231 try plus[1].write(adapter);
1229 try bw.writeByte(DW.OP.plus);1232 try writer.writeByte(DW.OP.plus);
1230 },1233 },
1231 .reg => |reg| try writeReg(bw, reg, DW.OP.reg0, DW.OP.regx),1234 .reg => |reg| try writeReg(reg, DW.OP.reg0, DW.OP.regx, writer),
1232 .breg => |breg| {1235 .breg => |breg| {
1233 try writeReg(bw, breg, DW.OP.breg0, DW.OP.bregx);1236 try writeReg(breg, DW.OP.breg0, DW.OP.bregx, writer);
1234 try bw.writeSleb128(0);1237 try sleb128(writer, 0);
1235 },1238 },
1236 .push_object_address => try bw.writeByte(DW.OP.push_object_address),1239 .push_object_address => try writer.writeByte(DW.OP.push_object_address),
1237 .call => |call| {1240 .call => |call| {
1238 for (call.args) |arg| try arg.write(adapter);1241 for (call.args) |arg| try arg.write(adapter);
1239 try bw.writeByte(DW.OP.call_ref);1242 try writer.writeByte(DW.OP.call_ref);
1240 try adapter.infoEntry(call.unit, call.entry);1243 try adapter.infoEntry(call.unit, call.entry);
1241 },1244 },
1242 .form_tls_address => |addr| {1245 .form_tls_address => |addr| {
1243 try addr.write(bw, adapter);1246 try addr.write(adapter);
1244 try bw.writeByte(DW.OP.form_tls_address);1247 try writer.writeByte(DW.OP.form_tls_address);
1245 },1248 },
1246 .implicit_value => |value| {1249 .implicit_value => |value| {
1247 try bw.writeByte(DW.OP.implicit_value);1250 try writer.writeByte(DW.OP.implicit_value);
1248 try bw.writeLeb128(value.len);1251 try uleb128(writer, value.len);
1249 try bw.writeAll(value);1252 try writer.writeAll(value);
1250 },1253 },
1251 .stack_value => |value| {1254 .stack_value => |value| {
1252 try value.write(bw, adapter);1255 try value.write(adapter);
1253 try bw.writeByte(DW.OP.stack_value);1256 try writer.writeByte(DW.OP.stack_value);
1254 },1257 },
1255 .implicit_pointer => |implicit_pointer| {1258 .implicit_pointer => |implicit_pointer| {
1256 try bw.writeByte(DW.OP.implicit_pointer);1259 try writer.writeByte(DW.OP.implicit_pointer);
1257 try adapter.infoEntry(bw, implicit_pointer.unit, implicit_pointer.entry);1260 try adapter.infoEntry(implicit_pointer.unit, implicit_pointer.entry);
1258 try bw.writeLeb128(implicit_pointer.offset);1261 try sleb128(writer, implicit_pointer.offset);
1259 },1262 },
1260 .wasm_ext => |wasm_ext| {1263 .wasm_ext => |wasm_ext| {
1261 try bw.writeByte(DW.OP.WASM_location);1264 try writer.writeByte(DW.OP.WASM_location);
1262 switch (wasm_ext) {1265 switch (wasm_ext) {
1263 .local => |local| {1266 .local => |local| {
1264 try bw.writeByte(DW.OP.WASM_local);1267 try writer.writeByte(DW.OP.WASM_local);
1265 try bw.writeLeb128(local);1268 try uleb128(writer, local);
1266 },1269 },
1267 .global => |global| if (std.math.cast(u21, global)) |global_u21| {1270 .global => |global| if (std.math.cast(u21, global)) |global_u21| {
1268 try bw.writeByte(DW.OP.WASM_global);1271 try writer.writeByte(DW.OP.WASM_global);
1269 try bw.writeLeb128(global_u21);1272 try uleb128(writer, global_u21);
1270 } else {1273 } else {
1271 try bw.writeByte(DW.OP.WASM_global_u32);1274 try writer.writeByte(DW.OP.WASM_global_u32);
1272 try bw.writeInt(u32, global, adapter.endian());1275 try writer.writeInt(u32, global, adapter.endian());
1273 },1276 },
1274 .operand_stack => |operand_stack| {1277 .operand_stack => |operand_stack| {
1275 try bw.writeByte(DW.OP.WASM_operand_stack);1278 try writer.writeByte(DW.OP.WASM_operand_stack);
1276 try bw.writeLeb128(operand_stack);1279 try uleb128(writer, operand_stack);
1277 },1280 },
1278 }1281 }
1279 },1282 },
...@@ -1306,21 +1309,21 @@ pub const Cfa = union(enum) {...@@ -1306,21 +1309,21 @@ pub const Cfa = union(enum) {
1306 const RegExpr = struct { reg: u32, expr: Loc };1309 const RegExpr = struct { reg: u32, expr: Loc };
13071310
1308 fn write(cfa: Cfa, wip_nav: *WipNav) UpdateError!void {1311 fn write(cfa: Cfa, wip_nav: *WipNav) UpdateError!void {
1309 const bw = &wip_nav.debug_frame.buffered_writer;1312 const writer = wip_nav.debug_frame.writer(wip_nav.dwarf.gpa);
1310 switch (cfa) {1313 switch (cfa) {
1311 .nop => try bw.writeByte(DW.CFA.nop),1314 .nop => try writer.writeByte(DW.CFA.nop),
1312 .advance_loc => |loc| {1315 .advance_loc => |loc| {
1313 const delta = @divExact(loc - wip_nav.cfi.loc, wip_nav.dwarf.debug_frame.header.code_alignment_factor);1316 const delta = @divExact(loc - wip_nav.cfi.loc, wip_nav.dwarf.debug_frame.header.code_alignment_factor);
1314 if (delta == 0) {} else if (std.math.cast(u6, delta)) |small_delta|1317 if (delta == 0) {} else if (std.math.cast(u6, delta)) |small_delta|
1315 try bw.writeByte(@as(u8, DW.CFA.advance_loc) + small_delta)1318 try writer.writeByte(@as(u8, DW.CFA.advance_loc) + small_delta)
1316 else if (std.math.cast(u8, delta)) |ubyte_delta|1319 else if (std.math.cast(u8, delta)) |ubyte_delta|
1317 try bw.writeAll(&.{ DW.CFA.advance_loc1, ubyte_delta })1320 try writer.writeAll(&.{ DW.CFA.advance_loc1, ubyte_delta })
1318 else if (std.math.cast(u16, delta)) |uhalf_delta| {1321 else if (std.math.cast(u16, delta)) |uhalf_delta| {
1319 try bw.writeByte(DW.CFA.advance_loc2);1322 try writer.writeByte(DW.CFA.advance_loc2);
1320 try bw.writeInt(u16, uhalf_delta, wip_nav.dwarf.endian);1323 try writer.writeInt(u16, uhalf_delta, wip_nav.dwarf.endian);
1321 } else if (std.math.cast(u32, delta)) |uword_delta| {1324 } else if (std.math.cast(u32, delta)) |uword_delta| {
1322 try bw.writeByte(DW.CFA.advance_loc4);1325 try writer.writeByte(DW.CFA.advance_loc4);
1323 try bw.writeInt(u32, uword_delta, wip_nav.dwarf.endian);1326 try writer.writeInt(u32, uword_delta, wip_nav.dwarf.endian);
1324 }1327 }
1325 wip_nav.cfi.loc = loc;1328 wip_nav.cfi.loc = loc;
1326 },1329 },
...@@ -1332,41 +1335,41 @@ pub const Cfa = union(enum) {...@@ -1332,41 +1335,41 @@ pub const Cfa = union(enum) {
1332 }, wip_nav.dwarf.debug_frame.header.data_alignment_factor);1335 }, wip_nav.dwarf.debug_frame.header.data_alignment_factor);
1333 if (std.math.cast(u63, factored_off)) |unsigned_off| {1336 if (std.math.cast(u63, factored_off)) |unsigned_off| {
1334 if (std.math.cast(u6, reg_off.reg)) |small_reg| {1337 if (std.math.cast(u6, reg_off.reg)) |small_reg| {
1335 try bw.writeByte(@as(u8, DW.CFA.offset) + small_reg);1338 try writer.writeByte(@as(u8, DW.CFA.offset) + small_reg);
1336 } else {1339 } else {
1337 try bw.writeByte(DW.CFA.offset_extended);1340 try writer.writeByte(DW.CFA.offset_extended);
1338 try bw.writeLeb128(reg_off.reg);1341 try uleb128(writer, reg_off.reg);
1339 }1342 }
1340 try bw.writeLeb128(unsigned_off);1343 try uleb128(writer, unsigned_off);
1341 } else {1344 } else {
1342 try bw.writeByte(DW.CFA.offset_extended_sf);1345 try writer.writeByte(DW.CFA.offset_extended_sf);
1343 try bw.writeLeb128(reg_off.reg);1346 try uleb128(writer, reg_off.reg);
1344 try bw.writeLeb128(factored_off);1347 try sleb128(writer, factored_off);
1345 }1348 }
1346 },1349 },
1347 .restore => |reg| if (std.math.cast(u6, reg)) |small_reg|1350 .restore => |reg| if (std.math.cast(u6, reg)) |small_reg|
1348 try bw.writeByte(@as(u8, DW.CFA.restore) + small_reg)1351 try writer.writeByte(@as(u8, DW.CFA.restore) + small_reg)
1349 else {1352 else {
1350 try bw.writeByte(DW.CFA.restore_extended);1353 try writer.writeByte(DW.CFA.restore_extended);
1351 try bw.writeLeb128(reg);1354 try uleb128(writer, reg);
1352 },1355 },
1353 .undefined => |reg| {1356 .undefined => |reg| {
1354 try bw.writeByte(DW.CFA.undefined);1357 try writer.writeByte(DW.CFA.undefined);
1355 try bw.writeLeb128(reg);1358 try uleb128(writer, reg);
1356 },1359 },
1357 .same_value => |reg| {1360 .same_value => |reg| {
1358 try bw.writeByte(DW.CFA.same_value);1361 try writer.writeByte(DW.CFA.same_value);
1359 try bw.writeLeb128(reg);1362 try uleb128(writer, reg);
1360 },1363 },
1361 .register => |regs| if (regs[0] != regs[1]) {1364 .register => |regs| if (regs[0] != regs[1]) {
1362 try bw.writeByte(DW.CFA.register);1365 try writer.writeByte(DW.CFA.register);
1363 for (regs) |reg| try bw.writeLeb128(reg);1366 for (regs) |reg| try uleb128(writer, reg);
1364 } else {1367 } else {
1365 try bw.writeByte(DW.CFA.same_value);1368 try writer.writeByte(DW.CFA.same_value);
1366 try bw.writeLeb128(regs[0]);1369 try uleb128(writer, regs[0]);
1367 },1370 },
1368 .remember_state => try bw.writeByte(DW.CFA.remember_state),1371 .remember_state => try writer.writeByte(DW.CFA.remember_state),
1369 .restore_state => try bw.writeByte(DW.CFA.restore_state),1372 .restore_state => try writer.writeByte(DW.CFA.restore_state),
1370 .def_cfa, .def_cfa_register, .def_cfa_offset, .adjust_cfa_offset => {1373 .def_cfa, .def_cfa_register, .def_cfa_offset, .adjust_cfa_offset => {
1371 const reg_off: RegOff = switch (cfa) {1374 const reg_off: RegOff = switch (cfa) {
1372 else => unreachable,1375 else => unreachable,
...@@ -1379,51 +1382,51 @@ pub const Cfa = union(enum) {...@@ -1379,51 +1382,51 @@ pub const Cfa = union(enum) {
1379 const unsigned_off = std.math.cast(u63, reg_off.off);1382 const unsigned_off = std.math.cast(u63, reg_off.off);
1380 if (reg_off.off == wip_nav.cfi.cfa.off) {1383 if (reg_off.off == wip_nav.cfi.cfa.off) {
1381 if (changed_reg) {1384 if (changed_reg) {
1382 try bw.writeByte(DW.CFA.def_cfa_register);1385 try writer.writeByte(DW.CFA.def_cfa_register);
1383 try bw.writeLeb128(reg_off.reg);1386 try uleb128(writer, reg_off.reg);
1384 }1387 }
1385 } else if (switch (wip_nav.dwarf.debug_frame.header.data_alignment_factor) {1388 } else if (switch (wip_nav.dwarf.debug_frame.header.data_alignment_factor) {
1386 0 => unreachable,1389 0 => unreachable,
1387 1 => unsigned_off != null,1390 1 => unsigned_off != null,
1388 else => |data_alignment_factor| @rem(reg_off.off, data_alignment_factor) != 0,1391 else => |data_alignment_factor| @rem(reg_off.off, data_alignment_factor) != 0,
1389 }) {1392 }) {
1390 try bw.writeByte(if (changed_reg) DW.CFA.def_cfa else DW.CFA.def_cfa_offset);1393 try writer.writeByte(if (changed_reg) DW.CFA.def_cfa else DW.CFA.def_cfa_offset);
1391 if (changed_reg) try bw.writeLeb128(reg_off.reg);1394 if (changed_reg) try uleb128(writer, reg_off.reg);
1392 try bw.writeLeb128(unsigned_off.?);1395 try uleb128(writer, unsigned_off.?);
1393 } else {1396 } else {
1394 try bw.writeByte(if (changed_reg) DW.CFA.def_cfa_sf else DW.CFA.def_cfa_offset_sf);1397 try writer.writeByte(if (changed_reg) DW.CFA.def_cfa_sf else DW.CFA.def_cfa_offset_sf);
1395 if (changed_reg) try bw.writeLeb128(reg_off.reg);1398 if (changed_reg) try uleb128(writer, reg_off.reg);
1396 try bw.writeLeb128(@divExact(reg_off.off, wip_nav.dwarf.debug_frame.header.data_alignment_factor));1399 try sleb128(writer, @divExact(reg_off.off, wip_nav.dwarf.debug_frame.header.data_alignment_factor));
1397 }1400 }
1398 wip_nav.cfi.cfa = reg_off;1401 wip_nav.cfi.cfa = reg_off;
1399 },1402 },
1400 .def_cfa_expression => |expr| {1403 .def_cfa_expression => |expr| {
1401 try bw.writeByte(DW.CFA.def_cfa_expression);1404 try writer.writeByte(DW.CFA.def_cfa_expression);
1402 try wip_nav.frameExprLoc(expr);1405 try wip_nav.frameExprLoc(expr);
1403 },1406 },
1404 .expression => |reg_expr| {1407 .expression => |reg_expr| {
1405 try bw.writeByte(DW.CFA.expression);1408 try writer.writeByte(DW.CFA.expression);
1406 try bw.writeLeb128(reg_expr.reg);1409 try uleb128(writer, reg_expr.reg);
1407 try wip_nav.frameExprLoc(reg_expr.expr);1410 try wip_nav.frameExprLoc(reg_expr.expr);
1408 },1411 },
1409 .val_offset => |reg_off| {1412 .val_offset => |reg_off| {
1410 const factored_off = @divExact(reg_off.off, wip_nav.dwarf.debug_frame.header.data_alignment_factor);1413 const factored_off = @divExact(reg_off.off, wip_nav.dwarf.debug_frame.header.data_alignment_factor);
1411 if (std.math.cast(u63, factored_off)) |unsigned_off| {1414 if (std.math.cast(u63, factored_off)) |unsigned_off| {
1412 try bw.writeByte(DW.CFA.val_offset);1415 try writer.writeByte(DW.CFA.val_offset);
1413 try bw.writeLeb128(reg_off.reg);1416 try uleb128(writer, reg_off.reg);
1414 try bw.writeLeb128(unsigned_off);1417 try uleb128(writer, unsigned_off);
1415 } else {1418 } else {
1416 try bw.writeByte(DW.CFA.val_offset_sf);1419 try writer.writeByte(DW.CFA.val_offset_sf);
1417 try bw.writeLeb128(reg_off.reg);1420 try uleb128(writer, reg_off.reg);
1418 try bw.writeLeb128(factored_off);1421 try sleb128(writer, factored_off);
1419 }1422 }
1420 },1423 },
1421 .val_expression => |reg_expr| {1424 .val_expression => |reg_expr| {
1422 try bw.writeByte(DW.CFA.val_expression);1425 try writer.writeByte(DW.CFA.val_expression);
1423 try bw.writeLeb128(reg_expr.reg);1426 try uleb128(writer, reg_expr.reg);
1424 try wip_nav.frameExprLoc(reg_expr.expr);1427 try wip_nav.frameExprLoc(reg_expr.expr);
1425 },1428 },
1426 .escape => |bytes| try bw.writeAll(bytes),1429 .escape => |bytes| try writer.writeAll(bytes),
1427 }1430 }
1428 }1431 }
1429};1432};
...@@ -1446,27 +1449,19 @@ pub const WipNav = struct {...@@ -1446,27 +1449,19 @@ pub const WipNav = struct {
1446 loc: u32,1449 loc: u32,
1447 cfa: Cfa.RegOff,1450 cfa: Cfa.RegOff,
1448 },1451 },
1449 debug_frame: std.io.Writer.Allocating,1452 debug_frame: std.ArrayListUnmanaged(u8),
1450 debug_info: std.io.Writer.Allocating,1453 debug_info: std.ArrayListUnmanaged(u8),
1451 debug_line: std.io.Writer.Allocating,1454 debug_line: std.ArrayListUnmanaged(u8),
1452 debug_loclists: std.io.Writer.Allocating,1455 debug_loclists: std.ArrayListUnmanaged(u8),
1453 pending_lazy: PendingLazy,1456 pending_lazy: PendingLazy,
14541457
1455 pub fn init(wip_nav: *WipNav) void {
1456 const gpa = wip_nav.dwarf.gpa;
1457 wip_nav.debug_frame.init(gpa);
1458 wip_nav.debug_info.init(gpa);
1459 wip_nav.debug_line.init(gpa);
1460 wip_nav.debug_loclists.init(gpa);
1461 }
1462
1463 pub fn deinit(wip_nav: *WipNav) void {1458 pub fn deinit(wip_nav: *WipNav) void {
1464 const gpa = wip_nav.dwarf.gpa;1459 const gpa = wip_nav.dwarf.gpa;
1465 if (wip_nav.func != .none) wip_nav.blocks.deinit(gpa);1460 if (wip_nav.func != .none) wip_nav.blocks.deinit(gpa);
1466 wip_nav.debug_frame.deinit();1461 wip_nav.debug_frame.deinit(gpa);
1467 wip_nav.debug_info.deinit();1462 wip_nav.debug_info.deinit(gpa);
1468 wip_nav.debug_line.deinit();1463 wip_nav.debug_line.deinit(gpa);
1469 wip_nav.debug_loclists.deinit();1464 wip_nav.debug_loclists.deinit(gpa);
1470 wip_nav.pending_lazy.types.deinit(gpa);1465 wip_nav.pending_lazy.types.deinit(gpa);
1471 wip_nav.pending_lazy.values.deinit(gpa);1466 wip_nav.pending_lazy.values.deinit(gpa);
1472 }1467 }
...@@ -1543,7 +1538,7 @@ pub const WipNav = struct {...@@ -1543,7 +1538,7 @@ pub const WipNav = struct {
1543 delta_line: i33,1538 delta_line: i33,
1544 delta_pc: u64,1539 delta_pc: u64,
1545 ) error{OutOfMemory}!void {1540 ) error{OutOfMemory}!void {
1546 const dlbw = &wip_nav.debug_line.buffered_writer;1541 const dlw = wip_nav.debug_line.writer(wip_nav.dwarf.gpa);
15471542
1548 const header = wip_nav.dwarf.debug_line.header;1543 const header = wip_nav.dwarf.debug_line.header;
1549 assert(header.maximum_operations_per_instruction == 1);1544 assert(header.maximum_operations_per_instruction == 1);
...@@ -1553,8 +1548,8 @@ pub const WipNav = struct {...@@ -1553,8 +1548,8 @@ pub const WipNav = struct {
1553 delta_line - header.line_base >= header.line_range)1548 delta_line - header.line_base >= header.line_range)
1554 remaining: {1549 remaining: {
1555 assert(delta_line != 0);1550 assert(delta_line != 0);
1556 try dlbw.writeByte(DW.LNS.advance_line);1551 try dlw.writeByte(DW.LNS.advance_line);
1557 try dlbw.writeLeb128(delta_line);1552 try sleb128(dlw, delta_line);
1558 break :remaining 0;1553 break :remaining 0;
1559 } else delta_line);1554 } else delta_line);
15601555
...@@ -1562,68 +1557,68 @@ pub const WipNav = struct {...@@ -1562,68 +1557,68 @@ pub const WipNav = struct {
1562 header.maximum_operations_per_instruction + delta_op;1557 header.maximum_operations_per_instruction + delta_op;
1563 const max_op_advance: u9 = (std.math.maxInt(u8) - header.opcode_base) / header.line_range;1558 const max_op_advance: u9 = (std.math.maxInt(u8) - header.opcode_base) / header.line_range;
1564 const remaining_op_advance: u8 = @intCast(if (op_advance >= 2 * max_op_advance) remaining: {1559 const remaining_op_advance: u8 = @intCast(if (op_advance >= 2 * max_op_advance) remaining: {
1565 try dlbw.writeByte(DW.LNS.advance_pc);1560 try dlw.writeByte(DW.LNS.advance_pc);
1566 try dlbw.writeLeb128(op_advance);1561 try uleb128(dlw, op_advance);
1567 break :remaining 0;1562 break :remaining 0;
1568 } else if (op_advance >= max_op_advance) remaining: {1563 } else if (op_advance >= max_op_advance) remaining: {
1569 try dlbw.writeByte(DW.LNS.const_add_pc);1564 try dlw.writeByte(DW.LNS.const_add_pc);
1570 break :remaining op_advance - max_op_advance;1565 break :remaining op_advance - max_op_advance;
1571 } else op_advance);1566 } else op_advance);
15721567
1573 try dlbw.writeByte(1568 if (remaining_delta_line == 0 and remaining_op_advance == 0)
1574 if (remaining_delta_line == 0 and remaining_op_advance == 0)1569 try dlw.writeByte(DW.LNS.copy)
1575 DW.LNS.copy1570 else
1576 else1571 try dlw.writeByte(@intCast((remaining_delta_line - header.line_base) +
1577 @intCast((remaining_delta_line - header.line_base) +1572 (header.line_range * remaining_op_advance) + header.opcode_base));
1578 (header.line_range * remaining_op_advance) + header.opcode_base),
1579 );
1580 }1573 }
15811574
1582 pub fn setColumn(wip_nav: *WipNav, column: u32) Allocator.Error!void {1575 pub fn setColumn(wip_nav: *WipNav, column: u32) error{OutOfMemory}!void {
1583 const dlbw = &wip_nav.debug_line.buffered_writer;1576 const dlw = wip_nav.debug_line.writer(wip_nav.dwarf.gpa);
1584 try dlbw.writeByte(DW.LNS.set_column);1577 try dlw.writeByte(DW.LNS.set_column);
1585 try dlbw.writeLeb128(column + 1);1578 try uleb128(dlw, column + 1);
1586 }1579 }
15871580
1588 pub fn negateStmt(wip_nav: *WipNav) Allocator.Error!void {1581 pub fn negateStmt(wip_nav: *WipNav) error{OutOfMemory}!void {
1589 return wip_nav.debug_line.buffered_writer.writeByte(DW.LNS.negate_stmt);1582 const dlw = wip_nav.debug_line.writer(wip_nav.dwarf.gpa);
1583 try dlw.writeByte(DW.LNS.negate_stmt);
1590 }1584 }
15911585
1592 pub fn setPrologueEnd(wip_nav: *WipNav) Allocator.Error!void {1586 pub fn setPrologueEnd(wip_nav: *WipNav) error{OutOfMemory}!void {
1593 return wip_nav.debug_line.buffered_writer.writeByte(DW.LNS.set_prologue_end);1587 const dlw = wip_nav.debug_line.writer(wip_nav.dwarf.gpa);
1588 try dlw.writeByte(DW.LNS.set_prologue_end);
1594 }1589 }
15951590
1596 pub fn setEpilogueBegin(wip_nav: *WipNav) Allocator.Error!void {1591 pub fn setEpilogueBegin(wip_nav: *WipNav) error{OutOfMemory}!void {
1597 return wip_nav.debug_line.buffered_writer.writeByte(DW.LNS.set_epilogue_begin);1592 const dlw = wip_nav.debug_line.writer(wip_nav.dwarf.gpa);
1593 try dlw.writeByte(DW.LNS.set_epilogue_begin);
1598 }1594 }
15991595
1600 pub fn enterBlock(wip_nav: *WipNav, code_off: u64) UpdateError!void {1596 pub fn enterBlock(wip_nav: *WipNav, code_off: u64) UpdateError!void {
1601 const dwarf = wip_nav.dwarf;1597 const dwarf = wip_nav.dwarf;
1602 const dibw = &wip_nav.debug_info.buffered_writer;1598 const diw = wip_nav.debug_info.writer(dwarf.gpa);
1603 const block = try wip_nav.blocks.addOne(dwarf.gpa);1599 const block = try wip_nav.blocks.addOne(dwarf.gpa);
16041600
1605 block.abbrev_code = @intCast(dibw.count);1601 block.abbrev_code = @intCast(wip_nav.debug_info.items.len);
1606 try wip_nav.abbrevCode(.block);1602 try wip_nav.abbrevCode(.block);
1607 block.low_pc_off = code_off;1603 block.low_pc_off = code_off;
1608 try wip_nav.infoAddrSym(wip_nav.func_sym_index, code_off);1604 try wip_nav.infoAddrSym(wip_nav.func_sym_index, code_off);
1609 block.high_pc = @intCast(dibw.count);1605 block.high_pc = @intCast(wip_nav.debug_info.items.len);
1610 try dibw.writeInt(u32, 0, dwarf.endian);1606 try diw.writeInt(u32, 0, dwarf.endian);
1611 wip_nav.any_children = false;1607 wip_nav.any_children = false;
1612 }1608 }
16131609
1614 pub fn leaveBlock(wip_nav: *WipNav, code_off: u64) UpdateError!void {1610 pub fn leaveBlock(wip_nav: *WipNav, code_off: u64) UpdateError!void {
1615 const block_bytes = comptime uleb128Bytes(@intFromEnum(AbbrevCode.block));1611 const block_bytes = comptime uleb128Bytes(@intFromEnum(AbbrevCode.block));
1616 const block = wip_nav.blocks.pop().?;1612 const block = wip_nav.blocks.pop().?;
1617 const dib = wip_nav.debug_info.getWritten();
1618 if (wip_nav.any_children)1613 if (wip_nav.any_children)
1619 try wip_nav.debug_info.buffered_writer.writeLeb128(@intFromEnum(AbbrevCode.null))1614 try uleb128(wip_nav.debug_info.writer(wip_nav.dwarf.gpa), @intFromEnum(AbbrevCode.null))
1620 else1615 else
1621 std.leb.writeUnsignedFixed(1616 std.leb.writeUnsignedFixed(
1622 block_bytes,1617 block_bytes,
1623 dib[block.abbrev_code..][0..block_bytes],1618 wip_nav.debug_info.items[block.abbrev_code..][0..block_bytes],
1624 try wip_nav.dwarf.refAbbrevCode(.empty_block),1619 try wip_nav.dwarf.refAbbrevCode(.empty_block),
1625 );1620 );
1626 std.mem.writeInt(u32, dib[block.high_pc..][0..4], @intCast(code_off - block.low_pc_off), wip_nav.dwarf.endian);1621 std.mem.writeInt(u32, wip_nav.debug_info.items[block.high_pc..][0..4], @intCast(code_off - block.low_pc_off), wip_nav.dwarf.endian);
1627 wip_nav.any_children = true;1622 wip_nav.any_children = true;
1628 }1623 }
16291624
...@@ -1636,18 +1631,18 @@ pub const WipNav = struct {...@@ -1636,18 +1631,18 @@ pub const WipNav = struct {
1636 ) UpdateError!void {1631 ) UpdateError!void {
1637 const dwarf = wip_nav.dwarf;1632 const dwarf = wip_nav.dwarf;
1638 const zcu = wip_nav.pt.zcu;1633 const zcu = wip_nav.pt.zcu;
1639 const dibw = &wip_nav.debug_info.buffered_writer;1634 const diw = wip_nav.debug_info.writer(dwarf.gpa);
1640 const block = try wip_nav.blocks.addOne(dwarf.gpa);1635 const block = try wip_nav.blocks.addOne(dwarf.gpa);
16411636
1642 block.abbrev_code = @intCast(dibw.count);1637 block.abbrev_code = @intCast(wip_nav.debug_info.items.len);
1643 try wip_nav.abbrevCode(.inlined_func);1638 try wip_nav.abbrevCode(.inlined_func);
1644 try wip_nav.refNav(zcu.funcInfo(func).owner_nav);1639 try wip_nav.refNav(zcu.funcInfo(func).owner_nav);
1645 try dibw.writeLeb128(zcu.navSrcLine(zcu.funcInfo(wip_nav.func).owner_nav) + line + 1);1640 try uleb128(diw, zcu.navSrcLine(zcu.funcInfo(wip_nav.func).owner_nav) + line + 1);
1646 try dibw.writeLeb128(column + 1);1641 try uleb128(diw, column + 1);
1647 block.low_pc_off = code_off;1642 block.low_pc_off = code_off;
1648 try wip_nav.infoAddrSym(wip_nav.func_sym_index, code_off);1643 try wip_nav.infoAddrSym(wip_nav.func_sym_index, code_off);
1649 block.high_pc = @intCast(dibw.count);1644 block.high_pc = @intCast(wip_nav.debug_info.items.len);
1650 try dibw.writeInt(u32, 0, dwarf.endian);1645 try diw.writeInt(u32, 0, dwarf.endian);
1651 try wip_nav.setInlineFunc(func);1646 try wip_nav.setInlineFunc(func);
1652 wip_nav.any_children = false;1647 wip_nav.any_children = false;
1653 }1648 }
...@@ -1655,16 +1650,15 @@ pub const WipNav = struct {...@@ -1655,16 +1650,15 @@ pub const WipNav = struct {
1655 pub fn leaveInlineFunc(wip_nav: *WipNav, func: InternPool.Index, code_off: u64) UpdateError!void {1650 pub fn leaveInlineFunc(wip_nav: *WipNav, func: InternPool.Index, code_off: u64) UpdateError!void {
1656 const inlined_func_bytes = comptime uleb128Bytes(@intFromEnum(AbbrevCode.inlined_func));1651 const inlined_func_bytes = comptime uleb128Bytes(@intFromEnum(AbbrevCode.inlined_func));
1657 const block = wip_nav.blocks.pop().?;1652 const block = wip_nav.blocks.pop().?;
1658 const dib = wip_nav.debug_info.getWritten();
1659 if (wip_nav.any_children)1653 if (wip_nav.any_children)
1660 try wip_nav.debug_info.buffered_writer.writeLeb128(@intFromEnum(AbbrevCode.null))1654 try uleb128(wip_nav.debug_info.writer(wip_nav.dwarf.gpa), @intFromEnum(AbbrevCode.null))
1661 else1655 else
1662 std.leb.writeUnsignedFixed(1656 std.leb.writeUnsignedFixed(
1663 inlined_func_bytes,1657 inlined_func_bytes,
1664 dib[block.abbrev_code..][0..inlined_func_bytes],1658 wip_nav.debug_info.items[block.abbrev_code..][0..inlined_func_bytes],
1665 try wip_nav.dwarf.refAbbrevCode(.empty_inlined_func),1659 try wip_nav.dwarf.refAbbrevCode(.empty_inlined_func),
1666 );1660 );
1667 std.mem.writeInt(u32, dib[block.high_pc..][0..4], @intCast(code_off - block.low_pc_off), wip_nav.dwarf.endian);1661 std.mem.writeInt(u32, wip_nav.debug_info.items[block.high_pc..][0..4], @intCast(code_off - block.low_pc_off), wip_nav.dwarf.endian);
1668 try wip_nav.setInlineFunc(func);1662 try wip_nav.setInlineFunc(func);
1669 wip_nav.any_children = true;1663 wip_nav.any_children = true;
1670 }1664 }
...@@ -1678,22 +1672,22 @@ pub const WipNav = struct {...@@ -1678,22 +1672,22 @@ pub const WipNav = struct {
1678 const new_file = zcu.navFileScopeIndex(new_func_info.owner_nav);1672 const new_file = zcu.navFileScopeIndex(new_func_info.owner_nav);
1679 const new_unit = try dwarf.getUnit(zcu.fileByIndex(new_file).mod.?);1673 const new_unit = try dwarf.getUnit(zcu.fileByIndex(new_file).mod.?);
16801674
1681 const dlbw = &wip_nav.debug_line.buffered_writer;1675 const dlw = wip_nav.debug_line.writer(dwarf.gpa);
1682 if (dwarf.incremental()) {1676 if (dwarf.incremental()) {
1683 const new_nav_gop = try dwarf.navs.getOrPut(dwarf.gpa, new_func_info.owner_nav);1677 const new_nav_gop = try dwarf.navs.getOrPut(dwarf.gpa, new_func_info.owner_nav);
1684 errdefer _ = if (!new_nav_gop.found_existing) dwarf.navs.pop();1678 errdefer _ = if (!new_nav_gop.found_existing) dwarf.navs.pop();
1685 if (!new_nav_gop.found_existing) new_nav_gop.value_ptr.* = try dwarf.addCommonEntry(new_unit);1679 if (!new_nav_gop.found_existing) new_nav_gop.value_ptr.* = try dwarf.addCommonEntry(new_unit);
16861680
1687 try dlbw.writeByte(DW.LNS.extended_op);1681 try dlw.writeByte(DW.LNS.extended_op);
1688 try dlbw.writeLeb128(1 + dwarf.sectionOffsetBytes());1682 try uleb128(dlw, 1 + dwarf.sectionOffsetBytes());
1689 try dlbw.writeByte(DW.LNE.ZIG_set_decl);1683 try dlw.writeByte(DW.LNE.ZIG_set_decl);
1690 try dwarf.debug_line.section.getUnit(wip_nav.unit).getEntry(wip_nav.entry).cross_section_relocs.append(dwarf.gpa, .{1684 try dwarf.debug_line.section.getUnit(wip_nav.unit).getEntry(wip_nav.entry).cross_section_relocs.append(dwarf.gpa, .{
1691 .source_off = @intCast(dlbw.count),1685 .source_off = @intCast(wip_nav.debug_line.items.len),
1692 .target_sec = .debug_info,1686 .target_sec = .debug_info,
1693 .target_unit = new_unit,1687 .target_unit = new_unit,
1694 .target_entry = new_nav_gop.value_ptr.toOptional(),1688 .target_entry = new_nav_gop.value_ptr.toOptional(),
1695 });1689 });
1696 try dlbw.splatByteAll(0, dwarf.sectionOffsetBytes());1690 try dlw.writeByteNTimes(0, dwarf.sectionOffsetBytes());
1697 return;1691 return;
1698 }1692 }
16991693
...@@ -1704,49 +1698,42 @@ pub const WipNav = struct {...@@ -1704,49 +1698,42 @@ pub const WipNav = struct {
1704 try mod_info.dirs.put(dwarf.gpa, new_unit, {});1698 try mod_info.dirs.put(dwarf.gpa, new_unit, {});
1705 const file_gop = try mod_info.files.getOrPut(dwarf.gpa, new_file);1699 const file_gop = try mod_info.files.getOrPut(dwarf.gpa, new_file);
17061700
1707 try dlbw.writeByte(DW.LNS.set_file);1701 try dlw.writeByte(DW.LNS.set_file);
1708 try dlbw.writeLeb128(file_gop.index);1702 try uleb128(dlw, file_gop.index);
1709 }1703 }
17101704
1711 const old_src_line: i33 = zcu.navSrcLine(old_func_info.owner_nav);1705 const old_src_line: i33 = zcu.navSrcLine(old_func_info.owner_nav);
1712 const new_src_line: i33 = zcu.navSrcLine(new_func_info.owner_nav);1706 const new_src_line: i33 = zcu.navSrcLine(new_func_info.owner_nav);
1713 if (new_src_line != old_src_line) {1707 if (new_src_line != old_src_line) {
1714 try dlbw.writeByte(DW.LNS.advance_line);1708 try dlw.writeByte(DW.LNS.advance_line);
1715 try dlbw.writeLeb128(new_src_line - old_src_line);1709 try sleb128(dlw, new_src_line - old_src_line);
1716 }1710 }
17171711
1718 wip_nav.func = func;1712 wip_nav.func = func;
1719 }1713 }
17201714
1721 fn externalReloc(wip_nav: *WipNav, sec: *Section, reloc: ExternalReloc) Allocator.Error!void {1715 fn externalReloc(wip_nav: *WipNav, sec: *Section, reloc: ExternalReloc) std.mem.Allocator.Error!void {
1722 try sec.getUnit(wip_nav.unit).getEntry(wip_nav.entry).external_relocs.append(wip_nav.dwarf.gpa, reloc);1716 try sec.getUnit(wip_nav.unit).getEntry(wip_nav.entry).external_relocs.append(wip_nav.dwarf.gpa, reloc);
1723 }1717 }
17241718
1725 pub fn infoExternalReloc(wip_nav: *WipNav, reloc: ExternalReloc) Allocator.Error!void {1719 pub fn infoExternalReloc(wip_nav: *WipNav, reloc: ExternalReloc) std.mem.Allocator.Error!void {
1726 try wip_nav.externalReloc(&wip_nav.dwarf.debug_info.section, reloc);1720 try wip_nav.externalReloc(&wip_nav.dwarf.debug_info.section, reloc);
1727 }1721 }
17281722
1729 fn frameExternalReloc(wip_nav: *WipNav, reloc: ExternalReloc) Allocator.Error!void {1723 fn frameExternalReloc(wip_nav: *WipNav, reloc: ExternalReloc) std.mem.Allocator.Error!void {
1730 try wip_nav.externalReloc(&wip_nav.dwarf.debug_frame.section, reloc);1724 try wip_nav.externalReloc(&wip_nav.dwarf.debug_frame.section, reloc);
1731 }1725 }
17321726
1733 fn abbrevCode(wip_nav: *WipNav, abbrev_code: AbbrevCode) UpdateError!void {1727 fn abbrevCode(wip_nav: *WipNav, abbrev_code: AbbrevCode) UpdateError!void {
1734 try wip_nav.debug_info.buffered_writer.writeLeb128(try wip_nav.dwarf.refAbbrevCode(abbrev_code));1728 try uleb128(wip_nav.debug_info.writer(wip_nav.dwarf.gpa), try wip_nav.dwarf.refAbbrevCode(abbrev_code));
1735 }1729 }
17361730
1737 fn sectionOffset(1731 fn sectionOffset(wip_nav: *WipNav, comptime sec: Section.Index, target_sec: Section.Index, target_unit: Unit.Index, target_entry: Entry.Index, target_off: u32) UpdateError!void {
1738 wip_nav: *WipNav,
1739 comptime sec: Section.Index,
1740 target_sec: Section.Index,
1741 target_unit: Unit.Index,
1742 target_entry: Entry.Index,
1743 target_off: u32,
1744 ) UpdateError!void {
1745 const dwarf = wip_nav.dwarf;1732 const dwarf = wip_nav.dwarf;
1746 const gpa = dwarf.gpa;1733 const gpa = dwarf.gpa;
1747 const entry_ptr = @field(dwarf, @tagName(sec)).section.getUnit(wip_nav.unit).getEntry(wip_nav.entry);1734 const entry_ptr = @field(dwarf, @tagName(sec)).section.getUnit(wip_nav.unit).getEntry(wip_nav.entry);
1748 const bw = &@field(wip_nav, @tagName(sec)).buffered_writer;1735 const bytes = &@field(wip_nav, @tagName(sec));
1749 const source_off: u32 = @intCast(bw.count);1736 const source_off: u32 = @intCast(bytes.items.len);
1750 if (target_sec != sec) {1737 if (target_sec != sec) {
1751 try entry_ptr.cross_section_relocs.append(gpa, .{1738 try entry_ptr.cross_section_relocs.append(gpa, .{
1752 .source_off = source_off,1739 .source_off = source_off,
...@@ -1769,7 +1756,7 @@ pub const WipNav = struct {...@@ -1769,7 +1756,7 @@ pub const WipNav = struct {
1769 .target_off = target_off,1756 .target_off = target_off,
1770 });1757 });
1771 }1758 }
1772 try bw.splatByteAll(0, dwarf.sectionOffsetBytes());1759 try bytes.appendNTimes(gpa, 0, dwarf.sectionOffsetBytes());
1773 }1760 }
17741761
1775 fn infoSectionOffset(wip_nav: *WipNav, target_sec: Section.Index, target_unit: Unit.Index, target_entry: Entry.Index, target_off: u32) UpdateError!void {1762 fn infoSectionOffset(wip_nav: *WipNav, target_sec: Section.Index, target_unit: Unit.Index, target_entry: Entry.Index, target_off: u32) UpdateError!void {
...@@ -1781,93 +1768,93 @@ pub const WipNav = struct {...@@ -1781,93 +1768,93 @@ pub const WipNav = struct {
1781 }1768 }
17821769
1783 const ExprLocCounter = struct {1770 const ExprLocCounter = struct {
1771 const Stream = std.io.CountingWriter(std.io.NullWriter);
1772 stream: Stream,
1784 section_offset_bytes: u32,1773 section_offset_bytes: u32,
1785 address_size: AddressSize,1774 address_size: AddressSize,
1786 fn init(dwarf: *Dwarf) ExprLocCounter {1775 fn init(dwarf: *Dwarf) ExprLocCounter {
1787 return .{1776 return .{
1777 .stream = std.io.countingWriter(std.io.null_writer),
1788 .section_offset_bytes = dwarf.sectionOffsetBytes(),1778 .section_offset_bytes = dwarf.sectionOffsetBytes(),
1789 .address_size = dwarf.address_size,1779 .address_size = dwarf.address_size,
1790 };1780 };
1791 }1781 }
1782 fn writer(counter: *ExprLocCounter) Stream.Writer {
1783 return counter.stream.writer();
1784 }
1792 fn endian(_: ExprLocCounter) std.builtin.Endian {1785 fn endian(_: ExprLocCounter) std.builtin.Endian {
1793 return @import("builtin").cpu.arch.endian();1786 return @import("builtin").cpu.arch.endian();
1794 }1787 }
1795 fn addrSym(counter: ExprLocCounter, bw: *Writer, _: u32) error{}!void {1788 fn addrSym(counter: *ExprLocCounter, _: u32) error{}!void {
1796 bw.count += @intFromEnum(counter.address_size);1789 counter.stream.bytes_written += @intFromEnum(counter.address_size);
1797 }1790 }
1798 fn infoEntry(counter: ExprLocCounter, bw: *Writer, _: Unit.Index, _: Entry.Index) error{}!void {1791 fn infoEntry(counter: *ExprLocCounter, _: Unit.Index, _: Entry.Index) error{}!void {
1799 bw.count += counter.section_offset_bytes;1792 counter.stream.bytes_written += counter.section_offset_bytes;
1800 }1793 }
1801 };1794 };
18021795
1803 fn infoExprLoc(wip_nav: *WipNav, loc: Loc) UpdateError!void {1796 fn infoExprLoc(wip_nav: *WipNav, loc: Loc) UpdateError!void {
1804 const bw = &wip_nav.debug_info.buffered_writer;1797 var counter: ExprLocCounter = .init(wip_nav.dwarf);
1805 const counter: ExprLocCounter = .init(wip_nav.dwarf);1798 try loc.write(&counter);
1806 const start = bw.count;
1807 try loc.write(bw, counter);
1808 const len = bw.count - start;
1809 bw.count = start;
1810 wip_nav.debug_info.shrinkRetainingCapacity(start);
18111799
1812 const adapter: struct {1800 const adapter: struct {
1813 wip_nav: *WipNav,1801 wip_nav: *WipNav,
1802 fn writer(ctx: @This()) std.ArrayListUnmanaged(u8).Writer {
1803 return ctx.wip_nav.debug_info.writer(ctx.wip_nav.dwarf.gpa);
1804 }
1814 fn endian(ctx: @This()) std.builtin.Endian {1805 fn endian(ctx: @This()) std.builtin.Endian {
1815 return ctx.wip_nav.dwarf.endian;1806 return ctx.wip_nav.dwarf.endian;
1816 }1807 }
1817 fn addrSym(ctx: @This(), _: *Writer, sym_index: u32) UpdateError!void {1808 fn addrSym(ctx: @This(), sym_index: u32) UpdateError!void {
1818 try ctx.wip_nav.infoAddrSym(sym_index, 0);1809 try ctx.wip_nav.infoAddrSym(sym_index, 0);
1819 }1810 }
1820 fn infoEntry(ctx: @This(), _: *Writer, unit: Unit.Index, entry: Entry.Index) UpdateError!void {1811 fn infoEntry(ctx: @This(), unit: Unit.Index, entry: Entry.Index) UpdateError!void {
1821 try ctx.wip_nav.infoSectionOffset(.debug_info, unit, entry, 0);1812 try ctx.wip_nav.infoSectionOffset(.debug_info, unit, entry, 0);
1822 }1813 }
1823 } = .{ .wip_nav = wip_nav };1814 } = .{ .wip_nav = wip_nav };
1824 try bw.writeLeb128(len);1815 try uleb128(adapter.writer(), counter.stream.bytes_written);
1825 try loc.write(bw, adapter);1816 try loc.write(adapter);
1826 }1817 }
18271818
1828 fn infoAddrSym(wip_nav: *WipNav, sym_index: u32, sym_off: u64) UpdateError!void {1819 fn infoAddrSym(wip_nav: *WipNav, sym_index: u32, sym_off: u64) UpdateError!void {
1829 const dibw = &wip_nav.debug_info.buffered_writer;
1830 try wip_nav.infoExternalReloc(.{1820 try wip_nav.infoExternalReloc(.{
1831 .source_off = @intCast(dibw.count),1821 .source_off = @intCast(wip_nav.debug_info.items.len),
1832 .target_sym = sym_index,1822 .target_sym = sym_index,
1833 .target_off = sym_off,1823 .target_off = sym_off,
1834 });1824 });
1835 try dibw.splatByteAll(0, @intFromEnum(wip_nav.dwarf.address_size));1825 try wip_nav.debug_info.appendNTimes(wip_nav.dwarf.gpa, 0, @intFromEnum(wip_nav.dwarf.address_size));
1836 }1826 }
18371827
1838 fn frameExprLoc(wip_nav: *WipNav, loc: Loc) UpdateError!void {1828 fn frameExprLoc(wip_nav: *WipNav, loc: Loc) UpdateError!void {
1839 const bw = &wip_nav.debug_frame.buffered_writer;1829 var counter: ExprLocCounter = .init(wip_nav.dwarf);
1840 const counter: ExprLocCounter = .init(wip_nav.dwarf);1830 try loc.write(&counter);
1841 const start = bw.count;
1842 try loc.write(bw, counter);
1843 const len = bw.count - start;
1844 bw.count = start;
1845 wip_nav.debug_frame.shrinkRetainingCapacity(start);
18461831
1847 const adapter: struct {1832 const adapter: struct {
1848 wip_nav: *WipNav,1833 wip_nav: *WipNav,
1834 fn writer(ctx: @This()) std.ArrayListUnmanaged(u8).Writer {
1835 return ctx.wip_nav.debug_frame.writer(ctx.wip_nav.dwarf.gpa);
1836 }
1849 fn endian(ctx: @This()) std.builtin.Endian {1837 fn endian(ctx: @This()) std.builtin.Endian {
1850 return ctx.wip_nav.dwarf.endian;1838 return ctx.wip_nav.dwarf.endian;
1851 }1839 }
1852 fn addrSym(ctx: @This(), _: *Writer, sym_index: u32) UpdateError!void {1840 fn addrSym(ctx: @This(), sym_index: u32) UpdateError!void {
1853 try ctx.wip_nav.frameAddrSym(sym_index, 0);1841 try ctx.wip_nav.frameAddrSym(sym_index, 0);
1854 }1842 }
1855 fn infoEntry(ctx: @This(), _: *Writer, unit: Unit.Index, entry: Entry.Index) UpdateError!void {1843 fn infoEntry(ctx: @This(), unit: Unit.Index, entry: Entry.Index) UpdateError!void {
1856 try ctx.wip_nav.sectionOffset(.debug_frame, .debug_info, unit, entry, 0);1844 try ctx.wip_nav.sectionOffset(.debug_frame, .debug_info, unit, entry, 0);
1857 }1845 }
1858 } = .{ .wip_nav = wip_nav };1846 } = .{ .wip_nav = wip_nav };
1859 try bw.writeLeb128(len);1847 try uleb128(adapter.writer(), counter.stream.bytes_written);
1860 try loc.write(bw, adapter);1848 try loc.write(adapter);
1861 }1849 }
18621850
1863 fn frameAddrSym(wip_nav: *WipNav, sym_index: u32, sym_off: u64) UpdateError!void {1851 fn frameAddrSym(wip_nav: *WipNav, sym_index: u32, sym_off: u64) UpdateError!void {
1864 const dfbw = &wip_nav.debug_frame.buffered_writer;
1865 try wip_nav.frameExternalReloc(.{1852 try wip_nav.frameExternalReloc(.{
1866 .source_off = @intCast(dfbw.count),1853 .source_off = @intCast(wip_nav.debug_frame.items.len),
1867 .target_sym = sym_index,1854 .target_sym = sym_index,
1868 .target_off = sym_off,1855 .target_off = sym_off,
1869 });1856 });
1870 try dfbw.splatByteAll(0, @intFromEnum(wip_nav.dwarf.address_size));1857 try wip_nav.debug_frame.appendNTimes(wip_nav.dwarf.gpa, 0, @intFromEnum(wip_nav.dwarf.address_size));
1871 }1858 }
18721859
1873 fn getNavEntry(wip_nav: *WipNav, nav_index: InternPool.Nav.Index) UpdateError!struct { Unit.Index, Entry.Index } {1860 fn getNavEntry(wip_nav: *WipNav, nav_index: InternPool.Nav.Index) UpdateError!struct { Unit.Index, Entry.Index } {
...@@ -1935,41 +1922,38 @@ pub const WipNav = struct {...@@ -1935,41 +1922,38 @@ pub const WipNav = struct {
1935 try wip_nav.infoSectionOffset(.debug_info, unit, entry, 0);1922 try wip_nav.infoSectionOffset(.debug_info, unit, entry, 0);
1936 }1923 }
19371924
1938 fn refForward(wip_nav: *WipNav) Allocator.Error!u32 {1925 fn refForward(wip_nav: *WipNav) std.mem.Allocator.Error!u32 {
1939 const dwarf = wip_nav.dwarf;1926 const dwarf = wip_nav.dwarf;
1940 const dibw = &wip_nav.debug_info.buffered_writer;
1941 const cross_entry_relocs = &dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(wip_nav.entry).cross_entry_relocs;1927 const cross_entry_relocs = &dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(wip_nav.entry).cross_entry_relocs;
1942 const reloc_index: u32 = @intCast(cross_entry_relocs.items.len);1928 const reloc_index: u32 = @intCast(cross_entry_relocs.items.len);
1943 try cross_entry_relocs.append(dwarf.gpa, .{1929 try cross_entry_relocs.append(dwarf.gpa, .{
1944 .source_off = @intCast(dibw.count),1930 .source_off = @intCast(wip_nav.debug_info.items.len),
1945 .target_entry = undefined,1931 .target_entry = undefined,
1946 .target_off = undefined,1932 .target_off = undefined,
1947 });1933 });
1948 try dibw.splatByteAll(0, dwarf.sectionOffsetBytes());1934 try wip_nav.debug_info.appendNTimes(dwarf.gpa, 0, dwarf.sectionOffsetBytes());
1949 return reloc_index;1935 return reloc_index;
1950 }1936 }
19511937
1952 fn finishForward(wip_nav: *WipNav, reloc_index: u32) void {1938 fn finishForward(wip_nav: *WipNav, reloc_index: u32) void {
1953 const reloc = &wip_nav.dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(wip_nav.entry).cross_entry_relocs.items[reloc_index];1939 const reloc = &wip_nav.dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(wip_nav.entry).cross_entry_relocs.items[reloc_index];
1954 reloc.target_entry = wip_nav.entry.toOptional();1940 reloc.target_entry = wip_nav.entry.toOptional();
1955 reloc.target_off = @intCast(wip_nav.debug_info.buffered_writer.count);1941 reloc.target_off = @intCast(wip_nav.debug_info.items.len);
1956 }1942 }
19571943
1958 fn blockValue(wip_nav: *WipNav, src_loc: Zcu.LazySrcLoc, val: Value) UpdateError!void {1944 fn blockValue(wip_nav: *WipNav, src_loc: Zcu.LazySrcLoc, val: Value) UpdateError!void {
1959 const ty = val.typeOf(wip_nav.pt.zcu);1945 const ty = val.typeOf(wip_nav.pt.zcu);
1960 const dibw = &wip_nav.debug_info.buffered_writer;1946 const diw = wip_nav.debug_info.writer(wip_nav.dwarf.gpa);
1961 const bytes = if (ty.hasRuntimeBits(wip_nav.pt.zcu)) ty.abiSize(wip_nav.pt.zcu) else 0;1947 const bytes = if (ty.hasRuntimeBits(wip_nav.pt.zcu)) ty.abiSize(wip_nav.pt.zcu) else 0;
1962 try dibw.writeLeb128(bytes);1948 try uleb128(diw, bytes);
1963 if (bytes == 0) return;1949 if (bytes == 0) return;
1964 var dial = wip_nav.debug_info.toArrayList();1950 const old_len = wip_nav.debug_info.items.len;
1965 defer _ = wip_nav.debug_info.fromArrayList(wip_nav.dwarf.gpa, &dial);
1966 const old_len = dial.items.len;
1967 try codegen.generateSymbol(1951 try codegen.generateSymbol(
1968 wip_nav.dwarf.bin_file,1952 wip_nav.dwarf.bin_file,
1969 wip_nav.pt,1953 wip_nav.pt,
1970 src_loc,1954 src_loc,
1971 val,1955 val,
1972 &dial,1956 &wip_nav.debug_info,
1973 .{ .debug_output = .{ .dwarf = wip_nav } },1957 .{ .debug_output = .{ .dwarf = wip_nav } },
1974 );1958 );
1975 if (old_len + bytes != wip_nav.debug_info.items.len) {1959 if (old_len + bytes != wip_nav.debug_info.items.len) {
...@@ -1991,7 +1975,7 @@ pub const WipNav = struct {...@@ -1991,7 +1975,7 @@ pub const WipNav = struct {
1991 big_int: std.math.big.int.Const,1975 big_int: std.math.big.int.Const,
1992 ) UpdateError!void {1976 ) UpdateError!void {
1993 const zcu = wip_nav.pt.zcu;1977 const zcu = wip_nav.pt.zcu;
1994 const dibw = &wip_nav.debug_info.buffered_writer;1978 const diw = wip_nav.debug_info.writer(wip_nav.dwarf.gpa);
1995 const signedness = switch (ty.toIntern()) {1979 const signedness = switch (ty.toIntern()) {
1996 .comptime_int_type, .comptime_float_type => .signed,1980 .comptime_int_type, .comptime_float_type => .signed,
1997 else => ty.intInfo(zcu).signedness,1981 else => ty.intInfo(zcu).signedness,
...@@ -2002,7 +1986,7 @@ pub const WipNav = struct {...@@ -2002,7 +1986,7 @@ pub const WipNav = struct {
2002 .signed => abbrev_code.sdata,1986 .signed => abbrev_code.sdata,
2003 .unsigned => abbrev_code.udata,1987 .unsigned => abbrev_code.udata,
2004 });1988 });
2005 _ = try dibw.writableSliceGreedy(std.math.divCeil(usize, bits, 7) catch unreachable);1989 try wip_nav.debug_info.ensureUnusedCapacity(wip_nav.dwarf.gpa, std.math.divCeil(usize, bits, 7) catch unreachable);
2006 var bit: usize = 0;1990 var bit: usize = 0;
2007 var carry: u1 = 1;1991 var carry: u1 = 1;
2008 while (bit < bits) {1992 while (bit < bits) {
...@@ -2019,17 +2003,16 @@ pub const WipNav = struct {...@@ -2019,17 +2003,16 @@ pub const WipNav = struct {
2019 break :twos_comp_part twos_comp_part;2003 break :twos_comp_part twos_comp_part;
2020 };2004 };
2021 bit += 7;2005 bit += 7;
2022 dibw.writeByte(@as(u8, if (bit < bits) 0x80 else 0x00) | twos_comp_part) catch unreachable;2006 wip_nav.debug_info.appendAssumeCapacity(@as(u8, if (bit < bits) 0x80 else 0x00) | twos_comp_part);
2023 }2007 }
2024 } else {2008 } else {
2025 try wip_nav.abbrevCode(abbrev_code.block);2009 try wip_nav.abbrevCode(abbrev_code.block);
2026 const bytes = @max(ty.abiSize(zcu), std.math.divCeil(usize, bits, 8) catch unreachable);2010 const bytes = @max(ty.abiSize(zcu), std.math.divCeil(usize, bits, 8) catch unreachable);
2027 try dibw.writeLeb128(bytes);2011 try uleb128(diw, bytes);
2028 big_int.writeTwosComplement(2012 big_int.writeTwosComplement(
2029 try dibw.writableSliceGreedy(@intCast(bytes)),2013 try wip_nav.debug_info.addManyAsSlice(wip_nav.dwarf.gpa, @intCast(bytes)),
2030 wip_nav.dwarf.endian,2014 wip_nav.dwarf.endian,
2031 );2015 );
2032 dibw.advance(@intCast(bytes));
2033 }2016 }
2034 }2017 }
20352018
...@@ -2062,7 +2045,7 @@ pub const WipNav = struct {...@@ -2062,7 +2045,7 @@ pub const WipNav = struct {
2062 const zcu = wip_nav.pt.zcu;2045 const zcu = wip_nav.pt.zcu;
2063 const ip = &zcu.intern_pool;2046 const ip = &zcu.intern_pool;
2064 const dwarf = wip_nav.dwarf;2047 const dwarf = wip_nav.dwarf;
2065 const dibw = &wip_nav.debug_info.buffered_writer;2048 const diw = wip_nav.debug_info.writer(dwarf.gpa);
20662049
2067 const orig_entry = wip_nav.entry;2050 const orig_entry = wip_nav.entry;
2068 defer wip_nav.entry = orig_entry;2051 defer wip_nav.entry = orig_entry;
...@@ -2113,15 +2096,15 @@ pub const WipNav = struct {...@@ -2113,15 +2096,15 @@ pub const WipNav = struct {
2113 try wip_nav.abbrevCode(if (is_generic_decl) abbrev_code.generic_decl else abbrev_code.decl);2096 try wip_nav.abbrevCode(if (is_generic_decl) abbrev_code.generic_decl else abbrev_code.decl);
2114 try wip_nav.refType((if (is_generic_decl) null else parent_type) orelse2097 try wip_nav.refType((if (is_generic_decl) null else parent_type) orelse
2115 .fromInterned(zcu.fileRootType(file)));2098 .fromInterned(zcu.fileRootType(file)));
2116 assert(dibw.count == DebugInfo.declEntryLineOff(dwarf));2099 assert(wip_nav.debug_info.items.len == DebugInfo.declEntryLineOff(dwarf));
2117 try dibw.writeInt(u32, decl.src_line + 1, dwarf.endian);2100 try diw.writeInt(u32, decl.src_line + 1, dwarf.endian);
2118 try dibw.writeLeb128(decl.src_column + 1);2101 try uleb128(diw, decl.src_column + 1);
2119 try dibw.writeByte(if (decl.is_pub) DW.ACCESS.public else DW.ACCESS.private);2102 try diw.writeByte(if (decl.is_pub) DW.ACCESS.public else DW.ACCESS.private);
2120 try wip_nav.strp(nav.name.toSlice(ip));2103 try wip_nav.strp(nav.name.toSlice(ip));
21212104
2122 if (!is_generic_decl) return;2105 if (!is_generic_decl) return;
2123 const generic_decl_entry = wip_nav.entry;2106 const generic_decl_entry = wip_nav.entry;
2124 try dwarf.debug_info.section.replaceEntry(wip_nav.unit, generic_decl_entry, dwarf, wip_nav.debug_info.getWritten());2107 try dwarf.debug_info.section.replaceEntry(wip_nav.unit, generic_decl_entry, dwarf, wip_nav.debug_info.items);
2125 wip_nav.debug_info.clearRetainingCapacity();2108 wip_nav.debug_info.clearRetainingCapacity();
2126 wip_nav.entry = orig_entry;2109 wip_nav.entry = orig_entry;
2127 try wip_nav.abbrevCode(abbrev_code.decl_instance);2110 try wip_nav.abbrevCode(abbrev_code.decl_instance);
...@@ -2425,63 +2408,12 @@ pub fn initWipNav(...@@ -2425,63 +2408,12 @@ pub fn initWipNav(
2425 nav_index: InternPool.Nav.Index,2408 nav_index: InternPool.Nav.Index,
2426 sym_index: u32,2409 sym_index: u32,
2427) error{ OutOfMemory, CodegenFail }!?WipNav {2410) error{ OutOfMemory, CodegenFail }!?WipNav {
2428 return dwarf.initWipNavInner(pt, nav_index, sym_index) catch |err| switch (err) {2411 return initWipNavInner(dwarf, pt, nav_index, sym_index) catch |err| switch (err) {
2429 error.OutOfMemory => return error.OutOfMemory,
2430 else => |e| return pt.zcu.codegenFail(nav_index, "failed to init dwarf nav: {s}", .{@errorName(e)}),
2431 };
2432}
2433
2434pub fn finishWipNavFunc(
2435 dwarf: *Dwarf,
2436 pt: Zcu.PerThread,
2437 nav_index: InternPool.Nav.Index,
2438 code_size: u64,
2439 wip_nav: *WipNav,
2440) error{ OutOfMemory, CodegenFail }!void {
2441 return dwarf.finishWipNavFuncInner(pt, nav_index, code_size, wip_nav) catch |err| switch (err) {
2442 error.OutOfMemory => return error.OutOfMemory,
2443 else => |e| return pt.zcu.codegenFail(nav_index, "failed to finish dwarf func nav: {s}", .{@errorName(e)}),
2444 };
2445}
2446
2447pub fn finishWipNav(
2448 dwarf: *Dwarf,
2449 pt: Zcu.PerThread,
2450 nav_index: InternPool.Nav.Index,
2451 wip_nav: *WipNav,
2452) error{ OutOfMemory, CodegenFail }!void {
2453 return dwarf.finishWipNavInner(pt, nav_index, wip_nav) catch |err| switch (err) {
2454 error.OutOfMemory => return error.OutOfMemory,
2455 else => |e| return pt.zcu.codegenFail(nav_index, "failed to finish dwarf nav: {s}", .{@errorName(e)}),
2456 };
2457}
2458
2459pub fn updateComptimeNav(
2460 dwarf: *Dwarf,
2461 pt: Zcu.PerThread,
2462 nav_index: InternPool.Nav.Index,
2463) error{ OutOfMemory, CodegenFail }!void {
2464 return dwarf.updateComptimeNavInner(pt, nav_index) catch |err| switch (err) {
2465 error.OutOfMemory => return error.OutOfMemory,
2466 else => |e| return pt.zcu.codegenFail(nav_index, "failed to update dwarf comptime nav: {s}", .{@errorName(e)}),
2467 };
2468}
2469
2470pub fn updateContainerType(
2471 dwarf: *Dwarf,
2472 pt: Zcu.PerThread,
2473 type_index: InternPool.Index,
2474) error{ OutOfMemory, CodegenFail }!void {
2475 return dwarf.updateContainerType(pt, type_index) catch |err| switch (err) {
2476 error.OutOfMemory => return error.OutOfMemory,2412 error.OutOfMemory => return error.OutOfMemory,
2477 else => |e| return pt.zcu.codegenFailType(type_index, "failed to update dwarf comptime nav: {s}", .{@errorName(e)}),2413 else => |e| return pt.zcu.codegenFail(nav_index, "failed to init dwarf: {s}", .{@errorName(e)}),
2478 };2414 };
2479}2415}
24802416
2481pub fn flushModule(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {
2482 return dwarf.flushModuleInner(pt);
2483}
2484
2485fn initWipNavInner(2417fn initWipNavInner(
2486 dwarf: *Dwarf,2418 dwarf: *Dwarf,
2487 pt: Zcu.PerThread,2419 pt: Zcu.PerThread,
...@@ -2536,17 +2468,17 @@ fn initWipNavInner(...@@ -2536,17 +2468,17 @@ fn initWipNavInner(
2536 .func_high_pc = undefined,2468 .func_high_pc = undefined,
2537 .blocks = undefined,2469 .blocks = undefined,
2538 .cfi = undefined,2470 .cfi = undefined,
2539 .debug_frame = undefined,2471 .debug_frame = .empty,
2540 .debug_info = undefined,2472 .debug_info = .empty,
2541 .debug_line = undefined,2473 .debug_line = .empty,
2542 .debug_loclists = undefined,2474 .debug_loclists = .empty,
2543 .pending_lazy = .empty,2475 .pending_lazy = .empty,
2544 };2476 };
2545 errdefer wip_nav.deinit();2477 errdefer wip_nav.deinit();
25462478
2547 switch (nav_key) {2479 switch (nav_key) {
2548 else => {2480 else => {
2549 const dibw = &wip_nav.debug_info.buffered_writer;2481 const diw = wip_nav.debug_info.writer(dwarf.gpa);
2550 try wip_nav.declCommon(.{2482 try wip_nav.declCommon(.{
2551 .decl = .decl_var,2483 .decl = .decl_var,
2552 .generic_decl = .generic_decl_var,2484 .generic_decl = .generic_decl_var,
...@@ -2567,9 +2499,9 @@ fn initWipNavInner(...@@ -2567,9 +2499,9 @@ fn initWipNavInner(
2567 .@"const" => {2499 .@"const" => {
2568 const const_ty_reloc_index = try wip_nav.refForward();2500 const const_ty_reloc_index = try wip_nav.refForward();
2569 try wip_nav.infoExprLoc(loc);2501 try wip_nav.infoExprLoc(loc);
2570 try dibw.writeLeb128(nav.status.fully_resolved.alignment.toByteUnits() orelse2502 try uleb128(diw, nav.status.fully_resolved.alignment.toByteUnits() orelse
2571 ty.abiAlignment(zcu).toByteUnits().?);2503 ty.abiAlignment(zcu).toByteUnits().?);
2572 try dibw.writeByte(@intFromBool(decl.linkage != .normal));2504 try diw.writeByte(@intFromBool(decl.linkage != .normal));
2573 wip_nav.finishForward(const_ty_reloc_index);2505 wip_nav.finishForward(const_ty_reloc_index);
2574 try wip_nav.abbrevCode(.is_const);2506 try wip_nav.abbrevCode(.is_const);
2575 try wip_nav.refType(ty);2507 try wip_nav.refType(ty);
...@@ -2577,9 +2509,9 @@ fn initWipNavInner(...@@ -2577,9 +2509,9 @@ fn initWipNavInner(
2577 .@"var" => {2509 .@"var" => {
2578 try wip_nav.refType(ty);2510 try wip_nav.refType(ty);
2579 try wip_nav.infoExprLoc(loc);2511 try wip_nav.infoExprLoc(loc);
2580 try dibw.writeLeb128(dibw, nav.status.fully_resolved.alignment.toByteUnits() orelse2512 try uleb128(diw, nav.status.fully_resolved.alignment.toByteUnits() orelse
2581 ty.abiAlignment(zcu).toByteUnits().?);2513 ty.abiAlignment(zcu).toByteUnits().?);
2582 try dibw.writeByte(@intFromBool(decl.linkage != .normal));2514 try diw.writeByte(@intFromBool(decl.linkage != .normal));
2583 },2515 },
2584 }2516 }
2585 },2517 },
...@@ -2604,39 +2536,39 @@ fn initWipNavInner(...@@ -2604,39 +2536,39 @@ fn initWipNavInner(
2604 .none => {},2536 .none => {},
2605 .debug_frame, .eh_frame => |format| {2537 .debug_frame, .eh_frame => |format| {
2606 const entry = dwarf.debug_frame.section.getUnit(wip_nav.unit).getEntry(wip_nav.entry);2538 const entry = dwarf.debug_frame.section.getUnit(wip_nav.unit).getEntry(wip_nav.entry);
2607 const dfbw = &wip_nav.debug_frame.buffered_writer;2539 const dfw = wip_nav.debug_frame.writer(dwarf.gpa);
2608 switch (dwarf.format) {2540 switch (dwarf.format) {
2609 .@"32" => try dfbw.writeInt(u32, undefined, dwarf.endian),2541 .@"32" => try dfw.writeInt(u32, undefined, dwarf.endian),
2610 .@"64" => {2542 .@"64" => {
2611 try dfbw.writeInt(u32, std.math.maxInt(u32), dwarf.endian);2543 try dfw.writeInt(u32, std.math.maxInt(u32), dwarf.endian);
2612 try dfbw.writeInt(u64, undefined, dwarf.endian);2544 try dfw.writeInt(u64, undefined, dwarf.endian);
2613 },2545 },
2614 }2546 }
2615 switch (format) {2547 switch (format) {
2616 .none => unreachable,2548 .none => unreachable,
2617 .debug_frame => {2549 .debug_frame => {
2618 try entry.cross_entry_relocs.append(dwarf.gpa, .{2550 try entry.cross_entry_relocs.append(dwarf.gpa, .{
2619 .source_off = @intCast(dfbw.count),2551 .source_off = @intCast(wip_nav.debug_frame.items.len),
2620 });2552 });
2621 try dfbw.splatByteAll(0, dwarf.sectionOffsetBytes());2553 try dfw.writeByteNTimes(0, dwarf.sectionOffsetBytes());
2622 try wip_nav.frameAddrSym(sym_index, 0);2554 try wip_nav.frameAddrSym(sym_index, 0);
2623 try dfbw.splatByteAll(undefined, @intFromEnum(dwarf.address_size));2555 try dfw.writeByteNTimes(undefined, @intFromEnum(dwarf.address_size));
2624 },2556 },
2625 .eh_frame => {2557 .eh_frame => {
2626 try dfbw.writeInt(u32, undefined, dwarf.endian);2558 try dfw.writeInt(u32, undefined, dwarf.endian);
2627 try wip_nav.frameExternalReloc(.{2559 try wip_nav.frameExternalReloc(.{
2628 .source_off = @intCast(dfbw.count),2560 .source_off = @intCast(wip_nav.debug_frame.items.len),
2629 .target_sym = sym_index,2561 .target_sym = sym_index,
2630 });2562 });
2631 try dfbw.writeInt(u32, 0, dwarf.endian);2563 try dfw.writeInt(u32, 0, dwarf.endian);
2632 try dfbw.writeInt(u32, undefined, dwarf.endian);2564 try dfw.writeInt(u32, undefined, dwarf.endian);
2633 try dfbw.writeUleb128(0);2565 try uleb128(dfw, 0);
2634 },2566 },
2635 }2567 }
2636 },2568 },
2637 }2569 }
26382570
2639 const dibw = &wip_nav.debug_info.buffered_writer;2571 const diw = wip_nav.debug_info.writer(dwarf.gpa);
2640 try wip_nav.declCommon(.{2572 try wip_nav.declCommon(.{
2641 .decl = .decl_func,2573 .decl = .decl_func,
2642 .generic_decl = .generic_decl_func,2574 .generic_decl = .generic_decl_func,
...@@ -2646,47 +2578,47 @@ fn initWipNavInner(...@@ -2646,47 +2578,47 @@ fn initWipNavInner(
2646 try wip_nav.refType(.fromInterned(func_type.return_type));2578 try wip_nav.refType(.fromInterned(func_type.return_type));
2647 try wip_nav.infoAddrSym(sym_index, 0);2579 try wip_nav.infoAddrSym(sym_index, 0);
2648 wip_nav.func_high_pc = @intCast(wip_nav.debug_info.items.len);2580 wip_nav.func_high_pc = @intCast(wip_nav.debug_info.items.len);
2649 try dibw.writeInt(u32, 0, dwarf.endian);2581 try diw.writeInt(u32, 0, dwarf.endian);
2650 const target = &mod.resolved_target.result;2582 const target = &mod.resolved_target.result;
2651 try dibw.writeLeb128(switch (nav.status.fully_resolved.alignment) {2583 try uleb128(diw, switch (nav.status.fully_resolved.alignment) {
2652 .none => target_info.defaultFunctionAlignment(target),2584 .none => target_info.defaultFunctionAlignment(target),
2653 else => |a| a.maxStrict(target_info.minFunctionAlignment(target)),2585 else => |a| a.maxStrict(target_info.minFunctionAlignment(target)),
2654 }.toByteUnits().?);2586 }.toByteUnits().?);
2655 try dibw.writeByte(@intFromBool(decl.linkage != .normal));2587 try diw.writeByte(@intFromBool(decl.linkage != .normal));
2656 try dibw.writeByte(@intFromBool(func_type.return_type == .noreturn_type));2588 try diw.writeByte(@intFromBool(func_type.return_type == .noreturn_type));
26572589
2658 const dlbw = &wip_nav.debug_line.buffered_writer;2590 const dlw = wip_nav.debug_line.writer(dwarf.gpa);
2659 try dlbw.writeByte(DW.LNS.extended_op);2591 try dlw.writeByte(DW.LNS.extended_op);
2660 if (dwarf.incremental()) {2592 if (dwarf.incremental()) {
2661 try dlbw.writeLeb128(1 + dwarf.sectionOffsetBytes());2593 try uleb128(dlw, 1 + dwarf.sectionOffsetBytes());
2662 try dlbw.writeByte(DW.LNE.ZIG_set_decl);2594 try dlw.writeByte(DW.LNE.ZIG_set_decl);
2663 try dwarf.debug_line.section.getUnit(wip_nav.unit).getEntry(wip_nav.entry).cross_section_relocs.append(dwarf.gpa, .{2595 try dwarf.debug_line.section.getUnit(wip_nav.unit).getEntry(wip_nav.entry).cross_section_relocs.append(dwarf.gpa, .{
2664 .source_off = @intCast(dlbw.count),2596 .source_off = @intCast(wip_nav.debug_line.items.len),
2665 .target_sec = .debug_info,2597 .target_sec = .debug_info,
2666 .target_unit = wip_nav.unit,2598 .target_unit = wip_nav.unit,
2667 .target_entry = wip_nav.entry.toOptional(),2599 .target_entry = wip_nav.entry.toOptional(),
2668 });2600 });
2669 try dlbw.splatByteAll(0, dwarf.sectionOffsetBytes());2601 try dlw.writeByteNTimes(0, dwarf.sectionOffsetBytes());
26702602
2671 try dlbw.writeByte(DW.LNS.set_column);2603 try dlw.writeByte(DW.LNS.set_column);
2672 try dlbw.writeLeb128(func.lbrace_column + 1);2604 try uleb128(dlw, func.lbrace_column + 1);
26732605
2674 try wip_nav.advancePCAndLine(func.lbrace_line, 0);2606 try wip_nav.advancePCAndLine(func.lbrace_line, 0);
2675 } else {2607 } else {
2676 try dlbw.writeLeb128(1 + @intFromEnum(dwarf.address_size));2608 try uleb128(dlw, 1 + @intFromEnum(dwarf.address_size));
2677 try dlbw.writeByte(DW.LNE.set_address);2609 try dlw.writeByte(DW.LNE.set_address);
2678 try dwarf.debug_line.section.getUnit(wip_nav.unit).getEntry(wip_nav.entry).external_relocs.append(dwarf.gpa, .{2610 try dwarf.debug_line.section.getUnit(wip_nav.unit).getEntry(wip_nav.entry).external_relocs.append(dwarf.gpa, .{
2679 .source_off = @intCast(dlbw.count),2611 .source_off = @intCast(wip_nav.debug_line.items.len),
2680 .target_sym = sym_index,2612 .target_sym = sym_index,
2681 });2613 });
2682 try dlbw.splatByteAll(0, @intFromEnum(dwarf.address_size));2614 try dlw.writeByteNTimes(0, @intFromEnum(dwarf.address_size));
26832615
2684 const file_gop = try dwarf.getModInfo(unit).files.getOrPut(dwarf.gpa, inst_info.file);2616 const file_gop = try dwarf.getModInfo(unit).files.getOrPut(dwarf.gpa, inst_info.file);
2685 try dlbw.writeByte(DW.LNS.set_file);2617 try dlw.writeByte(DW.LNS.set_file);
2686 try dlbw.writeLeb128(file_gop.index);2618 try uleb128(dlw, file_gop.index);
26872619
2688 try dlbw.writeByte(DW.LNS.set_column);2620 try dlw.writeByte(DW.LNS.set_column);
2689 try dlbw.writeLeb128(func.lbrace_column + 1);2621 try uleb128(dlw, func.lbrace_column + 1);
26902622
2691 try wip_nav.advancePCAndLine(@intCast(decl.src_line + func.lbrace_line), 0);2623 try wip_nav.advancePCAndLine(@intCast(decl.src_line + func.lbrace_line), 0);
2692 }2624 }
...@@ -2695,7 +2627,7 @@ fn initWipNavInner(...@@ -2695,7 +2627,7 @@ fn initWipNavInner(
2695 return wip_nav;2627 return wip_nav;
2696}2628}
26972629
2698fn finishWipNavFuncInner(2630pub fn finishWipNavFunc(
2699 dwarf: *Dwarf,2631 dwarf: *Dwarf,
2700 pt: Zcu.PerThread,2632 pt: Zcu.PerThread,
2701 nav_index: InternPool.Nav.Index,2633 nav_index: InternPool.Nav.Index,
...@@ -2724,9 +2656,12 @@ fn finishWipNavFuncInner(...@@ -2724,9 +2656,12 @@ fn finishWipNavFuncInner(
2724 switch (dwarf.debug_frame.header.format) {2656 switch (dwarf.debug_frame.header.format) {
2725 .none => {},2657 .none => {},
2726 .debug_frame, .eh_frame => |format| {2658 .debug_frame, .eh_frame => |format| {
2727 const dfbw = &wip_nav.debug_frame.buffered_writer;2659 try wip_nav.debug_frame.appendNTimes(
2728 try dfbw.splatByteAll(DW.CFA.nop, @intCast(dwarf.debug_frame.section.alignment.forward(dfbw.count) - dfbw.count));2660 dwarf.gpa,
2729 const contents = wip_nav.debug_frame.getWritten();2661 DW.CFA.nop,
2662 @intCast(dwarf.debug_frame.section.alignment.forward(wip_nav.debug_frame.items.len) - wip_nav.debug_frame.items.len),
2663 );
2664 const contents = wip_nav.debug_frame.items;
2730 try dwarf.debug_frame.section.resizeEntry(wip_nav.unit, wip_nav.entry, dwarf, @intCast(contents.len));2665 try dwarf.debug_frame.section.resizeEntry(wip_nav.unit, wip_nav.entry, dwarf, @intCast(contents.len));
2731 const unit = dwarf.debug_frame.section.getUnit(wip_nav.unit);2666 const unit = dwarf.debug_frame.section.getUnit(wip_nav.unit);
2732 const entry = unit.getEntry(wip_nav.entry);2667 const entry = unit.getEntry(wip_nav.entry);
...@@ -2753,14 +2688,14 @@ fn finishWipNavFuncInner(...@@ -2753,14 +2688,14 @@ fn finishWipNavFuncInner(
2753 },2688 },
2754 }2689 }
2755 {2690 {
2756 std.mem.writeInt(u32, wip_nav.debug_info.getWritten()[wip_nav.func_high_pc..][0..4], @intCast(code_size), dwarf.endian);2691 std.mem.writeInt(u32, wip_nav.debug_info.items[wip_nav.func_high_pc..][0..4], @intCast(code_size), dwarf.endian);
2757 if (wip_nav.any_children) {2692 if (wip_nav.any_children) {
2758 const dibw = &wip_nav.debug_info.buffered_writer;2693 const diw = wip_nav.debug_info.writer(dwarf.gpa);
2759 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));2694 try uleb128(diw, @intFromEnum(AbbrevCode.null));
2760 } else {2695 } else {
2761 const abbrev_code_buf = wip_nav.debug_info.getWritten()[0..AbbrevCode.decl_bytes];2696 const abbrev_code_buf = wip_nav.debug_info.items[0..AbbrevCode.decl_bytes];
2762 var abbrev_code_br: std.io.Reader = .fixed(abbrev_code_buf);2697 var abbrev_code_fbs = std.io.fixedBufferStream(abbrev_code_buf);
2763 const abbrev_code: AbbrevCode = @enumFromInt(abbrev_code_br.takeLeb128(@typeInfo(AbbrevCode).@"enum".tag_type) catch unreachable);2698 const abbrev_code: AbbrevCode = @enumFromInt(std.leb.readUleb128(@typeInfo(AbbrevCode).@"enum".tag_type, abbrev_code_fbs.reader()) catch unreachable);
2764 std.leb.writeUnsignedFixed(2699 std.leb.writeUnsignedFixed(
2765 AbbrevCode.decl_bytes,2700 AbbrevCode.decl_bytes,
2766 abbrev_code_buf,2701 abbrev_code_buf,
...@@ -2792,10 +2727,10 @@ fn finishWipNavFuncInner(...@@ -2792,10 +2727,10 @@ fn finishWipNavFuncInner(
2792 );2727 );
2793 }2728 }
27942729
2795 try dwarf.finishWipNavInner(pt, nav_index, wip_nav);2730 try dwarf.finishWipNav(pt, nav_index, wip_nav);
2796}2731}
27972732
2798fn finishWipNavInner(2733pub fn finishWipNav(
2799 dwarf: *Dwarf,2734 dwarf: *Dwarf,
2800 pt: Zcu.PerThread,2735 pt: Zcu.PerThread,
2801 nav_index: InternPool.Nav.Index,2736 nav_index: InternPool.Nav.Index,
...@@ -2806,20 +2741,26 @@ fn finishWipNavInner(...@@ -2806,20 +2741,26 @@ fn finishWipNavInner(
2806 const nav = ip.getNav(nav_index);2741 const nav = ip.getNav(nav_index);
2807 log.debug("finishWipNav({f})", .{nav.fqn.fmt(ip)});2742 log.debug("finishWipNav({f})", .{nav.fqn.fmt(ip)});
28082743
2809 try dwarf.debug_info.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_info.getWritten());2744 try dwarf.debug_info.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_info.items);
2810 const debug_line = wip_nav.debug_line.getWritten();2745 if (wip_nav.debug_line.items.len > 0) {
2811 if (debug_line.len > 0) {2746 const dlw = wip_nav.debug_line.writer(dwarf.gpa);
2812 const dlbw = &wip_nav.debug_line.buffered_writer;2747 try dlw.writeByte(DW.LNS.extended_op);
2813 try dlbw.writeByte(DW.LNS.extended_op);2748 try uleb128(dlw, 1);
2814 try dlbw.writeUleb128(1);2749 try dlw.writeByte(DW.LNE.end_sequence);
2815 try dlbw.writeByte(DW.LNE.end_sequence);2750 try dwarf.debug_line.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_line.items);
2816 try dwarf.debug_line.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_line.getWritten());
2817 }2751 }
2818 try dwarf.debug_loclists.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_loclists.getWritten());2752 try dwarf.debug_loclists.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_loclists.items);
28192753
2820 try wip_nav.updateLazy(zcu.navSrcLoc(nav_index));2754 try wip_nav.updateLazy(zcu.navSrcLoc(nav_index));
2821}2755}
28222756
2757pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index) error{ OutOfMemory, CodegenFail }!void {
2758 return updateComptimeNavInner(dwarf, pt, nav_index) catch |err| switch (err) {
2759 error.OutOfMemory => return error.OutOfMemory,
2760 else => |e| return pt.zcu.codegenFail(nav_index, "failed to update dwarf: {s}", .{@errorName(e)}),
2761 };
2762}
2763
2823fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index) !void {2764fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index) !void {
2824 const zcu = pt.zcu;2765 const zcu = pt.zcu;
2825 const ip = &zcu.intern_pool;2766 const ip = &zcu.intern_pool;
...@@ -2858,13 +2799,12 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -2858,13 +2799,12 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
2858 .func_high_pc = undefined,2799 .func_high_pc = undefined,
2859 .blocks = undefined,2800 .blocks = undefined,
2860 .cfi = undefined,2801 .cfi = undefined,
2861 .debug_frame = undefined,2802 .debug_frame = .empty,
2862 .debug_info = undefined,2803 .debug_info = .empty,
2863 .debug_line = undefined,2804 .debug_line = .empty,
2864 .debug_loclists = undefined,2805 .debug_loclists = .empty,
2865 .pending_lazy = .empty,2806 .pending_lazy = .empty,
2866 };2807 };
2867 wip_nav.init();
2868 defer wip_nav.deinit();2808 defer wip_nav.deinit();
28692809
2870 const nav_gop = try dwarf.navs.getOrPut(dwarf.gpa, nav_index);2810 const nav_gop = try dwarf.navs.getOrPut(dwarf.gpa, nav_index);
...@@ -2908,7 +2848,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -2908,7 +2848,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
2908 }2848 }
2909 wip_nav.entry = nav_gop.value_ptr.*;2849 wip_nav.entry = nav_gop.value_ptr.*;
29102850
2911 const dibw = &wip_nav.debug_info.buffered_writer;2851 const diw = wip_nav.debug_info.writer(dwarf.gpa);
29122852
2913 switch (loaded_struct.layout) {2853 switch (loaded_struct.layout) {
2914 .auto, .@"extern" => {2854 .auto, .@"extern" => {
...@@ -2921,9 +2861,9 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -2921,9 +2861,9 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
2921 .generic_decl = .generic_decl_const,2861 .generic_decl = .generic_decl_const,
2922 .decl_instance = .decl_instance_struct,2862 .decl_instance = .decl_instance_struct,
2923 }, &nav, inst_info.file, &decl);2863 }, &nav, inst_info.file, &decl);
2924 if (loaded_struct.field_types.len == 0) try dibw.writeByte(@intFromBool(false)) else {2864 if (loaded_struct.field_types.len == 0) try diw.writeByte(@intFromBool(false)) else {
2925 try dibw.writeLeb128(nav_val.toType().abiSize(zcu));2865 try uleb128(diw, nav_val.toType().abiSize(zcu));
2926 try dibw.writeLeb128(nav_val.toType().abiAlignment(zcu).toByteUnits().?);2866 try uleb128(diw, nav_val.toType().abiAlignment(zcu).toByteUnits().?);
2927 for (0..loaded_struct.field_types.len) |field_index| {2867 for (0..loaded_struct.field_types.len) |field_index| {
2928 const is_comptime = loaded_struct.fieldIsComptime(ip, field_index);2868 const is_comptime = loaded_struct.fieldIsComptime(ip, field_index);
2929 const field_init = loaded_struct.fieldInit(ip, field_index);2869 const field_init = loaded_struct.fieldInit(ip, field_index);
...@@ -2959,8 +2899,8 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -2959,8 +2899,8 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
2959 }2899 }
2960 try wip_nav.refType(field_type);2900 try wip_nav.refType(field_type);
2961 if (!is_comptime) {2901 if (!is_comptime) {
2962 try dibw.writeLeb128(loaded_struct.offsets.get(ip)[field_index]);2902 try uleb128(diw, loaded_struct.offsets.get(ip)[field_index]);
2963 try dibw.writeLeb128(loaded_struct.fieldAlign(ip, field_index).toByteUnits() orelse2903 try uleb128(diw, loaded_struct.fieldAlign(ip, field_index).toByteUnits() orelse
2964 field_type.abiAlignment(zcu).toByteUnits().?);2904 field_type.abiAlignment(zcu).toByteUnits().?);
2965 }2905 }
2966 if (has_comptime_state)2906 if (has_comptime_state)
...@@ -2968,7 +2908,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -2968,7 +2908,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
2968 else if (has_runtime_bits)2908 else if (has_runtime_bits)
2969 try wip_nav.blockValue(nav_src_loc, .fromInterned(field_init));2909 try wip_nav.blockValue(nav_src_loc, .fromInterned(field_init));
2970 }2910 }
2971 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));2911 try uleb128(diw, @intFromEnum(AbbrevCode.null));
2972 }2912 }
2973 },2913 },
2974 .@"packed" => {2914 .@"packed" => {
...@@ -2984,10 +2924,10 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -2984,10 +2924,10 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
2984 try wip_nav.strp(loaded_struct.fieldName(ip, field_index).unwrap().?.toSlice(ip));2924 try wip_nav.strp(loaded_struct.fieldName(ip, field_index).unwrap().?.toSlice(ip));
2985 const field_type: Type = .fromInterned(loaded_struct.field_types.get(ip)[field_index]);2925 const field_type: Type = .fromInterned(loaded_struct.field_types.get(ip)[field_index]);
2986 try wip_nav.refType(field_type);2926 try wip_nav.refType(field_type);
2987 try dibw.writeLeb128(field_bit_offset);2927 try uleb128(diw, field_bit_offset);
2988 field_bit_offset += @intCast(field_type.bitSize(zcu));2928 field_bit_offset += @intCast(field_type.bitSize(zcu));
2989 }2929 }
2990 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));2930 try uleb128(diw, @intFromEnum(AbbrevCode.null));
2991 },2931 },
2992 }2932 }
2993 break :tag .done;2933 break :tag .done;
...@@ -3010,7 +2950,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -3010,7 +2950,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
3010 type_gop.value_ptr.* = nav_gop.value_ptr.*;2950 type_gop.value_ptr.* = nav_gop.value_ptr.*;
3011 }2951 }
3012 wip_nav.entry = nav_gop.value_ptr.*;2952 wip_nav.entry = nav_gop.value_ptr.*;
3013 const dibw = &wip_nav.debug_info.buffered_writer;2953 const diw = wip_nav.debug_info.writer(dwarf.gpa);
3014 try wip_nav.declCommon(if (loaded_enum.names.len > 0) .{2954 try wip_nav.declCommon(if (loaded_enum.names.len > 0) .{
3015 .decl = .decl_enum,2955 .decl = .decl_enum,
3016 .generic_decl = .generic_decl_const,2956 .generic_decl = .generic_decl_const,
...@@ -3029,7 +2969,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -3029,7 +2969,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
3029 }, field_index);2969 }, field_index);
3030 try wip_nav.strp(loaded_enum.names.get(ip)[field_index].toSlice(ip));2970 try wip_nav.strp(loaded_enum.names.get(ip)[field_index].toSlice(ip));
3031 }2971 }
3032 if (loaded_enum.names.len > 0) try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));2972 if (loaded_enum.names.len > 0) try uleb128(diw, @intFromEnum(AbbrevCode.null));
3033 break :tag .done;2973 break :tag .done;
3034 },2974 },
3035 .union_type => tag: {2975 .union_type => tag: {
...@@ -3049,15 +2989,15 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -3049,15 +2989,15 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
3049 type_gop.value_ptr.* = nav_gop.value_ptr.*;2989 type_gop.value_ptr.* = nav_gop.value_ptr.*;
3050 }2990 }
3051 wip_nav.entry = nav_gop.value_ptr.*;2991 wip_nav.entry = nav_gop.value_ptr.*;
3052 const dibw = &wip_nav.debug_info.buffered_writer;2992 const diw = wip_nav.debug_info.writer(dwarf.gpa);
3053 try wip_nav.declCommon(.{2993 try wip_nav.declCommon(.{
3054 .decl = .decl_union,2994 .decl = .decl_union,
3055 .generic_decl = .generic_decl_const,2995 .generic_decl = .generic_decl_const,
3056 .decl_instance = .decl_instance_union,2996 .decl_instance = .decl_instance_union,
3057 }, &nav, inst_info.file, &decl);2997 }, &nav, inst_info.file, &decl);
3058 const union_layout = Type.getUnionLayout(loaded_union, zcu);2998 const union_layout = Type.getUnionLayout(loaded_union, zcu);
3059 try dibw.writeLeb128(union_layout.abi_size);2999 try uleb128(diw, union_layout.abi_size);
3060 try dibw.writeLeb128(union_layout.abi_align.toByteUnits().?);3000 try uleb128(diw, union_layout.abi_align.toByteUnits().?);
3061 const loaded_tag = loaded_union.loadTagType(ip);3001 const loaded_tag = loaded_union.loadTagType(ip);
3062 if (loaded_union.hasTag(ip)) {3002 if (loaded_union.hasTag(ip)) {
3063 try wip_nav.abbrevCode(.tagged_union);3003 try wip_nav.abbrevCode(.tagged_union);
...@@ -3065,13 +3005,13 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -3065,13 +3005,13 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
3065 .debug_info,3005 .debug_info,
3066 wip_nav.unit,3006 wip_nav.unit,
3067 wip_nav.entry,3007 wip_nav.entry,
3068 @intCast(dibw.count + dwarf.sectionOffsetBytes()),3008 @intCast(wip_nav.debug_info.items.len + dwarf.sectionOffsetBytes()),
3069 );3009 );
3070 {3010 {
3071 try wip_nav.abbrevCode(.generated_field);3011 try wip_nav.abbrevCode(.generated_field);
3072 try wip_nav.strp("tag");3012 try wip_nav.strp("tag");
3073 try wip_nav.refType(.fromInterned(loaded_union.enum_tag_ty));3013 try wip_nav.refType(.fromInterned(loaded_union.enum_tag_ty));
3074 try dibw.writeLeb128(union_layout.tagOffset());3014 try uleb128(diw, union_layout.tagOffset());
30753015
3076 for (0..loaded_union.field_types.len) |field_index| {3016 for (0..loaded_union.field_types.len) |field_index| {
3077 try wip_nav.enumConstValue(loaded_tag, .{3017 try wip_nav.enumConstValue(loaded_tag, .{
...@@ -3084,23 +3024,23 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -3084,23 +3024,23 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
3084 try wip_nav.strp(loaded_tag.names.get(ip)[field_index].toSlice(ip));3024 try wip_nav.strp(loaded_tag.names.get(ip)[field_index].toSlice(ip));
3085 const field_type: Type = .fromInterned(loaded_union.field_types.get(ip)[field_index]);3025 const field_type: Type = .fromInterned(loaded_union.field_types.get(ip)[field_index]);
3086 try wip_nav.refType(field_type);3026 try wip_nav.refType(field_type);
3087 try dibw.writeLeb128(union_layout.payloadOffset());3027 try uleb128(diw, union_layout.payloadOffset());
3088 try dibw.writeLeb128(loaded_union.fieldAlign(ip, field_index).toByteUnits() orelse3028 try uleb128(diw, loaded_union.fieldAlign(ip, field_index).toByteUnits() orelse
3089 if (field_type.isNoReturn(zcu)) 1 else field_type.abiAlignment(zcu).toByteUnits().?);3029 if (field_type.isNoReturn(zcu)) 1 else field_type.abiAlignment(zcu).toByteUnits().?);
3090 }3030 }
3091 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3031 try uleb128(diw, @intFromEnum(AbbrevCode.null));
3092 }3032 }
3093 }3033 }
3094 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3034 try uleb128(diw, @intFromEnum(AbbrevCode.null));
3095 } else for (0..loaded_union.field_types.len) |field_index| {3035 } else for (0..loaded_union.field_types.len) |field_index| {
3096 try wip_nav.abbrevCode(.untagged_union_field);3036 try wip_nav.abbrevCode(.untagged_union_field);
3097 try wip_nav.strp(loaded_tag.names.get(ip)[field_index].toSlice(ip));3037 try wip_nav.strp(loaded_tag.names.get(ip)[field_index].toSlice(ip));
3098 const field_type: Type = .fromInterned(loaded_union.field_types.get(ip)[field_index]);3038 const field_type: Type = .fromInterned(loaded_union.field_types.get(ip)[field_index]);
3099 try wip_nav.refType(field_type);3039 try wip_nav.refType(field_type);
3100 try dibw.writeLeb128(loaded_union.fieldAlign(ip, field_index).toByteUnits() orelse3040 try uleb128(diw, loaded_union.fieldAlign(ip, field_index).toByteUnits() orelse
3101 field_type.abiAlignment(zcu).toByteUnits().?);3041 field_type.abiAlignment(zcu).toByteUnits().?);
3102 }3042 }
3103 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3043 try uleb128(diw, @intFromEnum(AbbrevCode.null));
3104 break :tag .done;3044 break :tag .done;
3105 },3045 },
3106 .opaque_type => tag: {3046 .opaque_type => tag: {
...@@ -3120,13 +3060,13 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -3120,13 +3060,13 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
3120 type_gop.value_ptr.* = nav_gop.value_ptr.*;3060 type_gop.value_ptr.* = nav_gop.value_ptr.*;
3121 }3061 }
3122 wip_nav.entry = nav_gop.value_ptr.*;3062 wip_nav.entry = nav_gop.value_ptr.*;
3123 const dibw = &wip_nav.debug_info.buffered_writer;3063 const diw = wip_nav.debug_info.writer(dwarf.gpa);
3124 try wip_nav.declCommon(.{3064 try wip_nav.declCommon(.{
3125 .decl = .decl_namespace_struct,3065 .decl = .decl_namespace_struct,
3126 .generic_decl = .generic_decl_const,3066 .generic_decl = .generic_decl_const,
3127 .decl_instance = .decl_instance_namespace_struct,3067 .decl_instance = .decl_instance_namespace_struct,
3128 }, &nav, inst_info.file, &decl);3068 }, &nav, inst_info.file, &decl);
3129 try dibw.writeByte(@intFromBool(true));3069 try diw.writeByte(@intFromBool(true));
3130 break :tag .done;3070 break :tag .done;
3131 },3071 },
3132 .undef,3072 .undef,
...@@ -3164,7 +3104,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -3164,7 +3104,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
3164 const is_nullary = !func_type.is_var_args and for (0..func_type.param_types.len) |param_index| {3104 const is_nullary = !func_type.is_var_args and for (0..func_type.param_types.len) |param_index| {
3165 if (!func_type.paramIsComptime(std.math.cast(u5, param_index) orelse break false)) break false;3105 if (!func_type.paramIsComptime(std.math.cast(u5, param_index) orelse break false)) break false;
3166 } else true;3106 } else true;
3167 const dibw = &wip_nav.debug_info.buffered_writer;3107 const diw = wip_nav.debug_info.writer(dwarf.gpa);
3168 try wip_nav.declCommon(if (is_nullary) .{3108 try wip_nav.declCommon(if (is_nullary) .{
3169 .decl = .decl_nullary_func_generic,3109 .decl = .decl_nullary_func_generic,
3170 .generic_decl = .generic_decl_func,3110 .generic_decl = .generic_decl_func,
...@@ -3183,7 +3123,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -3183,7 +3123,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
3183 try wip_nav.refType(.fromInterned(func_type.param_types.get(ip)[param_index]));3123 try wip_nav.refType(.fromInterned(func_type.param_types.get(ip)[param_index]));
3184 }3124 }
3185 if (func_type.is_var_args) try wip_nav.abbrevCode(.is_var_args);3125 if (func_type.is_var_args) try wip_nav.abbrevCode(.is_var_args);
3186 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3126 try uleb128(diw, @intFromEnum(AbbrevCode.null));
3187 }3127 }
3188 break :tag .done;3128 break :tag .done;
3189 },3129 },
...@@ -3208,7 +3148,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -3208,7 +3148,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
3208 try wip_nav.refType(nav_val.toType());3148 try wip_nav.refType(nav_val.toType());
3209 },3149 },
3210 .decl_var => {3150 .decl_var => {
3211 const dibw = &wip_nav.debug_info.buffered_writer;3151 const diw = wip_nav.debug_info.writer(dwarf.gpa);
3212 try wip_nav.declCommon(.{3152 try wip_nav.declCommon(.{
3213 .decl = .decl_var,3153 .decl = .decl_var,
3214 .generic_decl = .generic_decl_var,3154 .generic_decl = .generic_decl_var,
...@@ -3218,12 +3158,12 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -3218,12 +3158,12 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
3218 const nav_ty = nav_val.typeOf(zcu);3158 const nav_ty = nav_val.typeOf(zcu);
3219 try wip_nav.refType(nav_ty);3159 try wip_nav.refType(nav_ty);
3220 try wip_nav.blockValue(nav_src_loc, nav_val);3160 try wip_nav.blockValue(nav_src_loc, nav_val);
3221 try dibw.writeLeb128(nav.status.fully_resolved.alignment.toByteUnits() orelse3161 try uleb128(diw, nav.status.fully_resolved.alignment.toByteUnits() orelse
3222 nav_ty.abiAlignment(zcu).toByteUnits().?);3162 nav_ty.abiAlignment(zcu).toByteUnits().?);
3223 try dibw.writeByte(@intFromBool(decl.linkage != .normal));3163 try diw.writeByte(@intFromBool(decl.linkage != .normal));
3224 },3164 },
3225 .decl_const => {3165 .decl_const => {
3226 const dibw = &wip_nav.debug_info.buffered_writer;3166 const diw = wip_nav.debug_info.writer(dwarf.gpa);
3227 const nav_ty = nav_val.typeOf(zcu);3167 const nav_ty = nav_val.typeOf(zcu);
3228 const has_runtime_bits = nav_ty.hasRuntimeBits(zcu);3168 const has_runtime_bits = nav_ty.hasRuntimeBits(zcu);
3229 const has_comptime_state = nav_ty.comptimeOnly(zcu) and try nav_ty.onePossibleValue(pt) == null;3169 const has_comptime_state = nav_ty.comptimeOnly(zcu) and try nav_ty.onePossibleValue(pt) == null;
...@@ -3246,9 +3186,9 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -3246,9 +3186,9 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
3246 }, &nav, inst_info.file, &decl);3186 }, &nav, inst_info.file, &decl);
3247 try wip_nav.strp(nav.fqn.toSlice(ip));3187 try wip_nav.strp(nav.fqn.toSlice(ip));
3248 const nav_ty_reloc_index = try wip_nav.refForward();3188 const nav_ty_reloc_index = try wip_nav.refForward();
3249 try dibw.writeLeb128(nav.status.fully_resolved.alignment.toByteUnits() orelse3189 try uleb128(diw, nav.status.fully_resolved.alignment.toByteUnits() orelse
3250 nav_ty.abiAlignment(zcu).toByteUnits().?);3190 nav_ty.abiAlignment(zcu).toByteUnits().?);
3251 try dibw.writeByte(@intFromBool(decl.linkage != .normal));3191 try diw.writeByte(@intFromBool(decl.linkage != .normal));
3252 if (has_runtime_bits) try wip_nav.blockValue(nav_src_loc, nav_val);3192 if (has_runtime_bits) try wip_nav.blockValue(nav_src_loc, nav_val);
3253 if (has_comptime_state) try wip_nav.refValue(nav_val);3193 if (has_comptime_state) try wip_nav.refValue(nav_val);
3254 wip_nav.finishForward(nav_ty_reloc_index);3194 wip_nav.finishForward(nav_ty_reloc_index);
...@@ -3264,7 +3204,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo...@@ -3264,7 +3204,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
3264 try wip_nav.refNav(owner_nav);3204 try wip_nav.refNav(owner_nav);
3265 },3205 },
3266 }3206 }
3267 try dwarf.debug_info.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_info.getWritten());3207 try dwarf.debug_info.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_info.items);
3268 try wip_nav.updateLazy(nav_src_loc);3208 try wip_nav.updateLazy(nav_src_loc);
3269}3209}
32703210
...@@ -3295,19 +3235,18 @@ fn updateLazyType(...@@ -3295,19 +3235,18 @@ fn updateLazyType(
3295 .func_high_pc = undefined,3235 .func_high_pc = undefined,
3296 .blocks = undefined,3236 .blocks = undefined,
3297 .cfi = undefined,3237 .cfi = undefined,
3298 .debug_frame = undefined,3238 .debug_frame = .empty,
3299 .debug_info = undefined,3239 .debug_info = .empty,
3300 .debug_line = undefined,3240 .debug_line = .empty,
3301 .debug_loclists = undefined,3241 .debug_loclists = .empty,
3302 .pending_lazy = pending_lazy.*,3242 .pending_lazy = pending_lazy.*,
3303 };3243 };
3304 wip_nav.init();
3305 defer {3244 defer {
3306 pending_lazy.* = wip_nav.pending_lazy;3245 pending_lazy.* = wip_nav.pending_lazy;
3307 wip_nav.pending_lazy = .empty;3246 wip_nav.pending_lazy = .empty;
3308 wip_nav.deinit();3247 wip_nav.deinit();
3309 }3248 }
3310 const dibw = &wip_nav.debug_info.buffered_writer;3249 const diw = wip_nav.debug_info.writer(dwarf.gpa);
3311 const name = switch (type_index) {3250 const name = switch (type_index) {
3312 .generic_poison_type => "",3251 .generic_poison_type => "",
3313 else => try std.fmt.allocPrint(dwarf.gpa, "{f}", .{ty.fmt(pt)}),3252 else => try std.fmt.allocPrint(dwarf.gpa, "{f}", .{ty.fmt(pt)}),
...@@ -3322,12 +3261,12 @@ fn updateLazyType(...@@ -3322,12 +3261,12 @@ fn updateLazyType(
3322 .int_type => |int_type| {3261 .int_type => |int_type| {
3323 try wip_nav.abbrevCode(.numeric_type);3262 try wip_nav.abbrevCode(.numeric_type);
3324 try wip_nav.strp(name);3263 try wip_nav.strp(name);
3325 try dibw.writeByte(switch (int_type.signedness) {3264 try diw.writeByte(switch (int_type.signedness) {
3326 inline .signed, .unsigned => |signedness| @field(DW.ATE, @tagName(signedness)),3265 inline .signed, .unsigned => |signedness| @field(DW.ATE, @tagName(signedness)),
3327 });3266 });
3328 try dibw.writeLeb128(int_type.bits);3267 try uleb128(diw, int_type.bits);
3329 try dibw.writeLeb128(ty.abiSize(zcu));3268 try uleb128(diw, ty.abiSize(zcu));
3330 try dibw.writeLeb128(ty.abiAlignment(zcu).toByteUnits().?);3269 try uleb128(diw, ty.abiAlignment(zcu).toByteUnits().?);
3331 },3270 },
3332 .ptr_type => |ptr_type| switch (ptr_type.flags.size) {3271 .ptr_type => |ptr_type| switch (ptr_type.flags.size) {
3333 .one, .many, .c => {3272 .one, .many, .c => {
...@@ -3335,14 +3274,14 @@ fn updateLazyType(...@@ -3335,14 +3274,14 @@ fn updateLazyType(
3335 try wip_nav.abbrevCode(if (ptr_type.sentinel == .none) .ptr_type else .ptr_sentinel_type);3274 try wip_nav.abbrevCode(if (ptr_type.sentinel == .none) .ptr_type else .ptr_sentinel_type);
3336 try wip_nav.strp(name);3275 try wip_nav.strp(name);
3337 if (ptr_type.sentinel != .none) try wip_nav.blockValue(src_loc, .fromInterned(ptr_type.sentinel));3276 if (ptr_type.sentinel != .none) try wip_nav.blockValue(src_loc, .fromInterned(ptr_type.sentinel));
3338 try dibw.writeLeb128(ptr_type.flags.alignment.toByteUnits() orelse3277 try uleb128(diw, ptr_type.flags.alignment.toByteUnits() orelse
3339 ptr_child_type.abiAlignment(zcu).toByteUnits().?);3278 ptr_child_type.abiAlignment(zcu).toByteUnits().?);
3340 try dibw.writeByte(@intFromEnum(ptr_type.flags.address_space));3279 try diw.writeByte(@intFromEnum(ptr_type.flags.address_space));
3341 if (ptr_type.flags.is_const or ptr_type.flags.is_volatile) try wip_nav.infoSectionOffset(3280 if (ptr_type.flags.is_const or ptr_type.flags.is_volatile) try wip_nav.infoSectionOffset(
3342 .debug_info,3281 .debug_info,
3343 wip_nav.unit,3282 wip_nav.unit,
3344 wip_nav.entry,3283 wip_nav.entry,
3345 @intCast(dibw.count + dwarf.sectionOffsetBytes()),3284 @intCast(wip_nav.debug_info.items.len + dwarf.sectionOffsetBytes()),
3346 ) else try wip_nav.refType(ptr_child_type);3285 ) else try wip_nav.refType(ptr_child_type);
3347 if (ptr_type.flags.is_const) {3286 if (ptr_type.flags.is_const) {
3348 try wip_nav.abbrevCode(.is_const);3287 try wip_nav.abbrevCode(.is_const);
...@@ -3350,7 +3289,7 @@ fn updateLazyType(...@@ -3350,7 +3289,7 @@ fn updateLazyType(
3350 .debug_info,3289 .debug_info,
3351 wip_nav.unit,3290 wip_nav.unit,
3352 wip_nav.entry,3291 wip_nav.entry,
3353 @intCast(dibw.count + dwarf.sectionOffsetBytes()),3292 @intCast(wip_nav.debug_info.items.len + dwarf.sectionOffsetBytes()),
3354 ) else try wip_nav.refType(ptr_child_type);3293 ) else try wip_nav.refType(ptr_child_type);
3355 }3294 }
3356 if (ptr_type.flags.is_volatile) {3295 if (ptr_type.flags.is_volatile) {
...@@ -3361,19 +3300,19 @@ fn updateLazyType(...@@ -3361,19 +3300,19 @@ fn updateLazyType(
3361 .slice => {3300 .slice => {
3362 try wip_nav.abbrevCode(.generated_struct_type);3301 try wip_nav.abbrevCode(.generated_struct_type);
3363 try wip_nav.strp(name);3302 try wip_nav.strp(name);
3364 try dibw.writeLeb128(ty.abiSize(zcu));3303 try uleb128(diw, ty.abiSize(zcu));
3365 try dibw.writeLeb128(ty.abiAlignment(zcu).toByteUnits().?);3304 try uleb128(diw, ty.abiAlignment(zcu).toByteUnits().?);
3366 try wip_nav.abbrevCode(.generated_field);3305 try wip_nav.abbrevCode(.generated_field);
3367 try wip_nav.strp("ptr");3306 try wip_nav.strp("ptr");
3368 const ptr_field_type = ty.slicePtrFieldType(zcu);3307 const ptr_field_type = ty.slicePtrFieldType(zcu);
3369 try wip_nav.refType(ptr_field_type);3308 try wip_nav.refType(ptr_field_type);
3370 try dibw.writeUleb128(0);3309 try uleb128(diw, 0);
3371 try wip_nav.abbrevCode(.generated_field);3310 try wip_nav.abbrevCode(.generated_field);
3372 try wip_nav.strp("len");3311 try wip_nav.strp("len");
3373 const len_field_type: Type = .usize;3312 const len_field_type: Type = .usize;
3374 try wip_nav.refType(len_field_type);3313 try wip_nav.refType(len_field_type);
3375 try dibw.writeLeb128(len_field_type.abiAlignment(zcu).forward(ptr_field_type.abiSize(zcu)));3314 try uleb128(diw, len_field_type.abiAlignment(zcu).forward(ptr_field_type.abiSize(zcu)));
3376 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3315 try uleb128(diw, @intFromEnum(AbbrevCode.null));
3377 },3316 },
3378 },3317 },
3379 .array_type => |array_type| {3318 .array_type => |array_type| {
...@@ -3384,8 +3323,8 @@ fn updateLazyType(...@@ -3384,8 +3323,8 @@ fn updateLazyType(
3384 try wip_nav.refType(array_child_type);3323 try wip_nav.refType(array_child_type);
3385 try wip_nav.abbrevCode(.array_index);3324 try wip_nav.abbrevCode(.array_index);
3386 try wip_nav.refType(.usize);3325 try wip_nav.refType(.usize);
3387 try dibw.writeLeb128(array_type.len);3326 try uleb128(diw, array_type.len);
3388 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3327 try uleb128(diw, @intFromEnum(AbbrevCode.null));
3389 },3328 },
3390 .vector_type => |vector_type| {3329 .vector_type => |vector_type| {
3391 try wip_nav.abbrevCode(.vector_type);3330 try wip_nav.abbrevCode(.vector_type);
...@@ -3393,22 +3332,22 @@ fn updateLazyType(...@@ -3393,22 +3332,22 @@ fn updateLazyType(
3393 try wip_nav.refType(.fromInterned(vector_type.child));3332 try wip_nav.refType(.fromInterned(vector_type.child));
3394 try wip_nav.abbrevCode(.array_index);3333 try wip_nav.abbrevCode(.array_index);
3395 try wip_nav.refType(.usize);3334 try wip_nav.refType(.usize);
3396 try dibw.writeLeb128(vector_type.len);3335 try uleb128(diw, vector_type.len);
3397 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3336 try uleb128(diw, @intFromEnum(AbbrevCode.null));
3398 },3337 },
3399 .opt_type => |opt_child_type_index| {3338 .opt_type => |opt_child_type_index| {
3400 const opt_child_type: Type = .fromInterned(opt_child_type_index);3339 const opt_child_type: Type = .fromInterned(opt_child_type_index);
3401 const opt_repr = optRepr(opt_child_type, zcu);3340 const opt_repr = optRepr(opt_child_type, zcu);
3402 try wip_nav.abbrevCode(.generated_union_type);3341 try wip_nav.abbrevCode(.generated_union_type);
3403 try wip_nav.strp(name);3342 try wip_nav.strp(name);
3404 try dibw.writeLeb128(ty.abiSize(zcu));3343 try uleb128(diw, ty.abiSize(zcu));
3405 try dibw.writeLeb128(ty.abiAlignment(zcu).toByteUnits().?);3344 try uleb128(diw, ty.abiAlignment(zcu).toByteUnits().?);
3406 switch (opt_repr) {3345 switch (opt_repr) {
3407 .opv_null => {3346 .opv_null => {
3408 try wip_nav.abbrevCode(.generated_field);3347 try wip_nav.abbrevCode(.generated_field);
3409 try wip_nav.strp("null");3348 try wip_nav.strp("null");
3410 try wip_nav.refType(.null);3349 try wip_nav.refType(.null);
3411 try dibw.writeUleb128(0);3350 try uleb128(diw, 0);
3412 },3351 },
3413 .unpacked, .error_set, .pointer => {3352 .unpacked, .error_set, .pointer => {
3414 try wip_nav.abbrevCode(.tagged_union);3353 try wip_nav.abbrevCode(.tagged_union);
...@@ -3416,7 +3355,7 @@ fn updateLazyType(...@@ -3416,7 +3355,7 @@ fn updateLazyType(
3416 .debug_info,3355 .debug_info,
3417 wip_nav.unit,3356 wip_nav.unit,
3418 wip_nav.entry,3357 wip_nav.entry,
3419 @intCast(dibw.count + dwarf.sectionOffsetBytes()),3358 @intCast(wip_nav.debug_info.items.len + dwarf.sectionOffsetBytes()),
3420 );3359 );
3421 {3360 {
3422 try wip_nav.abbrevCode(.generated_field);3361 try wip_nav.abbrevCode(.generated_field);
...@@ -3425,7 +3364,7 @@ fn updateLazyType(...@@ -3425,7 +3364,7 @@ fn updateLazyType(
3425 .opv_null => unreachable,3364 .opv_null => unreachable,
3426 .unpacked => {3365 .unpacked => {
3427 try wip_nav.refType(.bool);3366 try wip_nav.refType(.bool);
3428 try dibw.writeLeb128(if (opt_child_type.hasRuntimeBits(zcu))3367 try uleb128(diw, if (opt_child_type.hasRuntimeBits(zcu))
3429 opt_child_type.abiSize(zcu)3368 opt_child_type.abiSize(zcu)
3430 else3369 else
3431 0);3370 0);
...@@ -3435,37 +3374,37 @@ fn updateLazyType(...@@ -3435,37 +3374,37 @@ fn updateLazyType(
3435 .signedness = .unsigned,3374 .signedness = .unsigned,
3436 .bits = zcu.errorSetBits(),3375 .bits = zcu.errorSetBits(),
3437 } })));3376 } })));
3438 try dibw.writeUleb128(0);3377 try uleb128(diw, 0);
3439 },3378 },
3440 .pointer => {3379 .pointer => {
3441 try wip_nav.refType(.usize);3380 try wip_nav.refType(.usize);
3442 try dibw.writeUleb128(0);3381 try uleb128(diw, 0);
3443 },3382 },
3444 }3383 }
34453384
3446 try wip_nav.abbrevCode(.unsigned_tagged_union_field);3385 try wip_nav.abbrevCode(.unsigned_tagged_union_field);
3447 try dibw.writeUleb128(0);3386 try uleb128(diw, 0);
3448 {3387 {
3449 try wip_nav.abbrevCode(.generated_field);3388 try wip_nav.abbrevCode(.generated_field);
3450 try wip_nav.strp("null");3389 try wip_nav.strp("null");
3451 try wip_nav.refType(.null);3390 try wip_nav.refType(.null);
3452 try dibw.writeUleb128(0);3391 try uleb128(diw, 0);
3453 }3392 }
3454 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3393 try uleb128(diw, @intFromEnum(AbbrevCode.null));
34553394
3456 try wip_nav.abbrevCode(.tagged_union_default_field);3395 try wip_nav.abbrevCode(.tagged_union_default_field);
3457 {3396 {
3458 try wip_nav.abbrevCode(.generated_field);3397 try wip_nav.abbrevCode(.generated_field);
3459 try wip_nav.strp("?");3398 try wip_nav.strp("?");
3460 try wip_nav.refType(opt_child_type);3399 try wip_nav.refType(opt_child_type);
3461 try dibw.writeUleb128(0);3400 try uleb128(diw, 0);
3462 }3401 }
3463 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3402 try uleb128(diw, @intFromEnum(AbbrevCode.null));
3464 }3403 }
3465 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3404 try uleb128(diw, @intFromEnum(AbbrevCode.null));
3466 },3405 },
3467 }3406 }
3468 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3407 try uleb128(diw, @intFromEnum(AbbrevCode.null));
3469 },3408 },
3470 .anyframe_type => unreachable,3409 .anyframe_type => unreachable,
3471 .error_union_type => |error_union_type| {3410 .error_union_type => |error_union_type| {
...@@ -3484,11 +3423,11 @@ fn updateLazyType(...@@ -3484,11 +3423,11 @@ fn updateLazyType(
3484 if (error_union_type.error_set_type != .generic_poison_type and3423 if (error_union_type.error_set_type != .generic_poison_type and
3485 error_union_type.payload_type != .generic_poison_type)3424 error_union_type.payload_type != .generic_poison_type)
3486 {3425 {
3487 try dibw.writeLeb128(ty.abiSize(zcu));3426 try uleb128(diw, ty.abiSize(zcu));
3488 try dibw.writeLeb128(ty.abiAlignment(zcu).toByteUnits().?);3427 try uleb128(diw, ty.abiAlignment(zcu).toByteUnits().?);
3489 } else {3428 } else {
3490 try dibw.writeUleb128(0);3429 try uleb128(diw, 0);
3491 try dibw.writeUleb128(1);3430 try uleb128(diw, 1);
3492 }3431 }
3493 {3432 {
3494 try wip_nav.abbrevCode(.tagged_union);3433 try wip_nav.abbrevCode(.tagged_union);
...@@ -3496,7 +3435,7 @@ fn updateLazyType(...@@ -3496,7 +3435,7 @@ fn updateLazyType(
3496 .debug_info,3435 .debug_info,
3497 wip_nav.unit,3436 wip_nav.unit,
3498 wip_nav.entry,3437 wip_nav.entry,
3499 @intCast(dibw.count + dwarf.sectionOffsetBytes()),3438 @intCast(wip_nav.debug_info.items.len + dwarf.sectionOffsetBytes()),
3500 );3439 );
3501 {3440 {
3502 try wip_nav.abbrevCode(.generated_field);3441 try wip_nav.abbrevCode(.generated_field);
...@@ -3505,30 +3444,30 @@ fn updateLazyType(...@@ -3505,30 +3444,30 @@ fn updateLazyType(
3505 .signedness = .unsigned,3444 .signedness = .unsigned,
3506 .bits = zcu.errorSetBits(),3445 .bits = zcu.errorSetBits(),
3507 } })));3446 } })));
3508 try dibw.writeLeb128(error_union_error_set_offset);3447 try uleb128(diw, error_union_error_set_offset);
35093448
3510 try wip_nav.abbrevCode(.unsigned_tagged_union_field);3449 try wip_nav.abbrevCode(.unsigned_tagged_union_field);
3511 try dibw.writeUleb128(0);3450 try uleb128(diw, 0);
3512 {3451 {
3513 try wip_nav.abbrevCode(.generated_field);3452 try wip_nav.abbrevCode(.generated_field);
3514 try wip_nav.strp("value");3453 try wip_nav.strp("value");
3515 try wip_nav.refType(error_union_payload_type);3454 try wip_nav.refType(error_union_payload_type);
3516 try dibw.writeLeb128(error_union_payload_offset);3455 try uleb128(diw, error_union_payload_offset);
3517 }3456 }
3518 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3457 try uleb128(diw, @intFromEnum(AbbrevCode.null));
35193458
3520 try wip_nav.abbrevCode(.tagged_union_default_field);3459 try wip_nav.abbrevCode(.tagged_union_default_field);
3521 {3460 {
3522 try wip_nav.abbrevCode(.generated_field);3461 try wip_nav.abbrevCode(.generated_field);
3523 try wip_nav.strp("error");3462 try wip_nav.strp("error");
3524 try wip_nav.refType(error_union_error_set_type);3463 try wip_nav.refType(error_union_error_set_type);
3525 try dibw.writeLeb128(error_union_error_set_offset);3464 try uleb128(diw, error_union_error_set_offset);
3526 }3465 }
3527 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3466 try uleb128(diw, @intFromEnum(AbbrevCode.null));
3528 }3467 }
3529 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3468 try uleb128(diw, @intFromEnum(AbbrevCode.null));
3530 }3469 }
3531 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3470 try uleb128(diw, @intFromEnum(AbbrevCode.null));
3532 },3471 },
3533 .simple_type => |simple_type| switch (simple_type) {3472 .simple_type => |simple_type| switch (simple_type) {
3534 .f16,3473 .f16,
...@@ -3552,7 +3491,7 @@ fn updateLazyType(...@@ -3552,7 +3491,7 @@ fn updateLazyType(
3552 => {3491 => {
3553 try wip_nav.abbrevCode(.numeric_type);3492 try wip_nav.abbrevCode(.numeric_type);
3554 try wip_nav.strp(name);3493 try wip_nav.strp(name);
3555 try dibw.writeByte(if (type_index == .bool_type)3494 try diw.writeByte(if (type_index == .bool_type)
3556 DW.ATE.boolean3495 DW.ATE.boolean
3557 else if (ty.isRuntimeFloat())3496 else if (ty.isRuntimeFloat())
3558 DW.ATE.float3497 DW.ATE.float
...@@ -3562,9 +3501,9 @@ fn updateLazyType(...@@ -3562,9 +3501,9 @@ fn updateLazyType(
3562 DW.ATE.unsigned3501 DW.ATE.unsigned
3563 else3502 else
3564 unreachable);3503 unreachable);
3565 try dibw.writeLeb128(ty.bitSize(zcu));3504 try uleb128(diw, ty.bitSize(zcu));
3566 try dibw.writeLeb128(ty.abiSize(zcu));3505 try uleb128(diw, ty.abiSize(zcu));
3567 try dibw.writeLeb128(ty.abiAlignment(zcu).toByteUnits().?);3506 try uleb128(diw, ty.abiAlignment(zcu).toByteUnits().?);
3568 },3507 },
3569 .anyopaque,3508 .anyopaque,
3570 .void,3509 .void,
...@@ -3590,12 +3529,12 @@ fn updateLazyType(...@@ -3590,12 +3529,12 @@ fn updateLazyType(
3590 .tuple_type => |tuple_type| if (tuple_type.types.len == 0) {3529 .tuple_type => |tuple_type| if (tuple_type.types.len == 0) {
3591 try wip_nav.abbrevCode(.generated_empty_struct_type);3530 try wip_nav.abbrevCode(.generated_empty_struct_type);
3592 try wip_nav.strp(name);3531 try wip_nav.strp(name);
3593 try dibw.writeByte(@intFromBool(false));3532 try diw.writeByte(@intFromBool(false));
3594 } else {3533 } else {
3595 try wip_nav.abbrevCode(.generated_struct_type);3534 try wip_nav.abbrevCode(.generated_struct_type);
3596 try wip_nav.strp(name);3535 try wip_nav.strp(name);
3597 try dibw.writeLeb128(ty.abiSize(zcu));3536 try uleb128(diw, ty.abiSize(zcu));
3598 try dibw.writeLeb128(ty.abiAlignment(zcu).toByteUnits().?);3537 try uleb128(diw, ty.abiAlignment(zcu).toByteUnits().?);
3599 var field_byte_offset: u64 = 0;3538 var field_byte_offset: u64 = 0;
3600 for (0..tuple_type.types.len) |field_index| {3539 for (0..tuple_type.types.len) |field_index| {
3601 const comptime_value = tuple_type.values.get(ip)[field_index];3540 const comptime_value = tuple_type.values.get(ip)[field_index];
...@@ -3624,8 +3563,8 @@ fn updateLazyType(...@@ -3624,8 +3563,8 @@ fn updateLazyType(
3624 if (comptime_value == .none) {3563 if (comptime_value == .none) {
3625 const field_align = field_type.abiAlignment(zcu);3564 const field_align = field_type.abiAlignment(zcu);
3626 field_byte_offset = field_align.forward(field_byte_offset);3565 field_byte_offset = field_align.forward(field_byte_offset);
3627 try dibw.writeLeb128(field_byte_offset);3566 try uleb128(diw, field_byte_offset);
3628 try dibw.writeLeb128(field_type.abiAlignment(zcu).toByteUnits().?);3567 try uleb128(diw, field_type.abiAlignment(zcu).toByteUnits().?);
3629 field_byte_offset += field_type.abiSize(zcu);3568 field_byte_offset += field_type.abiSize(zcu);
3630 }3569 }
3631 if (has_comptime_state)3570 if (has_comptime_state)
...@@ -3633,7 +3572,7 @@ fn updateLazyType(...@@ -3633,7 +3572,7 @@ fn updateLazyType(
3633 else if (has_runtime_bits)3572 else if (has_runtime_bits)
3634 try wip_nav.blockValue(src_loc, .fromInterned(comptime_value));3573 try wip_nav.blockValue(src_loc, .fromInterned(comptime_value));
3635 }3574 }
3636 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3575 try uleb128(diw, @intFromEnum(AbbrevCode.null));
3637 },3576 },
3638 .enum_type => {3577 .enum_type => {
3639 const loaded_enum = ip.loadEnumType(type_index);3578 const loaded_enum = ip.loadEnumType(type_index);
...@@ -3648,7 +3587,7 @@ fn updateLazyType(...@@ -3648,7 +3587,7 @@ fn updateLazyType(
3648 }, field_index);3587 }, field_index);
3649 try wip_nav.strp(loaded_enum.names.get(ip)[field_index].toSlice(ip));3588 try wip_nav.strp(loaded_enum.names.get(ip)[field_index].toSlice(ip));
3650 }3589 }
3651 if (loaded_enum.names.len > 0) try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3590 if (loaded_enum.names.len > 0) try uleb128(diw, @intFromEnum(AbbrevCode.null));
3652 },3591 },
3653 .func_type => |func_type| {3592 .func_type => |func_type| {
3654 const is_nullary = func_type.param_types.len == 0 and !func_type.is_var_args;3593 const is_nullary = func_type.param_types.len == 0 and !func_type.is_var_args;
...@@ -3716,7 +3655,7 @@ fn updateLazyType(...@@ -3716,7 +3655,7 @@ fn updateLazyType(
3716 else => .nocall,3655 else => .nocall,
3717 };3656 };
3718 };3657 };
3719 try dibw.writeByte(@intFromEnum(cc));3658 try diw.writeByte(@intFromEnum(cc));
3720 try wip_nav.refType(.fromInterned(func_type.return_type));3659 try wip_nav.refType(.fromInterned(func_type.return_type));
3721 if (!is_nullary) {3660 if (!is_nullary) {
3722 for (0..func_type.param_types.len) |param_index| {3661 for (0..func_type.param_types.len) |param_index| {
...@@ -3724,7 +3663,7 @@ fn updateLazyType(...@@ -3724,7 +3663,7 @@ fn updateLazyType(
3724 try wip_nav.refType(.fromInterned(func_type.param_types.get(ip)[param_index]));3663 try wip_nav.refType(.fromInterned(func_type.param_types.get(ip)[param_index]));
3725 }3664 }
3726 if (func_type.is_var_args) try wip_nav.abbrevCode(.is_var_args);3665 if (func_type.is_var_args) try wip_nav.abbrevCode(.is_var_args);
3727 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3666 try uleb128(diw, @intFromEnum(AbbrevCode.null));
3728 }3667 }
3729 },3668 },
3730 .error_set_type => |error_set_type| {3669 .error_set_type => |error_set_type| {
...@@ -3737,10 +3676,10 @@ fn updateLazyType(...@@ -3737,10 +3676,10 @@ fn updateLazyType(
3737 for (0..error_set_type.names.len) |field_index| {3676 for (0..error_set_type.names.len) |field_index| {
3738 const field_name = error_set_type.names.get(ip)[field_index];3677 const field_name = error_set_type.names.get(ip)[field_index];
3739 try wip_nav.abbrevCode(.unsigned_enum_field);3678 try wip_nav.abbrevCode(.unsigned_enum_field);
3740 try dibw.writeLeb128(ip.getErrorValueIfExists(field_name).?);3679 try uleb128(diw, ip.getErrorValueIfExists(field_name).?);
3741 try wip_nav.strp(field_name.toSlice(ip));3680 try wip_nav.strp(field_name.toSlice(ip));
3742 }3681 }
3743 if (error_set_type.names.len > 0) try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3682 if (error_set_type.names.len > 0) try uleb128(diw, @intFromEnum(AbbrevCode.null));
3744 },3683 },
3745 .inferred_error_set_type => |func| {3684 .inferred_error_set_type => |func| {
3746 try wip_nav.abbrevCode(.inferred_error_set_type);3685 try wip_nav.abbrevCode(.inferred_error_set_type);
...@@ -3772,7 +3711,7 @@ fn updateLazyType(...@@ -3772,7 +3711,7 @@ fn updateLazyType(
3772 .memoized_call,3711 .memoized_call,
3773 => unreachable,3712 => unreachable,
3774 }3713 }
3775 try dwarf.debug_info.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_info.getWritten());3714 try dwarf.debug_info.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_info.items);
3776}3715}
37773716
3778fn updateLazyValue(3717fn updateLazyValue(
...@@ -3800,19 +3739,18 @@ fn updateLazyValue(...@@ -3800,19 +3739,18 @@ fn updateLazyValue(
3800 .func_high_pc = undefined,3739 .func_high_pc = undefined,
3801 .blocks = undefined,3740 .blocks = undefined,
3802 .cfi = undefined,3741 .cfi = undefined,
3803 .debug_frame = undefined,3742 .debug_frame = .empty,
3804 .debug_info = undefined,3743 .debug_info = .empty,
3805 .debug_line = undefined,3744 .debug_line = .empty,
3806 .debug_loclists = undefined,3745 .debug_loclists = .empty,
3807 .pending_lazy = pending_lazy.*,3746 .pending_lazy = pending_lazy.*,
3808 };3747 };
3809 wip_nav.init();
3810 defer {3748 defer {
3811 pending_lazy.* = wip_nav.pending_lazy;3749 pending_lazy.* = wip_nav.pending_lazy;
3812 wip_nav.pending_lazy = .empty;3750 wip_nav.pending_lazy = .empty;
3813 wip_nav.deinit();3751 wip_nav.deinit();
3814 }3752 }
3815 const dibw = &wip_nav.debug_info.buffered_writer;3753 const diw = wip_nav.debug_info.writer(dwarf.gpa);
3816 var big_int_space: Value.BigIntSpace = undefined;3754 var big_int_space: Value.BigIntSpace = undefined;
3817 switch (ip.indexToKey(value_index)) {3755 switch (ip.indexToKey(value_index)) {
3818 .int_type,3756 .int_type,
...@@ -3850,7 +3788,7 @@ fn updateLazyValue(...@@ -3850,7 +3788,7 @@ fn updateLazyValue(
3850 .err => |err| {3788 .err => |err| {
3851 try wip_nav.abbrevCode(.udata_comptime_value);3789 try wip_nav.abbrevCode(.udata_comptime_value);
3852 try wip_nav.refType(.fromInterned(err.ty));3790 try wip_nav.refType(.fromInterned(err.ty));
3853 try dibw.writeLeb128(try pt.getErrorValue(err.name));3791 try uleb128(diw, try pt.getErrorValue(err.name));
3854 },3792 },
3855 .error_union => |error_union| {3793 .error_union => |error_union| {
3856 try wip_nav.abbrevCode(.aggregate_comptime_value);3794 try wip_nav.abbrevCode(.aggregate_comptime_value);
...@@ -3862,8 +3800,8 @@ fn updateLazyValue(...@@ -3862,8 +3800,8 @@ fn updateLazyValue(
3862 {3800 {
3863 try wip_nav.abbrevCode(.comptime_value_field_runtime_bits);3801 try wip_nav.abbrevCode(.comptime_value_field_runtime_bits);
3864 try wip_nav.strp("is_error");3802 try wip_nav.strp("is_error");
3865 try dibw.writeLeb128(err_abi_size);3803 try uleb128(diw, err_abi_size);
3866 try dwarf.writeIntTo(dibw, err_abi_size, err_value);3804 dwarf.writeInt(try wip_nav.debug_info.addManyAsSlice(dwarf.gpa, err_abi_size), err_value);
3867 }3805 }
3868 payload_field: switch (error_union.val) {3806 payload_field: switch (error_union.val) {
3869 .err_name => {},3807 .err_name => {},
...@@ -3887,8 +3825,8 @@ fn updateLazyValue(...@@ -3887,8 +3825,8 @@ fn updateLazyValue(
3887 {3825 {
3888 try wip_nav.abbrevCode(.comptime_value_field_runtime_bits);3826 try wip_nav.abbrevCode(.comptime_value_field_runtime_bits);
3889 try wip_nav.strp("error");3827 try wip_nav.strp("error");
3890 try dibw.writeLeb128(err_abi_size);3828 try uleb128(diw, err_abi_size);
3891 try dwarf.writeIntTo(dibw, err_abi_size, err_value);3829 dwarf.writeInt(try wip_nav.debug_info.addManyAsSlice(dwarf.gpa, err_abi_size), err_value);
3892 }3830 }
3893 switch (error_union.val) {3831 switch (error_union.val) {
3894 .err_name => {},3832 .err_name => {},
...@@ -3898,7 +3836,7 @@ fn updateLazyValue(...@@ -3898,7 +3836,7 @@ fn updateLazyValue(
3898 },3836 },
3899 }3837 }
3900 try wip_nav.refType(.fromInterned(error_union.ty));3838 try wip_nav.refType(.fromInterned(error_union.ty));
3901 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3839 try uleb128(diw, @intFromEnum(AbbrevCode.null));
3902 },3840 },
3903 .enum_literal => |enum_literal| {3841 .enum_literal => |enum_literal| {
3904 try wip_nav.abbrevCode(.string_comptime_value);3842 try wip_nav.abbrevCode(.string_comptime_value);
...@@ -3919,24 +3857,24 @@ fn updateLazyValue(...@@ -3919,24 +3857,24 @@ fn updateLazyValue(
3919 switch (float.storage) {3857 switch (float.storage) {
3920 .f16 => |f16_val| {3858 .f16 => |f16_val| {
3921 try wip_nav.abbrevCode(.data2_comptime_value);3859 try wip_nav.abbrevCode(.data2_comptime_value);
3922 try dibw.writeInt(u16, @bitCast(f16_val), dwarf.endian);3860 try diw.writeInt(u16, @bitCast(f16_val), dwarf.endian);
3923 },3861 },
3924 .f32 => |f32_val| {3862 .f32 => |f32_val| {
3925 try wip_nav.abbrevCode(.data4_comptime_value);3863 try wip_nav.abbrevCode(.data4_comptime_value);
3926 try dibw.writeInt(u32, @bitCast(f32_val), dwarf.endian);3864 try diw.writeInt(u32, @bitCast(f32_val), dwarf.endian);
3927 },3865 },
3928 .f64 => |f64_val| {3866 .f64 => |f64_val| {
3929 try wip_nav.abbrevCode(.data8_comptime_value);3867 try wip_nav.abbrevCode(.data8_comptime_value);
3930 try dibw.writeInt(u64, @bitCast(f64_val), dwarf.endian);3868 try diw.writeInt(u64, @bitCast(f64_val), dwarf.endian);
3931 },3869 },
3932 .f80 => |f80_val| {3870 .f80 => |f80_val| {
3933 try wip_nav.abbrevCode(.block_comptime_value);3871 try wip_nav.abbrevCode(.block_comptime_value);
3934 try dibw.writeUleb128(@divExact(80, 8));3872 try uleb128(diw, @divExact(80, 8));
3935 try dibw.writeInt(u80, @bitCast(f80_val), dwarf.endian);3873 try diw.writeInt(u80, @bitCast(f80_val), dwarf.endian);
3936 },3874 },
3937 .f128 => |f128_val| {3875 .f128 => |f128_val| {
3938 try wip_nav.abbrevCode(.data16_comptime_value);3876 try wip_nav.abbrevCode(.data16_comptime_value);
3939 try dibw.writeInt(u128, @bitCast(f128_val), dwarf.endian);3877 try diw.writeInt(u128, @bitCast(f128_val), dwarf.endian);
3940 },3878 },
3941 }3879 }
3942 try wip_nav.refType(.fromInterned(float.ty));3880 try wip_nav.refType(.fromInterned(float.ty));
...@@ -3953,14 +3891,14 @@ fn updateLazyValue(...@@ -3953,14 +3891,14 @@ fn updateLazyValue(
3953 const uav_ty: Type = .fromInterned(ip.typeOf(uav.val));3891 const uav_ty: Type = .fromInterned(ip.typeOf(uav.val));
3954 if (try uav_ty.onePossibleValue(pt)) |_| {3892 if (try uav_ty.onePossibleValue(pt)) |_| {
3955 try wip_nav.abbrevCode(.udata_comptime_value);3893 try wip_nav.abbrevCode(.udata_comptime_value);
3956 try dibw.writeLeb128(ip.indexToKey(uav.orig_ty).ptr_type.flags.alignment.toByteUnits() orelse3894 try uleb128(diw, ip.indexToKey(uav.orig_ty).ptr_type.flags.alignment.toByteUnits() orelse
3957 uav_ty.abiAlignment(zcu).toByteUnits().?);3895 uav_ty.abiAlignment(zcu).toByteUnits().?);
3958 break :location;3896 break :location;
3959 } else break try wip_nav.getValueEntry(.fromInterned(uav.val));3897 } else break try wip_nav.getValueEntry(.fromInterned(uav.val));
3960 },3898 },
3961 .int => {3899 .int => {
3962 try wip_nav.abbrevCode(.udata_comptime_value);3900 try wip_nav.abbrevCode(.udata_comptime_value);
3963 try dibw.writeLeb128(byte_offset);3901 try uleb128(diw, byte_offset);
3964 break :location;3902 break :location;
3965 },3903 },
3966 .eu_payload => |eu_ptr| {3904 .eu_payload => |eu_ptr| {
...@@ -3999,7 +3937,7 @@ fn updateLazyValue(...@@ -3999,7 +3937,7 @@ fn updateLazyValue(
3999 try wip_nav.strp("len");3937 try wip_nav.strp("len");
4000 try wip_nav.blockValue(src_loc, .fromInterned(slice.len));3938 try wip_nav.blockValue(src_loc, .fromInterned(slice.len));
4001 }3939 }
4002 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3940 try uleb128(diw, @intFromEnum(AbbrevCode.null));
4003 },3941 },
4004 .opt => |opt| {3942 .opt => |opt| {
4005 const opt_child_type: Type = .fromInterned(ip.indexToKey(opt.ty).opt_type);3943 const opt_child_type: Type = .fromInterned(ip.indexToKey(opt.ty).opt_type);
...@@ -4009,7 +3947,7 @@ fn updateLazyValue(...@@ -4009,7 +3947,7 @@ fn updateLazyValue(
4009 try wip_nav.abbrevCode(.comptime_value_field_runtime_bits);3947 try wip_nav.abbrevCode(.comptime_value_field_runtime_bits);
4010 try wip_nav.strp("has_value");3948 try wip_nav.strp("has_value");
4011 switch (optRepr(opt_child_type, zcu)) {3949 switch (optRepr(opt_child_type, zcu)) {
4012 .opv_null => try dibw.writeUleb128(0),3950 .opv_null => try uleb128(diw, 0),
4013 .unpacked => try wip_nav.blockValue(src_loc, .makeBool(opt.val != .none)),3951 .unpacked => try wip_nav.blockValue(src_loc, .makeBool(opt.val != .none)),
4014 .error_set => try wip_nav.blockValue(src_loc, .fromInterned(value_index)),3952 .error_set => try wip_nav.blockValue(src_loc, .fromInterned(value_index)),
4015 .pointer => if (opt_child_type.comptimeOnly(zcu)) {3953 .pointer => if (opt_child_type.comptimeOnly(zcu)) {
...@@ -4019,8 +3957,8 @@ fn updateLazyValue(...@@ -4019,8 +3957,8 @@ fn updateLazyValue(
4019 .none => 0,3957 .none => 0,
4020 else => opt_child_type.ptrAlignment(zcu).toByteUnits().?,3958 else => opt_child_type.ptrAlignment(zcu).toByteUnits().?,
4021 });3959 });
4022 try dibw.writeLeb128(bytes.len);3960 try uleb128(diw, bytes.len);
4023 try dibw.writeAll(bytes);3961 try diw.writeAll(bytes);
4024 } else try wip_nav.blockValue(src_loc, .fromInterned(value_index)),3962 } else try wip_nav.blockValue(src_loc, .fromInterned(value_index)),
4025 }3963 }
4026 }3964 }
...@@ -4039,7 +3977,7 @@ fn updateLazyValue(...@@ -4039,7 +3977,7 @@ fn updateLazyValue(
4039 else3977 else
4040 try wip_nav.blockValue(src_loc, .fromInterned(opt.val));3978 try wip_nav.blockValue(src_loc, .fromInterned(opt.val));
4041 }3979 }
4042 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));3980 try uleb128(diw, @intFromEnum(AbbrevCode.null));
4043 },3981 },
4044 .aggregate => |aggregate| {3982 .aggregate => |aggregate| {
4045 try wip_nav.abbrevCode(.aggregate_comptime_value);3983 try wip_nav.abbrevCode(.aggregate_comptime_value);
...@@ -4124,7 +4062,7 @@ fn updateLazyValue(...@@ -4124,7 +4062,7 @@ fn updateLazyValue(
4124 },4062 },
4125 else => unreachable,4063 else => unreachable,
4126 }4064 }
4127 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));4065 try uleb128(diw, @intFromEnum(AbbrevCode.null));
4128 },4066 },
4129 .un => |un| {4067 .un => |un| {
4130 try wip_nav.abbrevCode(.aggregate_comptime_value);4068 try wip_nav.abbrevCode(.aggregate_comptime_value);
...@@ -4149,11 +4087,11 @@ fn updateLazyValue(...@@ -4149,11 +4087,11 @@ fn updateLazyValue(
4149 else4087 else
4150 try wip_nav.blockValue(src_loc, .fromInterned(un.val));4088 try wip_nav.blockValue(src_loc, .fromInterned(un.val));
4151 }4089 }
4152 try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));4090 try uleb128(diw, @intFromEnum(AbbrevCode.null));
4153 },4091 },
4154 .memoized_call => unreachable, // not a value4092 .memoized_call => unreachable, // not a value
4155 }4093 }
4156 try dwarf.debug_info.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_info.getWritten());4094 try dwarf.debug_info.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_info.items);
4157}4095}
41584096
4159fn optRepr(opt_child_type: Type, zcu: *const Zcu) enum {4097fn optRepr(opt_child_type: Type, zcu: *const Zcu) enum {
...@@ -4173,7 +4111,7 @@ fn optRepr(opt_child_type: Type, zcu: *const Zcu) enum {...@@ -4173,7 +4111,7 @@ fn optRepr(opt_child_type: Type, zcu: *const Zcu) enum {
4173 };4111 };
4174}4112}
41754113
4176fn updateContainerTypeInner(dwarf: *Dwarf, pt: Zcu.PerThread, type_index: InternPool.Index) UpdateError!void {4114pub fn updateContainerType(dwarf: *Dwarf, pt: Zcu.PerThread, type_index: InternPool.Index) UpdateError!void {
4177 const zcu = pt.zcu;4115 const zcu = pt.zcu;
4178 const ip = &zcu.intern_pool;4116 const ip = &zcu.intern_pool;
4179 const ty: Type = .fromInterned(type_index);4117 const ty: Type = .fromInterned(type_index);
...@@ -4500,26 +4438,25 @@ fn refAbbrevCode(dwarf: *Dwarf, abbrev_code: AbbrevCode) UpdateError!@typeInfo(A...@@ -4500,26 +4438,25 @@ fn refAbbrevCode(dwarf: *Dwarf, abbrev_code: AbbrevCode) UpdateError!@typeInfo(A
4500 assert(abbrev_code != .null);4438 assert(abbrev_code != .null);
4501 const entry: Entry.Index = @enumFromInt(@intFromEnum(abbrev_code));4439 const entry: Entry.Index = @enumFromInt(@intFromEnum(abbrev_code));
4502 if (dwarf.debug_abbrev.section.getUnit(DebugAbbrev.unit).getEntry(entry).len > 0) return @intFromEnum(abbrev_code);4440 if (dwarf.debug_abbrev.section.getUnit(DebugAbbrev.unit).getEntry(entry).len > 0) return @intFromEnum(abbrev_code);
4503 var daaw: std.io.Writer.Allocating = .init(dwarf.gpa);4441 var debug_abbrev: std.ArrayList(u8) = .init(dwarf.gpa);
4504 defer daaw.deinit();4442 defer debug_abbrev.deinit();
4505 const dabw = &daaw.interface;4443 const daw = debug_abbrev.writer();
4506 const abbrev = AbbrevCode.abbrevs.get(abbrev_code);4444 const abbrev = AbbrevCode.abbrevs.get(abbrev_code);
4507 try dabw.writeLeb128(@intFromEnum(abbrev_code));4445 try uleb128(daw, @intFromEnum(abbrev_code));
4508 try dabw.writeLeb128(@intFromEnum(abbrev.tag));4446 try uleb128(daw, @intFromEnum(abbrev.tag));
4509 try dabw.writeByte(if (abbrev.children) DW.CHILDREN.yes else DW.CHILDREN.no);4447 try daw.writeByte(if (abbrev.children) DW.CHILDREN.yes else DW.CHILDREN.no);
4510 for (abbrev.attrs) |*attr| inline for (attr) |info| try dabw.writeLeb128(@intFromEnum(info));4448 for (abbrev.attrs) |*attr| inline for (attr) |info| try uleb128(daw, @intFromEnum(info));
4511 for (0..2) |_| try dabw.writeUleb128(0);4449 for (0..2) |_| try uleb128(daw, 0);
4512 try dwarf.debug_abbrev.section.replaceEntry(DebugAbbrev.unit, entry, dwarf, daaw.getWritten());4450 try dwarf.debug_abbrev.section.replaceEntry(DebugAbbrev.unit, entry, dwarf, debug_abbrev.items);
4513 return @intFromEnum(abbrev_code);4451 return @intFromEnum(abbrev_code);
4514}4452}
45154453
4516pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {4454pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {
4517 const gpa = dwarf.gpa;
4518 const zcu = pt.zcu;4455 const zcu = pt.zcu;
4519 const ip = &zcu.intern_pool;4456 const ip = &zcu.intern_pool;
45204457
4521 {4458 {
4522 const type_gop = try dwarf.types.getOrPut(gpa, .anyerror_type);4459 const type_gop = try dwarf.types.getOrPut(dwarf.gpa, .anyerror_type);
4523 if (!type_gop.found_existing) type_gop.value_ptr.* = try dwarf.addCommonEntry(.main);4460 if (!type_gop.found_existing) type_gop.value_ptr.* = try dwarf.addCommonEntry(.main);
4524 var wip_nav: WipNav = .{4461 var wip_nav: WipNav = .{
4525 .dwarf = dwarf,4462 .dwarf = dwarf,
...@@ -4532,15 +4469,14 @@ pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {...@@ -4532,15 +4469,14 @@ pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {
4532 .func_high_pc = undefined,4469 .func_high_pc = undefined,
4533 .blocks = undefined,4470 .blocks = undefined,
4534 .cfi = undefined,4471 .cfi = undefined,
4535 .debug_frame = undefined,4472 .debug_frame = .empty,
4536 .debug_info = undefined,4473 .debug_info = .empty,
4537 .debug_line = undefined,4474 .debug_line = .empty,
4538 .debug_loclists = undefined,4475 .debug_loclists = .empty,
4539 .pending_lazy = .empty,4476 .pending_lazy = .empty,
4540 };4477 };
4541 wip_nav.init();
4542 defer wip_nav.deinit();4478 defer wip_nav.deinit();
4543 const dibw = &wip_nav.debug_info.buffered_writer;4479 const diw = wip_nav.debug_info.writer(dwarf.gpa);
4544 const global_error_set_names = ip.global_error_set.getNamesFromMainThread();4480 const global_error_set_names = ip.global_error_set.getNamesFromMainThread();
4545 try wip_nav.abbrevCode(if (global_error_set_names.len == 0) .generated_empty_enum_type else .generated_enum_type);4481 try wip_nav.abbrevCode(if (global_error_set_names.len == 0) .generated_empty_enum_type else .generated_enum_type);
4546 try wip_nav.strp("anyerror");4482 try wip_nav.strp("anyerror");
...@@ -4550,52 +4486,50 @@ pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {...@@ -4550,52 +4486,50 @@ pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {
4550 } })));4486 } })));
4551 for (global_error_set_names, 1..) |name, value| {4487 for (global_error_set_names, 1..) |name, value| {
4552 try wip_nav.abbrevCode(.unsigned_enum_field);4488 try wip_nav.abbrevCode(.unsigned_enum_field);
4553 try dibw.writeLeb128(value);4489 try uleb128(diw, value);
4554 try wip_nav.strp(name.toSlice(ip));4490 try wip_nav.strp(name.toSlice(ip));
4555 }4491 }
4556 if (global_error_set_names.len > 0) try dibw.writeLeb128(@intFromEnum(AbbrevCode.null));4492 if (global_error_set_names.len > 0) try uleb128(diw, @intFromEnum(AbbrevCode.null));
4557 try dwarf.debug_info.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, dibw.getWritten());4493 try dwarf.debug_info.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_info.items);
4558 try wip_nav.updateLazy(.unneeded);4494 try wip_nav.updateLazy(.unneeded);
4559 }4495 }
45604496
4561 for (dwarf.mods.keys(), dwarf.mods.values()) |mod, *mod_info| {4497 for (dwarf.mods.keys(), dwarf.mods.values()) |mod, *mod_info| {
4562 const root_dir_path = try mod.root.toAbsolute(zcu.comp.dirs, gpa);4498 const root_dir_path = try mod.root.toAbsolute(zcu.comp.dirs, dwarf.gpa);
4563 defer gpa.free(root_dir_path);4499 defer dwarf.gpa.free(root_dir_path);
4564 mod_info.root_dir_path = try dwarf.debug_line_str.addString(dwarf, root_dir_path);4500 mod_info.root_dir_path = try dwarf.debug_line_str.addString(dwarf, root_dir_path);
4565 }4501 }
45664502
4567 var header: std.ArrayListUnmanaged(u8) = .empty;4503 var header: std.ArrayList(u8) = .init(dwarf.gpa);
4568 defer header.deinit(gpa);4504 defer header.deinit();
4569 var header_bw: Writer = undefined;
4570 if (dwarf.debug_aranges.section.dirty) {4505 if (dwarf.debug_aranges.section.dirty) {
4571 for (dwarf.debug_aranges.section.units.items, 0..) |*unit_ptr, unit_index| {4506 for (dwarf.debug_aranges.section.units.items, 0..) |*unit_ptr, unit_index| {
4572 const unit: Unit.Index = @enumFromInt(unit_index);4507 const unit: Unit.Index = @enumFromInt(unit_index);
4573 unit_ptr.clear();4508 unit_ptr.clear();
4574 try unit_ptr.cross_section_relocs.ensureTotalCapacity(gpa, 1);4509 try unit_ptr.cross_section_relocs.ensureTotalCapacity(dwarf.gpa, 1);
4575 try header.resize(gpa, unit_ptr.header_len);4510 header.clearRetainingCapacity();
4576 header_bw = .fixed(header.items);4511 try header.ensureTotalCapacity(unit_ptr.header_len);
4577 const unit_len = (if (unit_ptr.next.unwrap()) |next_unit|4512 const unit_len = (if (unit_ptr.next.unwrap()) |next_unit|
4578 dwarf.debug_aranges.section.getUnit(next_unit).off4513 dwarf.debug_aranges.section.getUnit(next_unit).off
4579 else4514 else
4580 dwarf.debug_aranges.section.len) - unit_ptr.off - dwarf.unitLengthBytes();4515 dwarf.debug_aranges.section.len) - unit_ptr.off - dwarf.unitLengthBytes();
4581 switch (dwarf.format) {4516 switch (dwarf.format) {
4582 .@"32" => header_bw.writeInt(u32, @intCast(unit_len), dwarf.endian) catch unreachable,4517 .@"32" => std.mem.writeInt(u32, header.addManyAsArrayAssumeCapacity(4), @intCast(unit_len), dwarf.endian),
4583 .@"64" => {4518 .@"64" => {
4584 header_bw.writeInt(u32, std.math.maxInt(u32), dwarf.endian) catch unreachable;4519 std.mem.writeInt(u32, header.addManyAsArrayAssumeCapacity(4), std.math.maxInt(u32), dwarf.endian);
4585 header_bw.writeInt(u64, unit_len, dwarf.endian) catch unreachable;4520 std.mem.writeInt(u64, header.addManyAsArrayAssumeCapacity(8), unit_len, dwarf.endian);
4586 },4521 },
4587 }4522 }
4588 header_bw.writeInt(u16, 2, dwarf.endian) catch unreachable;4523 std.mem.writeInt(u16, header.addManyAsArrayAssumeCapacity(2), 2, dwarf.endian);
4589 unit_ptr.cross_section_relocs.appendAssumeCapacity(.{4524 unit_ptr.cross_section_relocs.appendAssumeCapacity(.{
4590 .source_off = @intCast(header_bw.end),4525 .source_off = @intCast(header.items.len),
4591 .target_sec = .debug_info,4526 .target_sec = .debug_info,
4592 .target_unit = unit,4527 .target_unit = unit,
4593 });4528 });
4594 header_bw.splatByteAll(0, dwarf.sectionOffsetBytes()) catch unreachable;4529 header.appendNTimesAssumeCapacity(0, dwarf.sectionOffsetBytes());
4595 header_bw.writeAll(&.{ @intFromEnum(dwarf.address_size), 0 }) catch unreachable;4530 header.appendSliceAssumeCapacity(&.{ @intFromEnum(dwarf.address_size), 0 });
4596 header_bw.splatByteAll(0, unit_ptr.header_len - header_bw.end) catch unreachable;4531 header.appendNTimesAssumeCapacity(0, unit_ptr.header_len - header.items.len);
4597 assert(header_bw.end == header_bw.buffer.len);4532 try unit_ptr.replaceHeader(&dwarf.debug_aranges.section, dwarf, header.items);
4598 try unit_ptr.replaceHeader(&dwarf.debug_aranges.section, dwarf, header_bw.buffer);
4599 try unit_ptr.writeTrailer(&dwarf.debug_aranges.section, dwarf);4533 try unit_ptr.writeTrailer(&dwarf.debug_aranges.section, dwarf);
4600 }4534 }
4601 dwarf.debug_aranges.section.dirty = false;4535 dwarf.debug_aranges.section.dirty = false;
...@@ -4610,33 +4544,31 @@ pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {...@@ -4610,33 +4544,31 @@ pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {
4610 dev.check(.x86_64_backend);4544 dev.check(.x86_64_backend);
4611 const Register = @import("../arch/x86_64/bits.zig").Register;4545 const Register = @import("../arch/x86_64/bits.zig").Register;
4612 for (dwarf.debug_frame.section.units.items) |*unit| {4546 for (dwarf.debug_frame.section.units.items) |*unit| {
4613 try header.resize(gpa, unit.header_len);4547 header.clearRetainingCapacity();
4614 header_bw = .fixed(header.items);4548 try header.ensureTotalCapacity(unit.header_len);
4615 const unit_len = unit.header_len - dwarf.unitLengthBytes();4549 const unit_len = unit.header_len - dwarf.unitLengthBytes();
4616 switch (dwarf.format) {4550 switch (dwarf.format) {
4617 .@"32" => header_bw.writeInt(u32, @intCast(unit_len), dwarf.endian) catch unreachable,4551 .@"32" => std.mem.writeInt(u32, header.addManyAsArrayAssumeCapacity(4), @intCast(unit_len), dwarf.endian),
4618 .@"64" => {4552 .@"64" => {
4619 header_bw.writeInt(u32, std.math.maxInt(u32), dwarf.endian) catch unreachable;4553 std.mem.writeInt(u32, header.addManyAsArrayAssumeCapacity(4), std.math.maxInt(u32), dwarf.endian);
4620 header_bw.writeInt(u64, unit_len, dwarf.endian) catch unreachable;4554 std.mem.writeInt(u64, header.addManyAsArrayAssumeCapacity(8), unit_len, dwarf.endian);
4621 },4555 },
4622 }4556 }
4623 header_bw.splatByteAll(0, 4) catch unreachable;4557 header.appendNTimesAssumeCapacity(0, 4);
4624 header_bw.writeByte(1) catch unreachable;4558 header.appendAssumeCapacity(1);
4625 header_bw.writeAll("zR\x00") catch unreachable;4559 header.appendSliceAssumeCapacity("zR\x00");
4626 header_bw.writeLeb128(dwarf.debug_frame.header.code_alignment_factor) catch unreachable;4560 uleb128(header.fixedWriter(), dwarf.debug_frame.header.code_alignment_factor) catch unreachable;
4627 header_bw.writeLeb128(dwarf.debug_frame.header.data_alignment_factor) catch unreachable;4561 sleb128(header.fixedWriter(), dwarf.debug_frame.header.data_alignment_factor) catch unreachable;
4628 header_bw.writeLeb128(dwarf.debug_frame.header.return_address_register) catch unreachable;4562 uleb128(header.fixedWriter(), dwarf.debug_frame.header.return_address_register) catch unreachable;
4629 header_bw.writeUleb128(1) catch unreachable;4563 uleb128(header.fixedWriter(), 1) catch unreachable;
4630 header_bw.writeByte(DW.EH.PE.pcrel | DW.EH.PE.sdata4) catch unreachable;4564 header.appendAssumeCapacity(DW.EH.PE.pcrel | DW.EH.PE.sdata4);
4631 header_bw.writeByte(DW.CFA.def_cfa_sf) catch unreachable;4565 header.appendAssumeCapacity(DW.CFA.def_cfa_sf);
4632 header_bw.writeUleb128(1) catch unreachable;4566 uleb128(header.fixedWriter(), Register.rsp.dwarfNum()) catch unreachable;
4633 header_bw.writeLeb128(Register.rsp.dwarfNum()) catch unreachable;4567 sleb128(header.fixedWriter(), -1) catch unreachable;
4634 header_bw.writeSleb128(-1) catch unreachable;4568 header.appendAssumeCapacity(@as(u8, DW.CFA.offset) + Register.rip.dwarfNum());
4635 header_bw.writeByte(@as(u8, DW.CFA.offset) + Register.rip.dwarfNum()) catch unreachable;4569 uleb128(header.fixedWriter(), 1) catch unreachable;
4636 header_bw.writeUleb128(1) catch unreachable;4570 header.appendNTimesAssumeCapacity(DW.CFA.nop, unit.header_len - header.items.len);
4637 header_bw.splatByteAll(DW.CFA.nop, unit.header_len - header_bw.end) catch unreachable;4571 try unit.replaceHeader(&dwarf.debug_frame.section, dwarf, header.items);
4638 assert(header_bw.end == header_bw.buffer.len);
4639 try unit.replaceHeader(&dwarf.debug_frame.section, dwarf, header_bw.buffer);
4640 try unit.writeTrailer(&dwarf.debug_frame.section, dwarf);4572 try unit.writeTrailer(&dwarf.debug_frame.section, dwarf);
4641 }4573 }
4642 },4574 },
...@@ -4649,84 +4581,83 @@ pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {...@@ -4649,84 +4581,83 @@ pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {
4649 for (dwarf.mods.keys(), dwarf.mods.values(), dwarf.debug_info.section.units.items, 0..) |mod, mod_info, *unit_ptr, unit_index| {4581 for (dwarf.mods.keys(), dwarf.mods.values(), dwarf.debug_info.section.units.items, 0..) |mod, mod_info, *unit_ptr, unit_index| {
4650 const unit: Unit.Index = @enumFromInt(unit_index);4582 const unit: Unit.Index = @enumFromInt(unit_index);
4651 unit_ptr.clear();4583 unit_ptr.clear();
4652 try unit_ptr.cross_unit_relocs.ensureTotalCapacity(gpa, 1);4584 try unit_ptr.cross_unit_relocs.ensureTotalCapacity(dwarf.gpa, 1);
4653 try unit_ptr.cross_section_relocs.ensureTotalCapacity(gpa, 7);4585 try unit_ptr.cross_section_relocs.ensureTotalCapacity(dwarf.gpa, 7);
4654 try header.resize(gpa, unit_ptr.header_len);4586 header.clearRetainingCapacity();
4655 header_bw = .fixed(header.items);4587 try header.ensureTotalCapacity(unit_ptr.header_len);
4656 const unit_len = (if (unit_ptr.next.unwrap()) |next_unit|4588 const unit_len = (if (unit_ptr.next.unwrap()) |next_unit|
4657 dwarf.debug_info.section.getUnit(next_unit).off4589 dwarf.debug_info.section.getUnit(next_unit).off
4658 else4590 else
4659 dwarf.debug_info.section.len) - unit_ptr.off - dwarf.unitLengthBytes();4591 dwarf.debug_info.section.len) - unit_ptr.off - dwarf.unitLengthBytes();
4660 switch (dwarf.format) {4592 switch (dwarf.format) {
4661 .@"32" => header_bw.writeInt(u32, @intCast(unit_len), dwarf.endian) catch unreachable,4593 .@"32" => std.mem.writeInt(u32, header.addManyAsArrayAssumeCapacity(4), @intCast(unit_len), dwarf.endian),
4662 .@"64" => {4594 .@"64" => {
4663 header_bw.writeInt(u32, std.math.maxInt(u32), dwarf.endian) catch unreachable;4595 std.mem.writeInt(u32, header.addManyAsArrayAssumeCapacity(4), std.math.maxInt(u32), dwarf.endian);
4664 header_bw.writeInt(u64, unit_len, dwarf.endian) catch unreachable;4596 std.mem.writeInt(u64, header.addManyAsArrayAssumeCapacity(8), unit_len, dwarf.endian);
4665 },4597 },
4666 }4598 }
4667 header_bw.writeInt(u16, 5, dwarf.endian) catch unreachable;4599 std.mem.writeInt(u16, header.addManyAsArrayAssumeCapacity(2), 5, dwarf.endian);
4668 header_bw.writeAll(&.{ DW.UT.compile, @intFromEnum(dwarf.address_size) }) catch unreachable;4600 header.appendSliceAssumeCapacity(&.{ DW.UT.compile, @intFromEnum(dwarf.address_size) });
4669 unit_ptr.cross_section_relocs.appendAssumeCapacity(.{4601 unit_ptr.cross_section_relocs.appendAssumeCapacity(.{
4670 .source_off = @intCast(header_bw.end),4602 .source_off = @intCast(header.items.len),
4671 .target_sec = .debug_abbrev,4603 .target_sec = .debug_abbrev,
4672 .target_unit = DebugAbbrev.unit,4604 .target_unit = DebugAbbrev.unit,
4673 });4605 });
4674 header_bw.splatByteAll(0, dwarf.sectionOffsetBytes()) catch unreachable;4606 header.appendNTimesAssumeCapacity(0, dwarf.sectionOffsetBytes());
4675 const compile_unit_off: u32 = @intCast(header_bw.end);4607 const compile_unit_off: u32 = @intCast(header.items.len);
4676 header_bw.writeLeb128(try dwarf.refAbbrevCode(.compile_unit)) catch unreachable;4608 uleb128(header.fixedWriter(), try dwarf.refAbbrevCode(.compile_unit)) catch unreachable;
4677 header_bw.writeByte(DW.LANG.Zig) catch unreachable;4609 header.appendAssumeCapacity(DW.LANG.Zig);
4678 unit_ptr.cross_section_relocs.appendAssumeCapacity(.{4610 unit_ptr.cross_section_relocs.appendAssumeCapacity(.{
4679 .source_off = @intCast(header_bw.end),4611 .source_off = @intCast(header.items.len),
4680 .target_sec = .debug_line_str,4612 .target_sec = .debug_line_str,
4681 .target_unit = StringSection.unit,4613 .target_unit = StringSection.unit,
4682 .target_entry = (try dwarf.debug_line_str.addString(dwarf, "zig " ++ @import("build_options").version)).toOptional(),4614 .target_entry = (try dwarf.debug_line_str.addString(dwarf, "zig " ++ @import("build_options").version)).toOptional(),
4683 });4615 });
4684 header_bw.splatByteAll(0, dwarf.sectionOffsetBytes()) catch unreachable;4616 header.appendNTimesAssumeCapacity(0, dwarf.sectionOffsetBytes());
4685 unit_ptr.cross_section_relocs.appendAssumeCapacity(.{4617 unit_ptr.cross_section_relocs.appendAssumeCapacity(.{
4686 .source_off = @intCast(header_bw.end),4618 .source_off = @intCast(header.items.len),
4687 .target_sec = .debug_line_str,4619 .target_sec = .debug_line_str,
4688 .target_unit = StringSection.unit,4620 .target_unit = StringSection.unit,
4689 .target_entry = mod_info.root_dir_path.toOptional(),4621 .target_entry = mod_info.root_dir_path.toOptional(),
4690 });4622 });
4691 header_bw.splatByteAll(0, dwarf.sectionOffsetBytes()) catch unreachable;4623 header.appendNTimesAssumeCapacity(0, dwarf.sectionOffsetBytes());
4692 unit_ptr.cross_section_relocs.appendAssumeCapacity(.{4624 unit_ptr.cross_section_relocs.appendAssumeCapacity(.{
4693 .source_off = @intCast(header_bw.end),4625 .source_off = @intCast(header.items.len),
4694 .target_sec = .debug_line_str,4626 .target_sec = .debug_line_str,
4695 .target_unit = StringSection.unit,4627 .target_unit = StringSection.unit,
4696 .target_entry = (try dwarf.debug_line_str.addString(dwarf, mod.root_src_path)).toOptional(),4628 .target_entry = (try dwarf.debug_line_str.addString(dwarf, mod.root_src_path)).toOptional(),
4697 });4629 });
4698 header_bw.splatByteAll(0, dwarf.sectionOffsetBytes()) catch unreachable;4630 header.appendNTimesAssumeCapacity(0, dwarf.sectionOffsetBytes());
4699 unit_ptr.cross_unit_relocs.appendAssumeCapacity(.{4631 unit_ptr.cross_unit_relocs.appendAssumeCapacity(.{
4700 .source_off = @intCast(header_bw.end),4632 .source_off = @intCast(header.items.len),
4701 .target_unit = .main,4633 .target_unit = .main,
4702 .target_off = compile_unit_off,4634 .target_off = compile_unit_off,
4703 });4635 });
4704 header_bw.splatByteAll(0, dwarf.sectionOffsetBytes()) catch unreachable;4636 header.appendNTimesAssumeCapacity(0, dwarf.sectionOffsetBytes());
4705 unit_ptr.cross_section_relocs.appendAssumeCapacity(.{4637 unit_ptr.cross_section_relocs.appendAssumeCapacity(.{
4706 .source_off = @intCast(header_bw.end),4638 .source_off = @intCast(header.items.len),
4707 .target_sec = .debug_line,4639 .target_sec = .debug_line,
4708 .target_unit = unit,4640 .target_unit = unit,
4709 });4641 });
4710 header_bw.splatByteAll(0, dwarf.sectionOffsetBytes()) catch unreachable;4642 header.appendNTimesAssumeCapacity(0, dwarf.sectionOffsetBytes());
4711 unit_ptr.cross_section_relocs.appendAssumeCapacity(.{4643 unit_ptr.cross_section_relocs.appendAssumeCapacity(.{
4712 .source_off = @intCast(header_bw.end),4644 .source_off = @intCast(header.items.len),
4713 .target_sec = .debug_rnglists,4645 .target_sec = .debug_rnglists,
4714 .target_unit = unit,4646 .target_unit = unit,
4715 .target_off = DebugRngLists.baseOffset(dwarf),4647 .target_off = DebugRngLists.baseOffset(dwarf),
4716 });4648 });
4717 header_bw.splatByteAll(0, dwarf.sectionOffsetBytes()) catch unreachable;4649 header.appendNTimesAssumeCapacity(0, dwarf.sectionOffsetBytes());
4718 header_bw.writeUleb128(0) catch unreachable;4650 uleb128(header.fixedWriter(), 0) catch unreachable;
4719 header_bw.writeLeb128(try dwarf.refAbbrevCode(.module)) catch unreachable;4651 uleb128(header.fixedWriter(), try dwarf.refAbbrevCode(.module)) catch unreachable;
4720 unit_ptr.cross_section_relocs.appendAssumeCapacity(.{4652 unit_ptr.cross_section_relocs.appendAssumeCapacity(.{
4721 .source_off = @intCast(header_bw.end),4653 .source_off = @intCast(header.items.len),
4722 .target_sec = .debug_str,4654 .target_sec = .debug_str,
4723 .target_unit = StringSection.unit,4655 .target_unit = StringSection.unit,
4724 .target_entry = (try dwarf.debug_str.addString(dwarf, mod.fully_qualified_name)).toOptional(),4656 .target_entry = (try dwarf.debug_str.addString(dwarf, mod.fully_qualified_name)).toOptional(),
4725 });4657 });
4726 header_bw.splatByteAll(0, dwarf.sectionOffsetBytes()) catch unreachable;4658 header.appendNTimesAssumeCapacity(0, dwarf.sectionOffsetBytes());
4727 header_bw.writeUleb128(0) catch unreachable;4659 uleb128(header.fixedWriter(), 0) catch unreachable;
4728 assert(header_bw.end == header_bw.buffer.len);4660 try unit_ptr.replaceHeader(&dwarf.debug_info.section, dwarf, header.items);
4729 try unit_ptr.replaceHeader(&dwarf.debug_info.section, dwarf, header_bw.buffer);
4730 try unit_ptr.writeTrailer(&dwarf.debug_info.section, dwarf);4661 try unit_ptr.writeTrailer(&dwarf.debug_info.section, dwarf);
4731 }4662 }
4732 dwarf.debug_info.section.dirty = false;4663 dwarf.debug_info.section.dirty = false;
...@@ -4750,37 +4681,33 @@ pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {...@@ -4750,37 +4681,33 @@ pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {
4750 );4681 );
4751 for (dwarf.mods.values(), dwarf.debug_line.section.units.items) |mod_info, *unit| {4682 for (dwarf.mods.values(), dwarf.debug_line.section.units.items) |mod_info, *unit| {
4752 unit.clear();4683 unit.clear();
4753 try unit.cross_section_relocs.ensureTotalCapacity(gpa, mod_info.dirs.count() + 2 * (mod_info.files.count()));4684 try unit.cross_section_relocs.ensureTotalCapacity(dwarf.gpa, mod_info.dirs.count() + 2 * (mod_info.files.count()));
4754 try header.resize(gpa, unit.header_len);4685 header.clearRetainingCapacity();
4755 header_bw = .fixed(header.items);4686 try header.ensureTotalCapacity(unit.header_len);
4756 const unit_len = (if (unit.next.unwrap()) |next_unit|4687 const unit_len = (if (unit.next.unwrap()) |next_unit|
4757 dwarf.debug_line.section.getUnit(next_unit).off4688 dwarf.debug_line.section.getUnit(next_unit).off
4758 else4689 else
4759 dwarf.debug_line.section.len) - unit.off - dwarf.unitLengthBytes();4690 dwarf.debug_line.section.len) - unit.off - dwarf.unitLengthBytes();
4760 switch (dwarf.format) {4691 switch (dwarf.format) {
4761 .@"32" => header_bw.writeInt(u32, @intCast(unit_len), dwarf.endian) catch unreachable,4692 .@"32" => std.mem.writeInt(u32, header.addManyAsArrayAssumeCapacity(4), @intCast(unit_len), dwarf.endian),
4762 .@"64" => {4693 .@"64" => {
4763 header_bw.writeInt(u32, std.math.maxInt(u32), dwarf.endian) catch unreachable;4694 std.mem.writeInt(u32, header.addManyAsArrayAssumeCapacity(4), std.math.maxInt(u32), dwarf.endian);
4764 header_bw.writeInt(u64, unit_len, dwarf.endian) catch unreachable;4695 std.mem.writeInt(u64, header.addManyAsArrayAssumeCapacity(8), unit_len, dwarf.endian);
4765 },4696 },
4766 }4697 }
4767 header_bw.writeInt(u16, 5, dwarf.endian) catch unreachable;4698 std.mem.writeInt(u16, header.addManyAsArrayAssumeCapacity(2), 5, dwarf.endian);
4768 header_bw.writeAll(&.{ @intFromEnum(dwarf.address_size), 0 }) catch unreachable;4699 header.appendSliceAssumeCapacity(&.{ @intFromEnum(dwarf.address_size), 0 });
4769 dwarf.writeIntTo(4700 dwarf.writeInt(header.addManyAsSliceAssumeCapacity(dwarf.sectionOffsetBytes()), unit.header_len - header.items.len);
4770 &header_bw,
4771 dwarf.sectionOffsetBytes(),
4772 unit.header_len - header_bw.end,
4773 ) catch unreachable;
4774 const StandardOpcode = DeclValEnum(DW.LNS);4701 const StandardOpcode = DeclValEnum(DW.LNS);
4775 header_bw.writeAll(&.{4702 header.appendSliceAssumeCapacity(&[_]u8{
4776 dwarf.debug_line.header.minimum_instruction_length,4703 dwarf.debug_line.header.minimum_instruction_length,
4777 dwarf.debug_line.header.maximum_operations_per_instruction,4704 dwarf.debug_line.header.maximum_operations_per_instruction,
4778 @intFromBool(dwarf.debug_line.header.default_is_stmt),4705 @intFromBool(dwarf.debug_line.header.default_is_stmt),
4779 @bitCast(dwarf.debug_line.header.line_base),4706 @bitCast(dwarf.debug_line.header.line_base),
4780 dwarf.debug_line.header.line_range,4707 dwarf.debug_line.header.line_range,
4781 dwarf.debug_line.header.opcode_base,4708 dwarf.debug_line.header.opcode_base,
4782 }) catch unreachable;4709 });
4783 header_bw.writeAll(std.enums.EnumArray(StandardOpcode, u8).init(.{4710 header.appendSliceAssumeCapacity(std.enums.EnumArray(StandardOpcode, u8).init(.{
4784 .extended_op = undefined,4711 .extended_op = undefined,
4785 .copy = 0,4712 .copy = 0,
4786 .advance_pc = 1,4713 .advance_pc = 1,
...@@ -4794,45 +4721,44 @@ pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {...@@ -4794,45 +4721,44 @@ pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {
4794 .set_prologue_end = 0,4721 .set_prologue_end = 0,
4795 .set_epilogue_begin = 0,4722 .set_epilogue_begin = 0,
4796 .set_isa = 1,4723 .set_isa = 1,
4797 }).values[1..dwarf.debug_line.header.opcode_base]) catch unreachable;4724 }).values[1..dwarf.debug_line.header.opcode_base]);
4798 header_bw.writeByte(1) catch unreachable;4725 header.appendAssumeCapacity(1);
4799 header_bw.writeLeb128(@as(u14, DW.LNCT.path)) catch unreachable;4726 uleb128(header.fixedWriter(), DW.LNCT.path) catch unreachable;
4800 header_bw.writeLeb128(@as(u13, DW.FORM.line_strp)) catch unreachable;4727 uleb128(header.fixedWriter(), DW.FORM.line_strp) catch unreachable;
4801 header_bw.writeLeb128(mod_info.dirs.count()) catch unreachable;4728 uleb128(header.fixedWriter(), mod_info.dirs.count()) catch unreachable;
4802 for (mod_info.dirs.keys()) |dir_unit| {4729 for (mod_info.dirs.keys()) |dir_unit| {
4803 unit.cross_section_relocs.appendAssumeCapacity(.{4730 unit.cross_section_relocs.appendAssumeCapacity(.{
4804 .source_off = @intCast(header_bw.end),4731 .source_off = @intCast(header.items.len),
4805 .target_sec = .debug_line_str,4732 .target_sec = .debug_line_str,
4806 .target_unit = StringSection.unit,4733 .target_unit = StringSection.unit,
4807 .target_entry = dwarf.getModInfo(dir_unit).root_dir_path.toOptional(),4734 .target_entry = dwarf.getModInfo(dir_unit).root_dir_path.toOptional(),
4808 });4735 });
4809 header_bw.splatByteAll(0, dwarf.sectionOffsetBytes()) catch unreachable;4736 header.appendNTimesAssumeCapacity(0, dwarf.sectionOffsetBytes());
4810 }4737 }
4811 const dir_index_info = DebugLine.dirIndexInfo(@intCast(mod_info.dirs.count()));4738 const dir_index_info = DebugLine.dirIndexInfo(@intCast(mod_info.dirs.count()));
4812 header_bw.writeByte(3) catch unreachable;4739 header.appendAssumeCapacity(3);
4813 header_bw.writeLeb128(@as(u14, DW.LNCT.path)) catch unreachable;4740 uleb128(header.fixedWriter(), DW.LNCT.path) catch unreachable;
4814 header_bw.writeLeb128(@as(u13, DW.FORM.line_strp)) catch unreachable;4741 uleb128(header.fixedWriter(), DW.FORM.line_strp) catch unreachable;
4815 header_bw.writeLeb128(@as(u14, DW.LNCT.directory_index)) catch unreachable;4742 uleb128(header.fixedWriter(), DW.LNCT.directory_index) catch unreachable;
4816 header_bw.writeLeb128(@intFromEnum(dir_index_info.form)) catch unreachable;4743 uleb128(header.fixedWriter(), @intFromEnum(dir_index_info.form)) catch unreachable;
4817 header_bw.writeLeb128(@as(u14, DW.LNCT.LLVM_source)) catch unreachable;4744 uleb128(header.fixedWriter(), DW.LNCT.LLVM_source) catch unreachable;
4818 header_bw.writeLeb128(@as(u13, DW.FORM.line_strp)) catch unreachable;4745 uleb128(header.fixedWriter(), DW.FORM.line_strp) catch unreachable;
4819 header_bw.writeLeb128(mod_info.files.count()) catch unreachable;4746 uleb128(header.fixedWriter(), mod_info.files.count()) catch unreachable;
4820 for (mod_info.files.keys()) |file_index| {4747 for (mod_info.files.keys()) |file_index| {
4821 const file = zcu.fileByIndex(file_index);4748 const file = zcu.fileByIndex(file_index);
4822 unit.cross_section_relocs.appendAssumeCapacity(.{4749 unit.cross_section_relocs.appendAssumeCapacity(.{
4823 .source_off = @intCast(header_bw.end),4750 .source_off = @intCast(header.items.len),
4824 .target_sec = .debug_line_str,4751 .target_sec = .debug_line_str,
4825 .target_unit = StringSection.unit,4752 .target_unit = StringSection.unit,
4826 .target_entry = (try dwarf.debug_line_str.addString(dwarf, file.sub_file_path)).toOptional(),4753 .target_entry = (try dwarf.debug_line_str.addString(dwarf, file.sub_file_path)).toOptional(),
4827 });4754 });
4828 header.appendNTimesAssumeCapacity(0, dwarf.sectionOffsetBytes());4755 header.appendNTimesAssumeCapacity(0, dwarf.sectionOffsetBytes());
4829 dwarf.writeIntTo(4756 dwarf.writeInt(
4830 &header_bw,4757 header.addManyAsSliceAssumeCapacity(dir_index_info.bytes),
4831 dir_index_info.bytes,
4832 mod_info.dirs.getIndex(dwarf.getUnitIfExists(file.mod.?).?) orelse 0,4758 mod_info.dirs.getIndex(dwarf.getUnitIfExists(file.mod.?).?) orelse 0,
4833 );4759 );
4834 unit.cross_section_relocs.appendAssumeCapacity(.{4760 unit.cross_section_relocs.appendAssumeCapacity(.{
4835 .source_off = @intCast(header_bw.end),4761 .source_off = @intCast(header.items.len),
4836 .target_sec = .debug_line_str,4762 .target_sec = .debug_line_str,
4837 .target_unit = StringSection.unit,4763 .target_unit = StringSection.unit,
4838 .target_entry = (try dwarf.debug_line_str.addString(4764 .target_entry = (try dwarf.debug_line_str.addString(
...@@ -4840,10 +4766,9 @@ pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {...@@ -4840,10 +4766,9 @@ pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {
4840 if (file.is_builtin) file.source.? else "",4766 if (file.is_builtin) file.source.? else "",
4841 )).toOptional(),4767 )).toOptional(),
4842 });4768 });
4843 header_bw.splatByteAll(0, dwarf.sectionOffsetBytes()) catch unreachable;4769 header.appendNTimesAssumeCapacity(0, dwarf.sectionOffsetBytes());
4844 }4770 }
4845 assert(header_bw.end == header_bw.buffer.len);4771 try unit.replaceHeader(&dwarf.debug_line.section, dwarf, header.items);
4846 try unit.replaceHeader(&dwarf.debug_line.section, dwarf, header_bw.buffer);
4847 try unit.writeTrailer(&dwarf.debug_line.section, dwarf);4772 try unit.writeTrailer(&dwarf.debug_line.section, dwarf);
4848 }4773 }
4849 dwarf.debug_line.section.dirty = false;4774 dwarf.debug_line.section.dirty = false;
...@@ -4859,25 +4784,24 @@ pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {...@@ -4859,25 +4784,24 @@ pub fn flush(dwarf: *Dwarf, pt: Zcu.PerThread) FlushError!void {
4859 }4784 }
4860 if (dwarf.debug_rnglists.section.dirty) {4785 if (dwarf.debug_rnglists.section.dirty) {
4861 for (dwarf.debug_rnglists.section.units.items) |*unit| {4786 for (dwarf.debug_rnglists.section.units.items) |*unit| {
4862 try header.resize(gpa, unit.header_len);4787 header.clearRetainingCapacity();
4863 header_bw = .fixed(header.items);4788 try header.ensureTotalCapacity(unit.header_len);
4864 const unit_len = (if (unit.next.unwrap()) |next_unit|4789 const unit_len = (if (unit.next.unwrap()) |next_unit|
4865 dwarf.debug_rnglists.section.getUnit(next_unit).off4790 dwarf.debug_rnglists.section.getUnit(next_unit).off
4866 else4791 else
4867 dwarf.debug_rnglists.section.len) - unit.off - dwarf.unitLengthBytes();4792 dwarf.debug_rnglists.section.len) - unit.off - dwarf.unitLengthBytes();
4868 switch (dwarf.format) {4793 switch (dwarf.format) {
4869 .@"32" => header_bw.writeInt(u32, @intCast(unit_len), dwarf.endian) catch unreachable,4794 .@"32" => std.mem.writeInt(u32, header.addManyAsArrayAssumeCapacity(4), @intCast(unit_len), dwarf.endian),
4870 .@"64" => {4795 .@"64" => {
4871 header_bw.writeInt(u32, std.math.maxInt(u32), dwarf.endian) catch unreachable;4796 std.mem.writeInt(u32, header.addManyAsArrayAssumeCapacity(4), std.math.maxInt(u32), dwarf.endian);
4872 header_bw.writeInt(u64, unit_len, dwarf.endian) catch unreachable;4797 std.mem.writeInt(u64, header.addManyAsArrayAssumeCapacity(8), unit_len, dwarf.endian);
4873 },4798 },
4874 }4799 }
4875 header_bw.writeInt(u16, 5, dwarf.endian) catch unreachable;4800 std.mem.writeInt(u16, header.addManyAsArrayAssumeCapacity(2), 5, dwarf.endian);
4876 header_bw.writeAll(&.{ @intFromEnum(dwarf.address_size), 0 }) catch unreachable;4801 header.appendSliceAssumeCapacity(&.{ @intFromEnum(dwarf.address_size), 0 });
4877 header_bw.writeInt(u32, 1, dwarf.endian) catch unreachable;4802 std.mem.writeInt(u32, header.addManyAsArrayAssumeCapacity(4), 1, dwarf.endian);
4878 dwarf.writeIntTo(&header_bw, dwarf.sectionOffsetBytes(), dwarf.sectionOffsetBytes() * 1) catch unreachable;4803 dwarf.writeInt(header.addManyAsSliceAssumeCapacity(dwarf.sectionOffsetBytes()), dwarf.sectionOffsetBytes() * 1);
4879 assert(header_bw.end == header_bw.buffer.len);4804 try unit.replaceHeader(&dwarf.debug_rnglists.section, dwarf, header.items);
4880 try unit.replaceHeader(&dwarf.debug_rnglists.section, dwarf, header_bw.buffer);
4881 try unit.writeTrailer(&dwarf.debug_rnglists.section, dwarf);4805 try unit.writeTrailer(&dwarf.debug_rnglists.section, dwarf);
4882 }4806 }
4883 dwarf.debug_rnglists.section.dirty = false;4807 dwarf.debug_rnglists.section.dirty = false;
...@@ -6076,10 +6000,6 @@ fn writeInt(dwarf: *Dwarf, buf: []u8, int: u64) void {...@@ -6076,10 +6000,6 @@ fn writeInt(dwarf: *Dwarf, buf: []u8, int: u64) void {
6076 }6000 }
6077}6001}
60786002
6079fn writeIntTo(dwarf: *Dwarf, bw: *Writer, len: usize, int: u64) !void {
6080 dwarf.writeInt(try bw.writableSlice(len), int);
6081}
6082
6083fn resolveReloc(dwarf: *Dwarf, source: u64, target: u64, size: u32) RelocError!void {6003fn resolveReloc(dwarf: *Dwarf, source: u64, target: u64, size: u32) RelocError!void {
6084 var buf: [8]u8 = undefined;6004 var buf: [8]u8 = undefined;
6085 dwarf.writeInt(buf[0..size], target);6005 dwarf.writeInt(buf[0..size], target);
...@@ -6106,6 +6026,7 @@ fn uleb128Bytes(value: anytype) u32 {...@@ -6106,6 +6026,7 @@ fn uleb128Bytes(value: anytype) u32 {
6106 d.writer.writeUleb128(value) catch unreachable;6026 d.writer.writeUleb128(value) catch unreachable;
6107 return @intCast(d.count + d.writer.end);6027 return @intCast(d.count + d.writer.end);
6108}6028}
6029
6109fn sleb128Bytes(value: anytype) u32 {6030fn sleb128Bytes(value: anytype) u32 {
6110 var trash_buffer: [64]u8 = undefined;6031 var trash_buffer: [64]u8 = undefined;
6111 var d: std.Io.Writer.Discarding = .init(&trash_buffer);6032 var d: std.Io.Writer.Discarding = .init(&trash_buffer);
...@@ -6132,7 +6053,7 @@ const codegen = @import("../codegen.zig");...@@ -6132,7 +6053,7 @@ const codegen = @import("../codegen.zig");
6132const dev = @import("../dev.zig");6053const dev = @import("../dev.zig");
6133const link = @import("../link.zig");6054const link = @import("../link.zig");
6134const log = std.log.scoped(.dwarf);6055const log = std.log.scoped(.dwarf);
6056const sleb128 = std.leb.writeIleb128;
6135const std = @import("std");6057const std = @import("std");
6136const target_info = @import("../target.zig");6058const target_info = @import("../target.zig");
6137const Allocator = std.mem.Allocator;6059const uleb128 = std.leb.writeUleb128;
6138const Writer = std.io.Writer;