| ... | ... | @@ -8301,6 +8301,53 @@ pub fn prelink(elf: *Elf, prog_node: std.Progress.Node) link.Error!void { |
| 8301 | 8301 | fn prelinkInner(elf: *Elf) Error!void { |
| 8302 | 8302 | const comp = elf.base.comp; |
| 8303 | 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 | 8351 | if (comp.zcu) |_| self_hosted_codegen: { |
| 8305 | 8352 | if (comp.config.use_llvm) break :self_hosted_codegen; |
| 8306 | 8353 | |
| ... | ... | @@ -8323,51 +8370,6 @@ fn prelinkInner(elf: *Elf) Error!void { |
| 8323 | 8370 | }; |
| 8324 | 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 | 8373 | switch (elf.shndx.debug_addr) { |
| 8372 | 8374 | .UNDEF => {}, |
| 8373 | 8375 | else => |debug_addr_shndx| { |