| ... | @@ -8301,6 +8301,53 @@ pub fn prelink(elf: *Elf, prog_node: std.Progress.Node) link.Error!void { | ... | @@ -8301,6 +8301,53 @@ pub fn prelink(elf: *Elf, prog_node: std.Progress.Node) link.Error!void { |
| 8301 | fn prelinkInner(elf: *Elf) Error!void { | 8301 | fn prelinkInner(elf: *Elf) Error!void { |
| 8302 | const comp = elf.base.comp; | 8302 | const comp = elf.base.comp; |
| 8303 | const gpa = comp.gpa; | 8303 | const gpa = comp.gpa; |
| | 8304 | |
| | 8305 | const addr_align: Alignment = switch (elf.identClass()) { |
| | 8306 | .NONE, _ => unreachable, |
| | 8307 | .@"32" => .@"4", |
| | 8308 | .@"64" => .@"8", |
| | 8309 | }; |
| | 8310 | try elf.nodes.ensureUnusedCapacity(gpa, 7 + 5); |
| | 8311 | for ([7]Section.Index{ |
| | 8312 | elf.shndx.debug_addr, |
| | 8313 | elf.shndx.eh_frame, |
| | 8314 | elf.shndx.debug_frame, |
| | 8315 | elf.shndx.debug_info, |
| | 8316 | elf.shndx.debug_line, |
| | 8317 | elf.shndx.debug_rnglists, |
| | 8318 | elf.shndx.debug_str_offsets, |
| | 8319 | }) |debug_shndx| { |
| | 8320 | if (debug_shndx == .UNDEF) continue; |
| | 8321 | const debug_ni = debug_shndx.get(elf).ni; |
| | 8322 | const frame_format = debug_shndx.debugFrameFormat(elf); |
| | 8323 | const unit_padding_ni = elf.addNodeAssumeCapacity( |
| | 8324 | try debug_ni.addHeaderChildAfter(gpa, &elf.mf, last_header_oni: { |
| | 8325 | var last_header_oni = debug_ni.last(&elf.mf); |
| | 8326 | while (last_header_oni.unwrap()) |last_header_ni| |
| | 8327 | switch (last_header_ni.position(&elf.mf)) { |
| | 8328 | .header => break, |
| | 8329 | .footer => last_header_oni = last_header_ni.prev(&elf.mf), |
| | 8330 | .floating => unreachable, |
| | 8331 | }; |
| | 8332 | break :last_header_oni last_header_oni; |
| | 8333 | }, .{ |
| | 8334 | .alignment = if (frame_format) |_| addr_align else .@"1", |
| | 8335 | .next_moved = true, |
| | 8336 | .enable_next_moved = true, |
| | 8337 | }), |
| | 8338 | .unit_padding, |
| | 8339 | ); |
| | 8340 | var debug_nw: MappedFile.Node.Writer = undefined; |
| | 8341 | unit_padding_ni.writer(gpa, &elf.mf, &debug_nw); |
| | 8342 | defer debug_nw.deinit(); |
| | 8343 | (if (frame_format) |format| |
| | 8344 | elf.dwarf.genDebugFrameCie(&debug_nw.interface, null, format) |
| | 8345 | else |
| | 8346 | elf.dwarf.genUnitPadding(&debug_nw.interface)) catch |err| switch (err) { |
| | 8347 | error.WriteFailed => return debug_nw.err.?, |
| | 8348 | }; |
| | 8349 | } |
| | 8350 | |
| 8304 | if (comp.zcu) |_| self_hosted_codegen: { | 8351 | if (comp.zcu) |_| self_hosted_codegen: { |
| 8305 | if (comp.config.use_llvm) break :self_hosted_codegen; | 8352 | if (comp.config.use_llvm) break :self_hosted_codegen; |
| 8306 | | 8353 | |
| ... | @@ -8323,51 +8370,6 @@ fn prelinkInner(elf: *Elf) Error!void { | ... | @@ -8323,51 +8370,6 @@ fn prelinkInner(elf: *Elf) Error!void { |
| 8323 | }; | 8370 | }; |
| 8324 | elf.input_pending_index += 1; | 8371 | elf.input_pending_index += 1; |
| 8325 | | 8372 | |
| 8326 | const addr_align: Alignment = switch (elf.identClass()) { | | |
| 8327 | .NONE, _ => unreachable, | | |
| 8328 | .@"32" => .@"4", | | |
| 8329 | .@"64" => .@"8", | | |
| 8330 | }; | | |
| 8331 | try elf.nodes.ensureUnusedCapacity(gpa, 7 + 5); | | |
| 8332 | for ([7]Section.Index{ | | |
| 8333 | elf.shndx.debug_addr, | | |
| 8334 | elf.shndx.eh_frame, | | |
| 8335 | elf.shndx.debug_frame, | | |
| 8336 | elf.shndx.debug_info, | | |
| 8337 | elf.shndx.debug_line, | | |
| 8338 | elf.shndx.debug_rnglists, | | |
| 8339 | elf.shndx.debug_str_offsets, | | |
| 8340 | }) |debug_shndx| { | | |
| 8341 | if (debug_shndx == .UNDEF) continue; | | |
| 8342 | const debug_ni = debug_shndx.get(elf).ni; | | |
| 8343 | const frame_format = debug_shndx.debugFrameFormat(elf); | | |
| 8344 | const unit_padding_ni = elf.addNodeAssumeCapacity( | | |
| 8345 | try debug_ni.addHeaderChildAfter(gpa, &elf.mf, last_header_oni: { | | |
| 8346 | var last_header_oni = debug_ni.last(&elf.mf); | | |
| 8347 | while (last_header_oni.unwrap()) |last_header_ni| | | |
| 8348 | switch (last_header_ni.position(&elf.mf)) { | | |
| 8349 | .header => break, | | |
| 8350 | .footer => last_header_oni = last_header_ni.prev(&elf.mf), | | |
| 8351 | .floating => unreachable, | | |
| 8352 | }; | | |
| 8353 | break :last_header_oni last_header_oni; | | |
| 8354 | }, .{ | | |
| 8355 | .alignment = if (frame_format) |_| addr_align else .@"1", | | |
| 8356 | .next_moved = true, | | |
| 8357 | .enable_next_moved = true, | | |
| 8358 | }), | | |
| 8359 | .unit_padding, | | |
| 8360 | ); | | |
| 8361 | var debug_nw: MappedFile.Node.Writer = undefined; | | |
| 8362 | unit_padding_ni.writer(gpa, &elf.mf, &debug_nw); | | |
| 8363 | defer debug_nw.deinit(); | | |
| 8364 | (if (frame_format) |format| | | |
| 8365 | elf.dwarf.genDebugFrameCie(&debug_nw.interface, null, format) | | |
| 8366 | else | | |
| 8367 | elf.dwarf.genUnitPadding(&debug_nw.interface)) catch |err| switch (err) { | | |
| 8368 | error.WriteFailed => return debug_nw.err.?, | | |
| 8369 | }; | | |
| 8370 | } | | |
| 8371 | switch (elf.shndx.debug_addr) { | 8373 | switch (elf.shndx.debug_addr) { |
| 8372 | .UNDEF => {}, | 8374 | .UNDEF => {}, |
| 8373 | else => |debug_addr_shndx| { | 8375 | else => |debug_addr_shndx| { |