| author | |
| committer | |
| log | a059c9a5e57164338bf4b99728905882b0d6323c |
| tree | f88220844871861ef457de9ca3ed8aaf17a87089 |
| parent | 5637ede041a9b8b0a050343be5392f97994f6777 |
This saves another ~70MB.3 files changed, 229 insertions(+), 59 deletions(-)
src/codegen/x86_64/Emit.zig+18-13| ... | ... | @@ -552,9 +552,9 @@ pub fn emitMir(emit: *Emit) Error!void { |
| 552 | 552 | .pseudo_dbg_var_m, |
| 553 | 553 | => switch (emit.debug_output) { |
| 554 | 554 | inline .dwarf, .dwarf2 => |dwarf, tag| { |
| 555 | const DwarfLoc = switch (tag) { | |
| 556 | .dwarf => link.File.Dwarf.Loc, | |
| 557 | .dwarf2 => link.File.Dwarf2.Loc, | |
| 555 | const DwarfLoc, const addr_loc = switch (tag) { | |
| 556 | .dwarf => .{ link.File.Dwarf.Loc, "addr_reloc" }, | |
| 557 | .dwarf2 => .{ link.File.Dwarf2.Loc, "addrx_sym" }, | |
| 558 | 558 | .eh_frame, .none => comptime unreachable, |
| 559 | 559 | }; |
| 560 | 560 | var loc_buf: [2]DwarfLoc = undefined; |
| ... | ... | @@ -597,16 +597,21 @@ pub fn emitMir(emit: *Emit) Error!void { |
| 597 | 597 | .none => .{ .constu = 0 }, |
| 598 | 598 | .reg => |reg| .{ .breg = reg.dwarfNum() }, |
| 599 | 599 | .frame, .table, .rip_inst => unreachable, |
| 600 | .nav => |nav| .{ .addr_reloc = try codegen.genNavRef( | |
| 601 | emit.bin_file, | |
| 602 | emit.pt, | |
| 603 | nav, | |
| 604 | ) }, | |
| 605 | .uav => |uav| .{ .addr_reloc = try emit.bin_file.lowerUav( | |
| 606 | emit.pt, | |
| 607 | uav.val, | |
| 608 | Type.fromInterned(uav.orig_ty).ptrAlignment(emit.pt.zcu), | |
| 609 | ) }, | |
| 600 | .nav => |nav| @unionInit( | |
| 601 | DwarfLoc, | |
| 602 | addr_loc, | |
| 603 | try codegen.genNavRef(emit.bin_file, emit.pt, nav), | |
| 604 | ), | |
| 605 | .uav => |uav| @unionInit( | |
| 606 | DwarfLoc, | |
| 607 | addr_loc, | |
| 608 | try emit.bin_file.lowerUav( | |
| 609 | emit.pt, | |
| 610 | uav.val, | |
| 611 | Type.fromInterned(uav.orig_ty) | |
| 612 | .ptrAlignment(emit.pt.zcu), | |
| 613 | ), | |
| 614 | ), | |
| 610 | 615 | .lazy_sym, .extern_func => unreachable, |
| 611 | 616 | }; |
| 612 | 617 | break :base &loc_buf[0]; |
src/link/Dwarf2.zig+108-28| ... | ... | @@ -13,6 +13,7 @@ decls: std.array_hash_map.Auto(InternPool.TrackedInst.Index, Decl), |
| 13 | 13 | pending_decl: struct { di: Decl.Index, instance: Decl.Instance }, |
| 14 | 14 | |
| 15 | 15 | debug_abbrev: Abbrev, |
| 16 | debug_addr: Addr, | |
| 16 | 17 | frame: Frame, |
| 17 | 18 | debug_info: Info, |
| 18 | 19 | debug_line: Line, |
| ... | ... | @@ -182,6 +183,29 @@ pub const Abbrev = struct { |
| 182 | 183 | set: std.enums.EnumSet(AbbrevCode), |
| 183 | 184 | }; |
| 184 | 185 | |
| 186 | pub const Addr = struct { | |
| 187 | ni: link.MappedFile.Node.Index.Optional, | |
| 188 | pending_index: usize, | |
| 189 | map: std.array_hash_map.Auto(link.File.SymbolId, void), | |
| 190 | ||
| 191 | fn get(a: *Addr, gpa: std.mem.Allocator, si: link.File.SymbolId) std.mem.Allocator.Error!usize { | |
| 192 | const gop = try a.map.getOrPut(gpa, si); | |
| 193 | return gop.index; | |
| 194 | } | |
| 195 | ||
| 196 | fn tableOffset(dwarf: *Dwarf) usize { | |
| 197 | return dwarf.unitLengthSize() + 2 + 1 + 1; | |
| 198 | } | |
| 199 | ||
| 200 | pub fn size(a: *Addr, dwarf: *Dwarf) usize { | |
| 201 | return tableOffset(dwarf) + @backingInt(dwarf.address_size) * a.pending_index; | |
| 202 | } | |
| 203 | ||
| 204 | pub fn anyPending(a: *Addr) bool { | |
| 205 | return a.map.count() - a.pending_index > 0; | |
| 206 | } | |
| 207 | }; | |
| 208 | ||
| 185 | 209 | pub const Info = struct {}; |
| 186 | 210 | |
| 187 | 211 | pub const Line = struct { |
| ... | ... | @@ -274,12 +298,14 @@ pub const StrOffsets = struct { |
| 274 | 298 | ) link.Error!usize { |
| 275 | 299 | const comp = dwarf.lf.comp; |
| 276 | 300 | try so.map.ensureUnusedCapacity(comp.gpa, 1); |
| 277 | return so.map.getOrPutAssumeCapacity(s.get(comp.gpa, mf, str) catch |err| switch (err) { | |
| 301 | const offset = s.get(comp.gpa, mf, str) catch |err| switch (err) { | |
| 278 | 302 | else => |e| return e, |
| 279 | 303 | error.MappedFileIo => return comp.link_diags.fail("failed to write output file: {t}", .{ |
| 280 | 304 | mf.io_err.?, |
| 281 | 305 | }), |
| 282 | }).index; | |
| 306 | }; | |
| 307 | const gop = so.map.getOrPutAssumeCapacity(offset); | |
| 308 | return gop.index; | |
| 283 | 309 | } |
| 284 | 310 | |
| 285 | 311 | fn tableOffset(dwarf: *Dwarf) usize { |
| ... | ... | @@ -289,13 +315,20 @@ pub const StrOffsets = struct { |
| 289 | 315 | pub fn size(so: *StrOffsets, dwarf: *Dwarf) usize { |
| 290 | 316 | return tableOffset(dwarf) + dwarf.secOffsetSize() * so.pending_index; |
| 291 | 317 | } |
| 318 | ||
| 319 | pub fn anyPending(so: *StrOffsets) bool { | |
| 320 | return so.map.count() - so.pending_index > 0; | |
| 321 | } | |
| 292 | 322 | }; |
| 293 | 323 | |
| 294 | 324 | pub const SharedSection = enum { debug_abbrev, debug_line_str, debug_str }; |
| 295 | 325 | |
| 296 | 326 | pub const Loc = union(enum) { |
| 297 | 327 | empty, |
| 298 | addr_reloc: link.File.SymbolId, | |
| 328 | addr_sym: struct { | |
| 329 | si: link.File.SymbolId, | |
| 330 | offset: usize = 0, | |
| 331 | }, | |
| 299 | 332 | deref: *const Loc, |
| 300 | 333 | constu: u64, |
| 301 | 334 | consts: i64, |
| ... | ... | @@ -314,6 +347,8 @@ pub const Loc = union(enum) { |
| 314 | 347 | node: link.MappedFile.Node.Index, |
| 315 | 348 | offset: i65 = 0, |
| 316 | 349 | }, |
| 350 | addrx_sym: link.File.SymbolId, | |
| 351 | constx_sym: link.File.SymbolId, | |
| 317 | 352 | wasm_ext: union(enum) { |
| 318 | 353 | local: u32, |
| 319 | 354 | global: u32, |
| ... | ... | @@ -356,11 +391,11 @@ pub const Loc = union(enum) { |
| 356 | 391 | }; |
| 357 | 392 | switch (loc) { |
| 358 | 393 | .empty => {}, |
| 359 | .addr_reloc => |si| { | |
| 394 | .addr_sym => |sym| { | |
| 360 | 395 | try w.writeByte(DW.OP.addr); |
| 361 | 396 | switch (writer) { |
| 362 | 397 | .io => try dwarf.addrPlaceholder(w), |
| 363 | .mf => |nw| try dwarf.addrSym(nw, si, 0), | |
| 398 | .mf => |nw| try dwarf.addrSym(nw, sym.si, sym.offset), | |
| 364 | 399 | } |
| 365 | 400 | }, |
| 366 | 401 | .deref => |addr| { |
| ... | ... | @@ -479,6 +514,14 @@ pub const Loc = union(enum) { |
| 479 | 514 | } |
| 480 | 515 | try w.writeSleb128(implicit_pointer.offset); |
| 481 | 516 | }, |
| 517 | .addrx_sym => |si| { | |
| 518 | try w.writeByte(DW.OP.addrx); | |
| 519 | try dwarf.addrxSym(w, si); | |
| 520 | }, | |
| 521 | .constx_sym => |si| { | |
| 522 | try w.writeByte(DW.OP.constx); | |
| 523 | try dwarf.addrxSym(w, si); | |
| 524 | }, | |
| 482 | 525 | .wasm_ext => |wasm_ext| { |
| 483 | 526 | try w.writeByte(DW.OP.WASM_location); |
| 484 | 527 | switch (wasm_ext) { |
| ... | ... | @@ -731,14 +774,16 @@ pub const WipFunc = struct { |
| 731 | 774 | .@"extern", .@"export" => nav.name, |
| 732 | 775 | }.toSlice(ip)); |
| 733 | 776 | try dwarf.refType(pt, di_nw, .fromInterned(func_type.return_type)); |
| 734 | try dwarf.addrSym(di_nw, debug.wip_func.func_si, 0); | |
| 777 | try dwarf.addrxSym(di_w, debug.wip_func.func_si); | |
| 735 | 778 | debug.info_func_length_offset = di_w.end; |
| 736 | 779 | try di_w.writeInt(u32, undefined, dwarf.endian); |
| 737 | 780 | try di_w.writeUleb128( |
| 738 | 781 | target_info.minFunctionAlignment(target).max(nav.resolved.?.@"align").toByteUnits().?, |
| 739 | 782 | ); |
| 740 | try di_w.writeByte(@intFromBool(decl.linkage != .normal)); | |
| 741 | try di_w.writeByte(@intFromBool(Type.fromInterned(func_type.return_type).isNoReturn(zcu))); | |
| 783 | try di_w.writeAll(&.{ | |
| 784 | @intFromBool(decl.linkage != .normal), | |
| 785 | @intFromBool(Type.fromInterned(func_type.return_type).isNoReturn(zcu)), | |
| 786 | }); | |
| 742 | 787 | } |
| 743 | 788 | |
| 744 | 789 | pub fn startDebugLine(debug: *Debug) link.Error!void { |
| ... | ... | @@ -1284,6 +1329,11 @@ pub fn init(lf: *link.File, format: DW.Format) Dwarf { |
| 1284 | 1329 | .end = 0, |
| 1285 | 1330 | .set = .empty, |
| 1286 | 1331 | }, |
| 1332 | .debug_addr = .{ | |
| 1333 | .ni = .none, | |
| 1334 | .pending_index = 0, | |
| 1335 | .map = .empty, | |
| 1336 | }, | |
| 1287 | 1337 | .frame = .{ |
| 1288 | 1338 | .header = if (target.cpu.arch == .x86_64 and target.ofmt == .elf) header: { |
| 1289 | 1339 | dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); |
| ... | ... | @@ -1353,6 +1403,7 @@ pub fn deinit(dwarf: *Dwarf) void { |
| 1353 | 1403 | dwarf.globals.deinit(gpa); |
| 1354 | 1404 | dwarf.funcs.deinit(gpa); |
| 1355 | 1405 | dwarf.decls.deinit(gpa); |
| 1406 | dwarf.debug_addr.map.deinit(gpa); | |
| 1356 | 1407 | dwarf.debug_line_str.map.deinit(gpa); |
| 1357 | 1408 | dwarf.debug_str.map.deinit(gpa); |
| 1358 | 1409 | dwarf.debug_str_offsets.map.deinit(gpa); |
| ... | ... | @@ -1620,6 +1671,24 @@ pub fn genUnitPadding(dwarf: *Dwarf, w: *std.Io.Writer) std.Io.Writer.Error!void |
| 1620 | 1671 | try w.writeInt(u16, 0, dwarf.endian); |
| 1621 | 1672 | } |
| 1622 | 1673 | |
| 1674 | pub fn genDebugAddrHeader(dwarf: *Dwarf, dah_w: *std.Io.Writer) std.Io.Writer.Error!void { | |
| 1675 | try dwarf.genUnitLength(dah_w); | |
| 1676 | try dah_w.writeInt(u16, 5, dwarf.endian); | |
| 1677 | try dah_w.writeAll(&.{ @backingInt(dwarf.address_size), 0 }); | |
| 1678 | assert(dah_w.end == Addr.tableOffset(dwarf)); | |
| 1679 | } | |
| 1680 | ||
| 1681 | pub fn genPendingDebugAddr(dwarf: *Dwarf, da_nw: *link.MappedFile.Node.Writer) link.Error!void { | |
| 1682 | da_nw.interface.end = dwarf.debug_addr.size(dwarf); | |
| 1683 | for (dwarf.debug_addr.map.keys()[dwarf.debug_addr.pending_index..]) |si| { | |
| 1684 | dwarf.addrSym(da_nw, si, 0) catch |err| switch (err) { | |
| 1685 | else => |e| return e, | |
| 1686 | error.WriteFailed => return dwarf.reportWriteError(da_nw), | |
| 1687 | }; | |
| 1688 | dwarf.debug_addr.pending_index += 1; | |
| 1689 | } | |
| 1690 | } | |
| 1691 | ||
| 1623 | 1692 | pub const EhFrameHdr = extern struct { |
| 1624 | 1693 | version: u8, |
| 1625 | 1694 | eh_frame_ptr_enc: std.dwarf.EH.PE, |
| ... | ... | @@ -1675,11 +1744,7 @@ pub fn genDebugFrameCie( |
| 1675 | 1744 | const Register = @import("../codegen/x86_64/bits.zig").Register; |
| 1676 | 1745 | switch (format) { |
| 1677 | 1746 | .eh_frame => try df_w.writeAll("zR\x00"), |
| 1678 | .debug_frame => { | |
| 1679 | try df_w.writeAll("\x00"); | |
| 1680 | try df_w.writeByte(@backingInt(dwarf.address_size)); | |
| 1681 | try df_w.writeByte(0); | |
| 1682 | }, | |
| 1747 | .debug_frame => try df_w.writeAll("\x00" ++ .{ @backingInt(dwarf.address_size), 0 }), | |
| 1683 | 1748 | } |
| 1684 | 1749 | try df_w.writeUleb128(dwarf.frame.header.code_alignment_factor); |
| 1685 | 1750 | try df_w.writeSleb128(dwarf.frame.header.data_alignment_factor); |
| ... | ... | @@ -1726,8 +1791,7 @@ pub fn genDebugInfoHeader( |
| 1726 | 1791 | if (!unit.alive) return dwarf.genUnitPadding(dih_w); |
| 1727 | 1792 | try dwarf.genUnitLength(dih_w); |
| 1728 | 1793 | try dih_w.writeInt(u16, 5, dwarf.endian); |
| 1729 | try dih_w.writeByte(DW.UT.compile); | |
| 1730 | try dih_w.writeByte(@backingInt(dwarf.address_size)); | |
| 1794 | try dih_w.writeAll(&.{ DW.UT.compile, @backingInt(dwarf.address_size) }); | |
| 1731 | 1795 | try dwarf.secOffset(dih_nw, dwarf.debug_abbrev.ni.unwrap().?, 0); |
| 1732 | 1796 | const compile_unit_offset = dih_w.end; |
| 1733 | 1797 | try dwarf.abbrevCode(dih_nw, .compile_unit); |
| ... | ... | @@ -1738,6 +1802,7 @@ pub fn genDebugInfoHeader( |
| 1738 | 1802 | compile_unit_offset, |
| 1739 | 1803 | ); |
| 1740 | 1804 | try dwarf.secOffset(dih_nw, unit.debug_line_header_ni.unwrap().?, 0); |
| 1805 | try dwarf.secOffset(dih_nw, dwarf.debug_addr.ni.unwrap().?, Addr.tableOffset(dwarf)); | |
| 1741 | 1806 | try dwarf.secOffset(dih_nw, unit.debug_rnglists_ni.unwrap().?, Rnglists.tableOffset(dwarf)); |
| 1742 | 1807 | try dwarf.secOffset(dih_nw, dwarf.debug_str_offsets.ni.unwrap().?, StrOffsets.tableOffset(dwarf)); |
| 1743 | 1808 | try dwarf.strx1(dih_nw, "zig " ++ @import("build_options").version); |
| ... | ... | @@ -1818,8 +1883,7 @@ pub fn genDebugLineHeader( |
| 1818 | 1883 | const dlh_w = &dlh_nw.interface; |
| 1819 | 1884 | try dwarf.genUnitLength(dlh_w); |
| 1820 | 1885 | try dlh_w.writeInt(u16, 5, dwarf.endian); |
| 1821 | try dlh_w.writeByte(@backingInt(dwarf.address_size)); | |
| 1822 | try dlh_w.writeByte(0); | |
| 1886 | try dlh_w.writeAll(&.{ @backingInt(dwarf.address_size), 0 }); | |
| 1823 | 1887 | const header_length_offset = dlh_w.end; |
| 1824 | 1888 | switch (dwarf.format) { |
| 1825 | 1889 | .@"32" => try dlh_w.writeInt(u32, undefined, dwarf.endian), |
| ... | ... | @@ -1950,8 +2014,7 @@ pub fn genDebugRnglistsHeader( |
| 1950 | 2014 | const drh_w = &drh_nw.interface; |
| 1951 | 2015 | try dwarf.genUnitLength(drh_w); |
| 1952 | 2016 | try drh_w.writeInt(u16, 5, dwarf.endian); |
| 1953 | try drh_w.writeByte(@backingInt(dwarf.address_size)); | |
| 1954 | try drh_w.writeByte(0); | |
| 2017 | try drh_w.writeAll(&.{ @backingInt(dwarf.address_size), 0 }); | |
| 1955 | 2018 | try drh_w.writeInt(u32, 1, dwarf.endian); |
| 1956 | 2019 | assert(drh_w.end == Rnglists.tableOffset(dwarf)); |
| 1957 | 2020 | switch (dwarf.format) { |
| ... | ... | @@ -1971,8 +2034,8 @@ pub fn genDebugRnglistsRange( |
| 1971 | 2034 | ) link.EmitError!void { |
| 1972 | 2035 | const dr_w = &dr_nw.interface; |
| 1973 | 2036 | dr_w.end = unit.debug_rnglists_end; |
| 1974 | try dr_w.writeByte(DW.RLE.start_length); | |
| 1975 | try dwarf.addrSym(dr_nw, func_si, 0); | |
| 2037 | try dr_w.writeByte(DW.RLE.startx_length); | |
| 2038 | try dwarf.addrxSym(dr_w, func_si); | |
| 1976 | 2039 | try dr_w.writeUleb128(func_length); |
| 1977 | 2040 | unit.debug_rnglists_end = dr_w.end; |
| 1978 | 2041 | try dr_w.writeByte(DW.RLE.end_of_list); |
| ... | ... | @@ -1986,9 +2049,10 @@ pub fn genDebugStrOffsetsHeader(dwarf: *Dwarf, dsoh_w: *std.Io.Writer) std.Io.Wr |
| 1986 | 2049 | } |
| 1987 | 2050 | |
| 1988 | 2051 | pub fn genPendingDebugStrOffsets(dwarf: *Dwarf, dso_nw: *link.MappedFile.Node.Writer) link.Error!void { |
| 2052 | const debug_str_ni = dwarf.debug_str.ni.unwrap().?; | |
| 1989 | 2053 | dso_nw.interface.end = dwarf.debug_str_offsets.size(dwarf); |
| 1990 | 2054 | for (dwarf.debug_str_offsets.map.keys()[dwarf.debug_str_offsets.pending_index..]) |offset| { |
| 1991 | dwarf.secOffset(dso_nw, dwarf.debug_str.ni.unwrap().?, offset) catch |err| switch (err) { | |
| 2055 | dwarf.secOffset(dso_nw, debug_str_ni, offset) catch |err| switch (err) { | |
| 1992 | 2056 | else => |e| return e, |
| 1993 | 2057 | error.WriteFailed => return dwarf.reportWriteError(dso_nw), |
| 1994 | 2058 | }; |
| ... | ... | @@ -2081,7 +2145,7 @@ fn updateExternInner( |
| 2081 | 2145 | if (func_type.is_var_args) try dwarf.abbrevCode(di_nw, .is_var_args); |
| 2082 | 2146 | if (!is_empty) try di_w.writeUleb128(@backingInt(AbbrevCode.null)); |
| 2083 | 2147 | } else { |
| 2084 | const addr: Loc = .{ .addr_reloc = si }; | |
| 2148 | const addr: Loc = .{ .addr_sym = .{ .si = si } }; | |
| 2085 | 2149 | const loc: Loc = if (nav_threadlocal) switch (arch) { |
| 2086 | 2150 | .x86_64 => .{ .form_tls_address = &addr }, |
| 2087 | 2151 | else => unreachable, |
| ... | ... | @@ -2169,7 +2233,7 @@ fn updateGlobalInner( |
| 2169 | 2233 | .@"extern" => unreachable, |
| 2170 | 2234 | .@"export" => nav.name, |
| 2171 | 2235 | }.toSlice(ip)); |
| 2172 | const addr: Loc = .{ .addr_reloc = si }; | |
| 2236 | const addr: Loc = .{ .addr_sym = .{ .si = si } }; | |
| 2173 | 2237 | const loc: Loc = if (nav_threadlocal) switch (arch) { |
| 2174 | 2238 | .x86_64 => .{ .form_tls_address = &addr }, |
| 2175 | 2239 | else => unreachable, |
| ... | ... | @@ -4403,6 +4467,21 @@ fn addrSym( |
| 4403 | 4467 | .absAddr(elf), |
| 4404 | 4468 | ) else unreachable; |
| 4405 | 4469 | } |
| 4470 | fn addrxSym(dwarf: *Dwarf, w: *std.Io.Writer, si: link.File.SymbolId) link.EmitError!void { | |
| 4471 | try w.writeUleb128(try dwarf.debug_addr.get(dwarf.lf.comp.gpa, si)); | |
| 4472 | } | |
| 4473 | fn addrx1Sym(dwarf: *Dwarf, w: *std.Io.Writer, si: link.File.SymbolId) link.EmitError!void { | |
| 4474 | try w.writeByte(@intCast(try dwarf.debug_addr.get(dwarf.lf.comp.gpa, si))); | |
| 4475 | } | |
| 4476 | fn addrx2Sym(dwarf: *Dwarf, w: *std.Io.Writer, si: link.File.SymbolId) link.EmitError!void { | |
| 4477 | try w.writeInt(u16, @intCast(try dwarf.debug_addr.get(dwarf.lf.comp.gpa, si)), dwarf.endian); | |
| 4478 | } | |
| 4479 | fn addrx3Sym(dwarf: *Dwarf, w: *std.Io.Writer, si: link.File.SymbolId) link.EmitError!void { | |
| 4480 | try w.writeInt(u24, @intCast(try dwarf.debug_addr.get(dwarf.lf.comp.gpa, si)), dwarf.endian); | |
| 4481 | } | |
| 4482 | fn addrx4Sym(dwarf: *Dwarf, w: *std.Io.Writer, si: link.File.SymbolId) link.EmitError!void { | |
| 4483 | try w.writeInt(u32, @intCast(try dwarf.debug_addr.get(dwarf.lf.comp.gpa, si)), dwarf.endian); | |
| 4484 | } | |
| 4406 | 4485 | |
| 4407 | 4486 | fn blockConst( |
| 4408 | 4487 | dwarf: *Dwarf, |
| ... | ... | @@ -5072,7 +5151,7 @@ pub const AbbrevCode = enum { |
| 5072 | 5151 | .attrs = decl_attrs ++ .{ |
| 5073 | 5152 | .{ .linkage_name, .strx }, |
| 5074 | 5153 | .{ .type, .ref_addr }, |
| 5075 | .{ .low_pc, .addr }, | |
| 5154 | .{ .low_pc, .addrx }, | |
| 5076 | 5155 | .{ .high_pc, .data4 }, |
| 5077 | 5156 | .{ .alignment, .udata }, |
| 5078 | 5157 | .{ .external, .flag }, |
| ... | ... | @@ -5085,7 +5164,7 @@ pub const AbbrevCode = enum { |
| 5085 | 5164 | .attrs = decl_attrs ++ .{ |
| 5086 | 5165 | .{ .linkage_name, .strx }, |
| 5087 | 5166 | .{ .type, .ref_addr }, |
| 5088 | .{ .low_pc, .addr }, | |
| 5167 | .{ .low_pc, .addrx }, | |
| 5089 | 5168 | .{ .high_pc, .data4 }, |
| 5090 | 5169 | .{ .alignment, .udata }, |
| 5091 | 5170 | .{ .external, .flag }, |
| ... | ... | @@ -5353,7 +5432,7 @@ pub const AbbrevCode = enum { |
| 5353 | 5432 | .attrs = decl_instance_attrs ++ .{ |
| 5354 | 5433 | .{ .linkage_name, .strx }, |
| 5355 | 5434 | .{ .type, .ref_addr }, |
| 5356 | .{ .low_pc, .addr }, | |
| 5435 | .{ .low_pc, .addrx }, | |
| 5357 | 5436 | .{ .high_pc, .data4 }, |
| 5358 | 5437 | .{ .alignment, .udata }, |
| 5359 | 5438 | .{ .external, .flag }, |
| ... | ... | @@ -5366,7 +5445,7 @@ pub const AbbrevCode = enum { |
| 5366 | 5445 | .attrs = decl_instance_attrs ++ .{ |
| 5367 | 5446 | .{ .linkage_name, .strx }, |
| 5368 | 5447 | .{ .type, .ref_addr }, |
| 5369 | .{ .low_pc, .addr }, | |
| 5448 | .{ .low_pc, .addrx }, | |
| 5370 | 5449 | .{ .high_pc, .data4 }, |
| 5371 | 5450 | .{ .alignment, .udata }, |
| 5372 | 5451 | .{ .external, .flag }, |
| ... | ... | @@ -6020,6 +6099,7 @@ pub const AbbrevCode = enum { |
| 6020 | 6099 | .{ .language, .data1 }, |
| 6021 | 6100 | .{ .base_types, .ref_addr }, |
| 6022 | 6101 | .{ .stmt_list, .sec_offset }, |
| 6102 | .{ .addr_base, .sec_offset }, | |
| 6023 | 6103 | .{ .rnglists_base, .sec_offset }, |
| 6024 | 6104 | .{ .str_offsets_base, .sec_offset }, |
| 6025 | 6105 | .{ .producer, .strx1 }, |
src/link/Elf2.zig+103-18| ... | ... | @@ -53,6 +53,7 @@ shndx: struct { |
| 53 | 53 | rela_dyn: Section.Index, |
| 54 | 54 | rela_plt: Section.Index, |
| 55 | 55 | debug_abbrev: Section.Index, |
| 56 | debug_addr: Section.Index, | |
| 56 | 57 | eh_frame_hdr: Section.Index, |
| 57 | 58 | eh_frame: Section.Index, |
| 58 | 59 | debug_frame: Section.Index, |
| ... | ... | @@ -215,6 +216,7 @@ textrel_count: u32, |
| 215 | 216 | |
| 216 | 217 | dwarf: Dwarf, |
| 217 | 218 | dwarf_shared: std.enums.EnumArray(Dwarf.SharedSection, dwarf_relocs.Shared), |
| 219 | dwarf_addr: dwarf_relocs.Addr, | |
| 218 | 220 | dwarf_str_offsets: dwarf_relocs.StrOffsets, |
| 219 | 221 | dwarf_units: []dwarf_relocs.Unit, |
| 220 | 222 | dwarf_consts: std.array_hash_map.Auto(link.ConstPool.Index, dwarf_relocs.Const), |
| ... | ... | @@ -287,6 +289,7 @@ const Node = union(enum) { |
| 287 | 289 | lazy_const_data: LazyMapRef.Index(.const_data), |
| 288 | 290 | |
| 289 | 291 | debug_shared: Dwarf.SharedSection, |
| 292 | debug_addr, | |
| 290 | 293 | eh_frame_footer, |
| 291 | 294 | debug_str_offsets, |
| 292 | 295 | unit_padding, |
| ... | ... | @@ -882,6 +885,10 @@ const dwarf_relocs = struct { |
| 882 | 885 | const Shared = struct { |
| 883 | 886 | first_target_reloc: NodeReloc.Index, |
| 884 | 887 | }; |
| 888 | const Addr = struct { | |
| 889 | first_target_reloc: NodeReloc.Index, | |
| 890 | symbol_relocs: std.ArrayList(SymbolReloc.Index), | |
| 891 | }; | |
| 885 | 892 | const StrOffsets = struct { |
| 886 | 893 | first_target_reloc: NodeReloc.Index, |
| 887 | 894 | node_relocs: std.ArrayList(NodeReloc.Index), |
| ... | ... | @@ -3352,6 +3359,7 @@ pub fn symbolForAtom(elf: *Elf, atom: link.File.AtomId) link.File.SymbolId { |
| 3352 | 3359 | .input_section, |
| 3353 | 3360 | .copied_global, |
| 3354 | 3361 | .debug_shared, |
| 3362 | .debug_addr, | |
| 3355 | 3363 | .eh_frame_footer, |
| 3356 | 3364 | .debug_str_offsets, |
| 3357 | 3365 | .unit_padding, |
| ... | ... | @@ -3807,6 +3815,7 @@ fn create( |
| 3807 | 3815 | .rela_dyn = .UNDEF, |
| 3808 | 3816 | .rela_plt = .UNDEF, |
| 3809 | 3817 | .debug_abbrev = .UNDEF, |
| 3818 | .debug_addr = .UNDEF, | |
| 3810 | 3819 | .eh_frame_hdr = .UNDEF, |
| 3811 | 3820 | .eh_frame = .UNDEF, |
| 3812 | 3821 | .debug_frame = .UNDEF, |
| ... | ... | @@ -3873,6 +3882,10 @@ fn create( |
| 3873 | 3882 | .dwarf_shared = comptime .initFill(.{ |
| 3874 | 3883 | .first_target_reloc = .none, |
| 3875 | 3884 | }), |
| 3885 | .dwarf_addr = .{ | |
| 3886 | .first_target_reloc = .none, | |
| 3887 | .symbol_relocs = .empty, | |
| 3888 | }, | |
| 3876 | 3889 | .dwarf_str_offsets = .{ |
| 3877 | 3890 | .first_target_reloc = .none, |
| 3878 | 3891 | .node_relocs = .empty, |
| ... | ... | @@ -3932,6 +3945,7 @@ pub fn deinit(elf: *Elf) void { |
| 3932 | 3945 | elf.changed_symtab_index.deinit(gpa); |
| 3933 | 3946 | |
| 3934 | 3947 | elf.dwarf.deinit(); |
| 3948 | elf.dwarf_addr.symbol_relocs.deinit(gpa); | |
| 3935 | 3949 | elf.dwarf_str_offsets.node_relocs.deinit(gpa); |
| 3936 | 3950 | for (elf.dwarf_units) |*dwarf_unit| dwarf_unit.debug_rnglists_symbol_relocs.deinit(gpa); |
| 3937 | 3951 | gpa.free(elf.dwarf_units); |
| ... | ... | @@ -4012,6 +4026,7 @@ fn initHeaders( |
| 4012 | 4026 | .strip => {}, |
| 4013 | 4027 | .dwarf => { |
| 4014 | 4028 | shnum += 1; // .debug_abbrev |
| 4029 | shnum += 1; // .debug_addr | |
| 4015 | 4030 | shnum += @intFromBool(have_debug_frame); // .debug_frame |
| 4016 | 4031 | shnum += 1; // .debug_info |
| 4017 | 4032 | shnum += 1; // .debug_line |
| ... | ... | @@ -5116,6 +5131,11 @@ fn initHeaders( |
| 5116 | 5131 | .strip => {}, |
| 5117 | 5132 | .dwarf => { |
| 5118 | 5133 | elf.shndx.debug_abbrev = try elf.addSection(elf.ni.elf, .{ .name = ".debug_abbrev" }); |
| 5134 | elf.shndx.debug_addr = try elf.addSection(elf.ni.elf, .{ | |
| 5135 | .name = ".debug_addr", | |
| 5136 | .addralign = addr_align, | |
| 5137 | .node_align = elf.mf.flags.block_size, | |
| 5138 | }); | |
| 5119 | 5139 | if (have_debug_frame) elf.shndx.debug_frame = try elf.addSection(elf.ni.elf, .{ |
| 5120 | 5140 | .name = ".debug_frame", |
| 5121 | 5141 | .addralign = addr_align, |
| ... | ... | @@ -5144,7 +5164,10 @@ fn initHeaders( |
| 5144 | 5164 | }); |
| 5145 | 5165 | elf.shndx.debug_str_offsets = try elf.addSection(elf.ni.elf, .{ |
| 5146 | 5166 | .name = ".debug_str_offsets", |
| 5147 | .addralign = addr_align, | |
| 5167 | .addralign = switch (elf.dwarf.format) { | |
| 5168 | .@"32" => .@"4", | |
| 5169 | .@"64" => .@"8", | |
| 5170 | }, | |
| 5148 | 5171 | .node_align = elf.mf.flags.block_size, |
| 5149 | 5172 | }); |
| 5150 | 5173 | }, |
| ... | ... | @@ -5240,6 +5263,7 @@ fn getNodeShndx(elf: *const Elf, ni: MappedFile.Node.Index) Section.Index { |
| 5240 | 5263 | .lazy_code, |
| 5241 | 5264 | .lazy_const_data, |
| 5242 | 5265 | .debug_shared, |
| 5266 | .debug_addr, | |
| 5243 | 5267 | .eh_frame_footer, |
| 5244 | 5268 | .debug_str_offsets, |
| 5245 | 5269 | .unit_padding, |
| ... | ... | @@ -5288,6 +5312,7 @@ fn getNodeVAddr(elf: *Elf, ni: MappedFile.Node.Index) u64 { |
| 5288 | 5312 | .lazy_const_data, |
| 5289 | 5313 | => |i| Symbol.Id.local(i.symbol(elf)).value(elf), |
| 5290 | 5314 | .debug_shared, |
| 5315 | .debug_addr, | |
| 5291 | 5316 | .eh_frame_footer, |
| 5292 | 5317 | .debug_str_offsets, |
| 5293 | 5318 | .unit_padding, |
| ... | ... | @@ -5329,7 +5354,7 @@ fn computeNodeVAddr(elf: *Elf, ni: MappedFile.Node.Index) u64 { |
| 5329 | 5354 | .lazy_code, |
| 5330 | 5355 | .lazy_const_data, |
| 5331 | 5356 | => |i| Symbol.Id.local(i.symbol(elf)).value(elf), |
| 5332 | .debug_shared, .eh_frame_footer, .debug_str_offsets, .unit_padding => unreachable, | |
| 5357 | .debug_shared, .debug_addr, .eh_frame_footer, .debug_str_offsets, .unit_padding => unreachable, | |
| 5333 | 5358 | .unit_frame, .unit_debug_info, .unit_debug_line => { |
| 5334 | 5359 | const section_offset, _ = parent_ni.location(&elf.mf).resolve(&elf.mf); |
| 5335 | 5360 | break :parent_vaddr elf.getNodeShndx(parent_ni).vaddr(elf) + section_offset; |
| ... | ... | @@ -5366,7 +5391,7 @@ fn computeNodeSectionOffset(elf: *Elf, ni: MappedFile.Node.Index) u64 { |
| 5366 | 5391 | .section, .section_manual_size => 0, |
| 5367 | 5392 | .input_section, .copied_global => unreachable, |
| 5368 | 5393 | .nav, .uav, .lazy_code, .lazy_const_data => unreachable, |
| 5369 | .debug_shared, .eh_frame_footer, .debug_str_offsets, .unit_padding => unreachable, | |
| 5394 | .debug_shared, .debug_addr, .eh_frame_footer, .debug_str_offsets, .unit_padding => unreachable, | |
| 5370 | 5395 | .unit_frame, .unit_debug_info, .unit_debug_line => { |
| 5371 | 5396 | const parent_section_offset, _ = parent_ni.location(&elf.mf).resolve(&elf.mf); |
| 5372 | 5397 | break :parent_section_offset parent_section_offset; |
| ... | ... | @@ -5415,6 +5440,7 @@ pub fn resetNodeRelocs(elf: *Elf, ni: MappedFile.Node.Index) void { |
| 5415 | 5440 | .segment, |
| 5416 | 5441 | .copied_global, |
| 5417 | 5442 | .debug_shared, |
| 5443 | .debug_addr, | |
| 5418 | 5444 | .eh_frame_footer, |
| 5419 | 5445 | .debug_str_offsets, |
| 5420 | 5446 | .unit_padding, |
| ... | ... | @@ -7215,8 +7241,14 @@ fn prelinkInner(elf: *Elf) Error!void { |
| 7215 | 7241 | }; |
| 7216 | 7242 | elf.input_pending_index += 1; |
| 7217 | 7243 | |
| 7218 | try elf.nodes.ensureUnusedCapacity(gpa, 6 + 4); | |
| 7219 | for ([6]Section.Index{ | |
| 7244 | const addr_align: Alignment = switch (elf.identClass()) { | |
| 7245 | .NONE, _ => unreachable, | |
| 7246 | .@"32" => .@"4", | |
| 7247 | .@"64" => .@"8", | |
| 7248 | }; | |
| 7249 | try elf.nodes.ensureUnusedCapacity(gpa, 7 + 5); | |
| 7250 | for ([7]Section.Index{ | |
| 7251 | elf.shndx.debug_addr, | |
| 7220 | 7252 | elf.shndx.eh_frame, |
| 7221 | 7253 | elf.shndx.debug_frame, |
| 7222 | 7254 | elf.shndx.debug_info, |
| ... | ... | @@ -7238,11 +7270,7 @@ fn prelinkInner(elf: *Elf) Error!void { |
| 7238 | 7270 | }; |
| 7239 | 7271 | break :last_header_oni last_header_oni; |
| 7240 | 7272 | }, .{ |
| 7241 | .alignment = if (frame_format) |_| switch (elf.identClass()) { | |
| 7242 | .NONE, _ => unreachable, | |
| 7243 | .@"32" => .@"4", | |
| 7244 | .@"64" => .@"8", | |
| 7245 | } else .@"1", | |
| 7273 | .alignment = if (frame_format) |_| addr_align else .@"1", | |
| 7246 | 7274 | .next_moved = true, |
| 7247 | 7275 | .enable_next_moved = true, |
| 7248 | 7276 | }), |
| ... | ... | @@ -7258,6 +7286,28 @@ fn prelinkInner(elf: *Elf) Error!void { |
| 7258 | 7286 | error.WriteFailed => return debug_nw.err.?, |
| 7259 | 7287 | }; |
| 7260 | 7288 | } |
| 7289 | switch (elf.shndx.debug_addr) { | |
| 7290 | .UNDEF => {}, | |
| 7291 | else => |debug_addr_shndx| { | |
| 7292 | const debug_addr_ni = elf.addNodeAssumeCapacity( | |
| 7293 | try debug_addr_shndx.get(elf).ni.addFloatingChild(gpa, &elf.mf, .{ | |
| 7294 | .alignment = addr_align, | |
| 7295 | .next_moved = true, | |
| 7296 | .enable_next_moved = true, | |
| 7297 | }), | |
| 7298 | .debug_addr, | |
| 7299 | ); | |
| 7300 | elf.dwarf.debug_addr.ni = .wrap(debug_addr_ni); | |
| 7301 | ||
| 7302 | var dah_nw: link.MappedFile.Node.Writer = undefined; | |
| 7303 | debug_addr_ni.writer(gpa, &elf.mf, &dah_nw); | |
| 7304 | defer dah_nw.deinit(); | |
| 7305 | elf.dwarf.genDebugAddrHeader(&dah_nw.interface) catch |err| switch (err) { | |
| 7306 | else => |e| return e, | |
| 7307 | error.WriteFailed => return dah_nw.err.?, | |
| 7308 | }; | |
| 7309 | }, | |
| 7310 | } | |
| 7261 | 7311 | switch (elf.shndx.debug_abbrev) { |
| 7262 | 7312 | .UNDEF => {}, |
| 7263 | 7313 | else => |debug_abbrev_shndx| elf.dwarf.debug_abbrev.ni = .wrap(elf.addNodeAssumeCapacity( |
| ... | ... | @@ -7430,7 +7480,7 @@ fn zcuFilesReadyInner(elf: *Elf, zcu: *Zcu) Error!void { |
| 7430 | 7480 | error.WriteFailed => return dih_nw.err.?, |
| 7431 | 7481 | }; |
| 7432 | 7482 | } |
| 7433 | try elf.genPendingDebugStrings(gpa); | |
| 7483 | try elf.genPendingDebug(gpa); | |
| 7434 | 7484 | } |
| 7435 | 7485 | |
| 7436 | 7486 | fn flushFiles(elf: *Elf) Error!void { |
| ... | ... | @@ -8255,6 +8305,7 @@ fn addNodeRelocAssumeCapacity( |
| 8255 | 8305 | const first_target_reloc = switch (elf.getNode(target)) { |
| 8256 | 8306 | else => unreachable, |
| 8257 | 8307 | .debug_shared => |ss| &elf.dwarf_shared.getPtr(ss).first_target_reloc, |
| 8308 | .debug_addr => &elf.dwarf_addr.first_target_reloc, | |
| 8258 | 8309 | .debug_str_offsets => &elf.dwarf_str_offsets.first_target_reloc, |
| 8259 | 8310 | .unit_frame_cie => |ui| &elf.dwarf_units[@backingInt(ui)].frame_cie_first_target_reloc, |
| 8260 | 8311 | .unit_debug_info_header => |ui| &elf.dwarf_units[@backingInt(ui)].debug_info_header_first_target_reloc, |
| ... | ... | @@ -8361,6 +8412,7 @@ fn addGotRelocAssumeCapacity( |
| 8361 | 8412 | .segment, |
| 8362 | 8413 | .copied_global, |
| 8363 | 8414 | .debug_shared, |
| 8415 | .debug_addr, | |
| 8364 | 8416 | .eh_frame_footer, |
| 8365 | 8417 | .debug_str_offsets, |
| 8366 | 8418 | .unit_padding, |
| ... | ... | @@ -9211,7 +9263,8 @@ fn flushInner( |
| 9211 | 9263 | assert(elf.input_section_pending_index == elf.input_sections.items.len); |
| 9212 | 9264 | assert(elf.pending_uavs.items.len == 0); |
| 9213 | 9265 | assert(elf.dwarf.const_pool.pending.items.len == 0); |
| 9214 | assert(elf.dwarf.debug_str_offsets.pending_index == elf.dwarf.debug_str_offsets.map.count()); | |
| 9266 | assert(!elf.dwarf.debug_addr.anyPending()); | |
| 9267 | assert(!elf.dwarf.debug_str_offsets.anyPending()); | |
| 9215 | 9268 | |
| 9216 | 9269 | // We've done the final `idle` loop, so everything is at its final place in the file. We have a |
| 9217 | 9270 | // few more things to check and write now that addresses and offsets are finalized. |
| ... | ... | @@ -9536,9 +9589,22 @@ fn genPending(elf: *Elf, pt: Zcu.PerThread) link.Error!void { |
| 9536 | 9589 | }, |
| 9537 | 9590 | .code_view => unreachable, |
| 9538 | 9591 | } |
| 9539 | try elf.genPendingDebugStrings(gpa); | |
| 9540 | } | |
| 9541 | fn genPendingDebugStrings(elf: *Elf, gpa: std.mem.Allocator) link.Error!void { | |
| 9592 | try elf.genPendingDebug(gpa); | |
| 9593 | } | |
| 9594 | fn genPendingDebug(elf: *Elf, gpa: std.mem.Allocator) link.Error!void { | |
| 9595 | while (elf.dwarf.debug_addr.map.count() - elf.dwarf.debug_addr.pending_index > 0) { | |
| 9596 | const debug_addr_ni = elf.dwarf.debug_addr.ni.unwrap().?; | |
| 9597 | try debug_addr_ni.moved(gpa, &elf.mf); | |
| 9598 | var da_nw: link.MappedFile.Node.Writer = undefined; | |
| 9599 | debug_addr_ni.writer(gpa, &elf.mf, &da_nw); | |
| 9600 | defer da_nw.deinit(); | |
| 9601 | const first_symbol_ri = elf.symbol_relocs.items.len; | |
| 9602 | try elf.dwarf.genPendingDebugAddr(&da_nw); | |
| 9603 | const symbol_relocs = &elf.dwarf_addr.symbol_relocs; | |
| 9604 | try symbol_relocs.ensureUnusedCapacity(gpa, elf.symbol_relocs.items.len - first_symbol_ri); | |
| 9605 | for (first_symbol_ri..elf.symbol_relocs.items.len) |symbol_ri| | |
| 9606 | symbol_relocs.appendAssumeCapacity(@fromBackingInt(@intCast(symbol_ri))); | |
| 9607 | } | |
| 9542 | 9608 | while (elf.dwarf.debug_str_offsets.map.count() - elf.dwarf.debug_str_offsets.pending_index > 0) { |
| 9543 | 9609 | const debug_str_offsets_ni = elf.dwarf.debug_str_offsets.ni.unwrap().?; |
| 9544 | 9610 | try debug_str_offsets_ni.moved(gpa, &elf.mf); |
| ... | ... | @@ -9958,6 +10024,22 @@ fn flushMoved(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!void |
| 9958 | 10024 | .unit_debug_info, |
| 9959 | 10025 | .unit_debug_line, |
| 9960 | 10026 | => {}, |
| 10027 | .debug_addr => { | |
| 10028 | const target_section_offset = elf.computeNodeSectionOffset(ni); | |
| 10029 | var target_ri = elf.dwarf_addr.first_target_reloc; | |
| 10030 | while (target_ri != .none) { | |
| 10031 | const target_reloc = target_ri.get(elf); | |
| 10032 | assert(target_reloc.target == ni); | |
| 10033 | target_reloc.flushMovedTarget(elf, target_section_offset); | |
| 10034 | target_ri = target_reloc.next; | |
| 10035 | } | |
| 10036 | const node_vaddr = elf.computeNodeVAddr(ni); | |
| 10037 | for (elf.dwarf_addr.symbol_relocs.items) |symbol_ri| { | |
| 10038 | const symbol_reloc = symbol_ri.get(elf); | |
| 10039 | assert(symbol_reloc.node.unwrap().? == ni); | |
| 10040 | symbol_reloc.flushMovedNode(elf, node_vaddr); | |
| 10041 | } | |
| 10042 | }, | |
| 9961 | 10043 | .debug_str_offsets => { |
| 9962 | 10044 | const target_section_offset = elf.computeNodeSectionOffset(ni); |
| 9963 | 10045 | var target_ri = elf.dwarf_str_offsets.first_target_reloc; |
| ... | ... | @@ -10356,6 +10438,7 @@ fn flushResized(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!vo |
| 10356 | 10438 | .lazy_code, |
| 10357 | 10439 | .lazy_const_data, |
| 10358 | 10440 | .debug_shared, |
| 10441 | .debug_addr, | |
| 10359 | 10442 | .eh_frame_footer, |
| 10360 | 10443 | .debug_str_offsets, |
| 10361 | 10444 | .unit_padding, |
| ... | ... | @@ -10430,6 +10513,7 @@ fn flushPadding(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!vo |
| 10430 | 10513 | error.NoSpaceLeft => archive.strtab_member_too_big = true, |
| 10431 | 10514 | } |
| 10432 | 10515 | }, |
| 10516 | .debug_addr, | |
| 10433 | 10517 | .debug_str_offsets, |
| 10434 | 10518 | .unit_padding, |
| 10435 | 10519 | .unit_frame_cie, |
| ... | ... | @@ -10447,6 +10531,7 @@ fn flushPadding(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!vo |
| 10447 | 10531 | const offset, const size = ni.location(&elf.mf).resolve(&elf.mf); |
| 10448 | 10532 | break :location .{ offset, switch (node) { |
| 10449 | 10533 | else => unreachable, |
| 10534 | .debug_addr => elf.dwarf.debug_addr.size(&elf.dwarf), | |
| 10450 | 10535 | .debug_str_offsets => elf.dwarf.debug_str_offsets.size(&elf.dwarf), |
| 10451 | 10536 | .unit_padding, |
| 10452 | 10537 | .unit_frame_cie, |
| ... | ... | @@ -10475,7 +10560,7 @@ fn flushPadding(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!vo |
| 10475 | 10560 | }; |
| 10476 | 10561 | switch (node) { |
| 10477 | 10562 | else => unreachable, |
| 10478 | .debug_str_offsets, .unit_padding, .unit_debug_rnglists => { | |
| 10563 | .debug_addr, .debug_str_offsets, .unit_padding, .unit_debug_rnglists => { | |
| 10479 | 10564 | const parent_slice = parent_ni.slicePadding(&elf.mf); |
| 10480 | 10565 | const frame_shndx = elf.getNodeShndx(parent_ni); |
| 10481 | 10566 | const frame_format = frame_shndx.debugFrameFormat(elf) orelse |
| ... | ... | @@ -10600,13 +10685,13 @@ fn flushPadding(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!vo |
| 10600 | 10685 | var fw: Io.Writer = .fixed(slice[@intCast(size)..]); |
| 10601 | 10686 | switch (node) { |
| 10602 | 10687 | else => unreachable, |
| 10603 | .debug_str_offsets, .unit_debug_rnglists => { | |
| 10688 | .debug_addr, .debug_str_offsets, .unit_debug_rnglists => { | |
| 10604 | 10689 | elf.dwarf.genUnitPadding(&fw) catch |err| switch (err) { |
| 10605 | 10690 | error.WriteFailed => { |
| 10606 | 10691 | elf.dwarf.updateUnitLength(slice, slice.len); |
| 10607 | 10692 | @memset(fw.buffer, switch (node) { |
| 10608 | 10693 | else => unreachable, |
| 10609 | .debug_str_offsets => std.math.maxInt(u8), | |
| 10694 | .debug_addr, .debug_str_offsets => std.math.maxInt(u8), | |
| 10610 | 10695 | .unit_debug_rnglists => std.dwarf.RLE.end_of_list, |
| 10611 | 10696 | }); |
| 10612 | 10697 | return; |