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