aboutsummaryrefslogtreecommitdiff
path: root/src/link/Elf
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-01-16 04:20:41 -0500
committerGitHub <noreply@github.com>2025-01-16 04:20:41 -0500
commitd4fe4698d9ff865ed1dc7e0163f2d5fcbe2b45a6 (patch)
tree160d596e8ab0ab9568dac3f026c2ce42ad1c935e /src/link/Elf
parent77273103a8f9895ceab28287dffcf4d4c6fcb91b (diff)
parenteda8b6e137a10f398cd292b533e924960f7fc409 (diff)
downloadzig-d4fe4698d9ff865ed1dc7e0163f2d5fcbe2b45a6.tar.gz
zig-d4fe4698d9ff865ed1dc7e0163f2d5fcbe2b45a6.zip
Merge pull request #22220 from ziglang/wasm-linker
wasm linker: aggressive rewrite towards Data-Oriented Design
Diffstat (limited to 'src/link/Elf')
-rw-r--r--src/link/Elf/Atom.zig24
-rw-r--r--src/link/Elf/AtomList.zig5
-rw-r--r--src/link/Elf/Object.zig10
-rw-r--r--src/link/Elf/ZigObject.zig132
-rw-r--r--src/link/Elf/eh_frame.zig2
-rw-r--r--src/link/Elf/relocatable.zig12
6 files changed, 94 insertions, 91 deletions
diff --git a/src/link/Elf/Atom.zig b/src/link/Elf/Atom.zig
index d34dd6bb63..f0eb0dce3f 100644
--- a/src/link/Elf/Atom.zig
+++ b/src/link/Elf/Atom.zig
@@ -523,7 +523,7 @@ fn reportUnhandledRelocError(self: Atom, rel: elf.Elf64_Rela, elf_file: *Elf) Re
relocation.fmtRelocType(rel.r_type(), elf_file.getTarget().cpu.arch),
rel.r_offset,
});
- try err.addNote("in {}:{s}", .{ self.file(elf_file).?.fmtPath(), self.name(elf_file) });
+ err.addNote("in {}:{s}", .{ self.file(elf_file).?.fmtPath(), self.name(elf_file) });
return error.RelocFailure;
}
@@ -539,7 +539,7 @@ fn reportTextRelocError(
rel.r_offset,
symbol.name(elf_file),
});
- try err.addNote("in {}:{s}", .{ self.file(elf_file).?.fmtPath(), self.name(elf_file) });
+ err.addNote("in {}:{s}", .{ self.file(elf_file).?.fmtPath(), self.name(elf_file) });
return error.RelocFailure;
}
@@ -555,8 +555,8 @@ fn reportPicError(
rel.r_offset,
symbol.name(elf_file),
});
- try err.addNote("in {}:{s}", .{ self.file(elf_file).?.fmtPath(), self.name(elf_file) });
- try err.addNote("recompile with -fPIC", .{});
+ err.addNote("in {}:{s}", .{ self.file(elf_file).?.fmtPath(), self.name(elf_file) });
+ err.addNote("recompile with -fPIC", .{});
return error.RelocFailure;
}
@@ -572,8 +572,8 @@ fn reportNoPicError(
rel.r_offset,
symbol.name(elf_file),
});
- try err.addNote("in {}:{s}", .{ self.file(elf_file).?.fmtPath(), self.name(elf_file) });
- try err.addNote("recompile with -fno-PIC", .{});
+ err.addNote("in {}:{s}", .{ self.file(elf_file).?.fmtPath(), self.name(elf_file) });
+ err.addNote("recompile with -fno-PIC", .{});
return error.RelocFailure;
}
@@ -1187,7 +1187,7 @@ const x86_64 = struct {
x86_64.relaxGotPcTlsDesc(code[r_offset - 3 ..]) catch {
var err = try diags.addErrorWithNotes(1);
try err.addMsg("could not relax {s}", .{@tagName(r_type)});
- try err.addNote("in {}:{s} at offset 0x{x}", .{
+ err.addNote("in {}:{s} at offset 0x{x}", .{
atom.file(elf_file).?.fmtPath(),
atom.name(elf_file),
rel.r_offset,
@@ -1332,7 +1332,7 @@ const x86_64 = struct {
relocation.fmtRelocType(rels[0].r_type(), .x86_64),
relocation.fmtRelocType(rels[1].r_type(), .x86_64),
});
- try err.addNote("in {}:{s} at offset 0x{x}", .{
+ err.addNote("in {}:{s} at offset 0x{x}", .{
self.file(elf_file).?.fmtPath(),
self.name(elf_file),
rels[0].r_offset,
@@ -1388,7 +1388,7 @@ const x86_64 = struct {
relocation.fmtRelocType(rels[0].r_type(), .x86_64),
relocation.fmtRelocType(rels[1].r_type(), .x86_64),
});
- try err.addNote("in {}:{s} at offset 0x{x}", .{
+ err.addNote("in {}:{s} at offset 0x{x}", .{
self.file(elf_file).?.fmtPath(),
self.name(elf_file),
rels[0].r_offset,
@@ -1485,7 +1485,7 @@ const x86_64 = struct {
relocation.fmtRelocType(rels[0].r_type(), .x86_64),
relocation.fmtRelocType(rels[1].r_type(), .x86_64),
});
- try err.addNote("in {}:{s} at offset 0x{x}", .{
+ err.addNote("in {}:{s} at offset 0x{x}", .{
self.file(elf_file).?.fmtPath(),
self.name(elf_file),
rels[0].r_offset,
@@ -1672,7 +1672,7 @@ const aarch64 = struct {
// TODO: relax
var err = try diags.addErrorWithNotes(1);
try err.addMsg("TODO: relax ADR_GOT_PAGE", .{});
- try err.addNote("in {}:{s} at offset 0x{x}", .{
+ err.addNote("in {}:{s} at offset 0x{x}", .{
atom.file(elf_file).?.fmtPath(),
atom.name(elf_file),
r_offset,
@@ -1959,7 +1959,7 @@ const riscv = struct {
// TODO: implement searching forward
var err = try diags.addErrorWithNotes(1);
try err.addMsg("TODO: find HI20 paired reloc scanning forward", .{});
- try err.addNote("in {}:{s} at offset 0x{x}", .{
+ err.addNote("in {}:{s} at offset 0x{x}", .{
atom.file(elf_file).?.fmtPath(),
atom.name(elf_file),
rel.r_offset,
diff --git a/src/link/Elf/AtomList.zig b/src/link/Elf/AtomList.zig
index bab4726f24..f8d57d04a1 100644
--- a/src/link/Elf/AtomList.zig
+++ b/src/link/Elf/AtomList.zig
@@ -58,7 +58,7 @@ pub fn allocate(list: *AtomList, elf_file: *Elf) !void {
if (expand_section) last_atom_ref.* = list.lastAtom(elf_file).ref();
shdr.sh_addralign = @max(shdr.sh_addralign, list.alignment.toByteUnits().?);
- // FIXME:JK this currently ignores Thunks as valid chunks.
+ // This currently ignores Thunks as valid chunks.
{
var idx: usize = 0;
while (idx < list.atoms.keys().len) : (idx += 1) {
@@ -78,7 +78,8 @@ pub fn allocate(list: *AtomList, elf_file: *Elf) !void {
placement_atom.next_atom_ref = list.firstAtom(elf_file).ref();
}
- // FIXME:JK if we had a link from Atom to parent AtomList we would not need to update Atom's value or osec index
+ // If we had a link from Atom to parent AtomList we would not need to
+ // update Atom's value or osec index.
for (list.atoms.keys()) |ref| {
const atom_ptr = elf_file.atom(ref).?;
atom_ptr.output_section_index = list.output_section_index;
diff --git a/src/link/Elf/Object.zig b/src/link/Elf/Object.zig
index 65a62ff1a6..d6076a5558 100644
--- a/src/link/Elf/Object.zig
+++ b/src/link/Elf/Object.zig
@@ -797,7 +797,7 @@ pub fn initInputMergeSections(self: *Object, elf_file: *Elf) !void {
if (!isNull(data[end .. end + sh_entsize])) {
var err = try diags.addErrorWithNotes(1);
try err.addMsg("string not null terminated", .{});
- try err.addNote("in {}:{s}", .{ self.fmtPath(), atom_ptr.name(elf_file) });
+ err.addNote("in {}:{s}", .{ self.fmtPath(), atom_ptr.name(elf_file) });
return error.LinkFailure;
}
end += sh_entsize;
@@ -812,7 +812,7 @@ pub fn initInputMergeSections(self: *Object, elf_file: *Elf) !void {
if (shdr.sh_size % sh_entsize != 0) {
var err = try diags.addErrorWithNotes(1);
try err.addMsg("size not a multiple of sh_entsize", .{});
- try err.addNote("in {}:{s}", .{ self.fmtPath(), atom_ptr.name(elf_file) });
+ err.addNote("in {}:{s}", .{ self.fmtPath(), atom_ptr.name(elf_file) });
return error.LinkFailure;
}
@@ -889,8 +889,8 @@ pub fn resolveMergeSubsections(self: *Object, elf_file: *Elf) error{
const res = imsec.findSubsection(@intCast(esym.st_value)) orelse {
var err = try diags.addErrorWithNotes(2);
try err.addMsg("invalid symbol value: {x}", .{esym.st_value});
- try err.addNote("for symbol {s}", .{sym.name(elf_file)});
- try err.addNote("in {}", .{self.fmtPath()});
+ err.addNote("for symbol {s}", .{sym.name(elf_file)});
+ err.addNote("in {}", .{self.fmtPath()});
return error.LinkFailure;
};
@@ -915,7 +915,7 @@ pub fn resolveMergeSubsections(self: *Object, elf_file: *Elf) error{
const res = imsec.findSubsection(@intCast(@as(i64, @intCast(esym.st_value)) + rel.r_addend)) orelse {
var err = try diags.addErrorWithNotes(1);
try err.addMsg("invalid relocation at offset 0x{x}", .{rel.r_offset});
- try err.addNote("in {}:{s}", .{ self.fmtPath(), atom_ptr.name(elf_file) });
+ err.addNote("in {}:{s}", .{ self.fmtPath(), atom_ptr.name(elf_file) });
return error.LinkFailure;
};
diff --git a/src/link/Elf/ZigObject.zig b/src/link/Elf/ZigObject.zig
index 73ea628864..aac29d8a4f 100644
--- a/src/link/Elf/ZigObject.zig
+++ b/src/link/Elf/ZigObject.zig
@@ -278,8 +278,8 @@ pub fn flush(self: *ZigObject, elf_file: *Elf, tid: Zcu.PerThread.Id) !void {
.{ .kind = .code, .ty = .anyerror_type },
metadata.text_symbol_index,
) catch |err| return switch (err) {
- error.CodegenFail => error.FlushFailure,
- else => |e| e,
+ error.CodegenFail => error.LinkFailure,
+ else => |e| return e,
};
if (metadata.rodata_state != .unused) self.updateLazySymbol(
elf_file,
@@ -287,8 +287,8 @@ pub fn flush(self: *ZigObject, elf_file: *Elf, tid: Zcu.PerThread.Id) !void {
.{ .kind = .const_data, .ty = .anyerror_type },
metadata.rodata_symbol_index,
) catch |err| return switch (err) {
- error.CodegenFail => error.FlushFailure,
- else => |e| e,
+ error.CodegenFail => error.LinkFailure,
+ else => |e| return e,
};
}
for (self.lazy_syms.values()) |*metadata| {
@@ -933,6 +933,7 @@ pub fn getNavVAddr(
const this_sym = self.symbol(this_sym_index);
const vaddr = this_sym.address(.{}, elf_file);
switch (reloc_info.parent) {
+ .none => unreachable,
.atom_index => |atom_index| {
const parent_atom = self.symbol(atom_index).atom(elf_file).?;
const r_type = relocation.encode(.abs, elf_file.getTarget().cpu.arch);
@@ -965,6 +966,7 @@ pub fn getUavVAddr(
const sym = self.symbol(sym_index);
const vaddr = sym.address(.{}, elf_file);
switch (reloc_info.parent) {
+ .none => unreachable,
.atom_index => |atom_index| {
const parent_atom = self.symbol(atom_index).atom(elf_file).?;
const r_type = relocation.encode(.abs, elf_file.getTarget().cpu.arch);
@@ -1261,7 +1263,7 @@ fn updateNavCode(
shdr_index: u32,
code: []const u8,
stt_bits: u8,
-) !void {
+) link.File.UpdateNavError!void {
const zcu = pt.zcu;
const gpa = zcu.gpa;
const ip = &zcu.intern_pool;
@@ -1298,7 +1300,9 @@ fn updateNavCode(
const capacity = atom_ptr.capacity(elf_file);
const need_realloc = code.len > capacity or !required_alignment.check(@intCast(atom_ptr.value));
if (need_realloc) {
- try self.allocateAtom(atom_ptr, true, elf_file);
+ self.allocateAtom(atom_ptr, true, elf_file) catch |err|
+ return elf_file.base.cgFail(nav_index, "failed to allocate atom: {s}", .{@errorName(err)});
+
log.debug("growing {} from 0x{x} to 0x{x}", .{ nav.fqn.fmt(ip), old_vaddr, atom_ptr.value });
if (old_vaddr != atom_ptr.value) {
sym.value = 0;
@@ -1308,7 +1312,9 @@ fn updateNavCode(
// TODO shrink section size
}
} else {
- try self.allocateAtom(atom_ptr, true, elf_file);
+ self.allocateAtom(atom_ptr, true, elf_file) catch |err|
+ return elf_file.base.cgFail(nav_index, "failed to allocate atom: {s}", .{@errorName(err)});
+
errdefer self.freeNavMetadata(elf_file, sym_index);
sym.value = 0;
esym.st_value = 0;
@@ -1333,14 +1339,15 @@ fn updateNavCode(
else => |errno| log.warn("process_vm_writev failure: {s}", .{@tagName(errno)}),
}
},
- else => return error.HotSwapUnavailableOnHostOperatingSystem,
+ else => return elf_file.base.cgFail(nav_index, "ELF hot swap unavailable on host operating system '{s}'", .{@tagName(builtin.os.tag)}),
}
}
const shdr = elf_file.sections.items(.shdr)[shdr_index];
if (shdr.sh_type != elf.SHT_NOBITS) {
const file_offset = atom_ptr.offset(elf_file);
- try elf_file.base.file.?.pwriteAll(code, file_offset);
+ elf_file.base.file.?.pwriteAll(code, file_offset) catch |err|
+ return elf_file.base.cgFail(nav_index, "failed to write to output file: {s}", .{@errorName(err)});
log.debug("writing {} from 0x{x} to 0x{x}", .{ nav.fqn.fmt(ip), file_offset, file_offset + code.len });
}
}
@@ -1353,7 +1360,7 @@ fn updateTlv(
sym_index: Symbol.Index,
shndx: u32,
code: []const u8,
-) !void {
+) link.File.UpdateNavError!void {
const zcu = pt.zcu;
const ip = &zcu.intern_pool;
const gpa = zcu.gpa;
@@ -1383,7 +1390,8 @@ fn updateTlv(
const gop = try self.tls_variables.getOrPut(gpa, atom_ptr.atom_index);
assert(!gop.found_existing); // TODO incremental updates
- try self.allocateAtom(atom_ptr, true, elf_file);
+ self.allocateAtom(atom_ptr, true, elf_file) catch |err|
+ return elf_file.base.cgFail(nav_index, "failed to allocate atom: {s}", .{@errorName(err)});
sym.value = 0;
esym.st_value = 0;
@@ -1392,7 +1400,8 @@ fn updateTlv(
const shdr = elf_file.sections.items(.shdr)[shndx];
if (shdr.sh_type != elf.SHT_NOBITS) {
const file_offset = atom_ptr.offset(elf_file);
- try elf_file.base.file.?.pwriteAll(code, file_offset);
+ elf_file.base.file.?.pwriteAll(code, file_offset) catch |err|
+ return elf_file.base.cgFail(nav_index, "failed to write to output file: {s}", .{@errorName(err)});
log.debug("writing TLV {s} from 0x{x} to 0x{x}", .{
atom_ptr.name(elf_file),
file_offset,
@@ -1408,7 +1417,7 @@ pub fn updateFunc(
func_index: InternPool.Index,
air: Air,
liveness: Liveness,
-) !void {
+) link.File.UpdateNavError!void {
const tracy = trace(@src());
defer tracy.end();
@@ -1422,13 +1431,13 @@ pub fn updateFunc(
const sym_index = try self.getOrCreateMetadataForNav(zcu, func.owner_nav);
self.atom(self.symbol(sym_index).ref.index).?.freeRelocs(self);
- var code_buffer = std.ArrayList(u8).init(gpa);
- defer code_buffer.deinit();
+ var code_buffer: std.ArrayListUnmanaged(u8) = .empty;
+ defer code_buffer.deinit(gpa);
var debug_wip_nav = if (self.dwarf) |*dwarf| try dwarf.initWipNav(pt, func.owner_nav, sym_index) else null;
defer if (debug_wip_nav) |*wip_nav| wip_nav.deinit();
- const res = try codegen.generateFunction(
+ try codegen.generateFunction(
&elf_file.base,
pt,
zcu.navSrcLoc(func.owner_nav),
@@ -1438,14 +1447,7 @@ pub fn updateFunc(
&code_buffer,
if (debug_wip_nav) |*dn| .{ .dwarf = dn } else .none,
);
-
- const code = switch (res) {
- .ok => code_buffer.items,
- .fail => |em| {
- try zcu.failed_codegen.put(gpa, func.owner_nav, em);
- return;
- },
- };
+ const code = code_buffer.items;
const shndx = try self.getNavShdrIndex(elf_file, zcu, func.owner_nav, sym_index, code);
log.debug("setting shdr({x},{s}) for {}", .{
@@ -1463,7 +1465,8 @@ pub fn updateFunc(
break :blk .{ atom_ptr.value, atom_ptr.alignment };
};
- if (debug_wip_nav) |*wip_nav| try self.dwarf.?.finishWipNavFunc(pt, func.owner_nav, code.len, wip_nav);
+ if (debug_wip_nav) |*wip_nav| self.dwarf.?.finishWipNavFunc(pt, func.owner_nav, code.len, wip_nav) catch |err|
+ return elf_file.base.cgFail(func.owner_nav, "failed to finish dwarf function: {s}", .{@errorName(err)});
// Exports will be updated by `Zcu.processExports` after the update.
@@ -1511,7 +1514,8 @@ pub fn updateFunc(
target_sym.flags.has_trampoline = true;
}
const target_sym = self.symbol(sym_index);
- try writeTrampoline(self.symbol(target_sym.extra(elf_file).trampoline).*, target_sym.*, elf_file);
+ writeTrampoline(self.symbol(target_sym.extra(elf_file).trampoline).*, target_sym.*, elf_file) catch |err|
+ return elf_file.base.cgFail(func.owner_nav, "failed to write trampoline: {s}", .{@errorName(err)});
}
}
@@ -1547,7 +1551,11 @@ pub fn updateNav(
if (self.dwarf) |*dwarf| dwarf: {
var debug_wip_nav = try dwarf.initWipNav(pt, nav_index, sym_index) orelse break :dwarf;
defer debug_wip_nav.deinit();
- try dwarf.finishWipNav(pt, nav_index, &debug_wip_nav);
+ dwarf.finishWipNav(pt, nav_index, &debug_wip_nav) catch |err| switch (err) {
+ error.OutOfMemory => return error.OutOfMemory,
+ error.Overflow => return error.Overflow,
+ else => |e| return elf_file.base.cgFail(nav_index, "failed to finish dwarf nav: {s}", .{@errorName(e)}),
+ };
}
return;
},
@@ -1558,13 +1566,13 @@ pub fn updateNav(
const sym_index = try self.getOrCreateMetadataForNav(zcu, nav_index);
self.symbol(sym_index).atom(elf_file).?.freeRelocs(self);
- var code_buffer = std.ArrayList(u8).init(zcu.gpa);
- defer code_buffer.deinit();
+ var code_buffer: std.ArrayListUnmanaged(u8) = .empty;
+ defer code_buffer.deinit(zcu.gpa);
var debug_wip_nav = if (self.dwarf) |*dwarf| try dwarf.initWipNav(pt, nav_index, sym_index) else null;
defer if (debug_wip_nav) |*wip_nav| wip_nav.deinit();
- const res = try codegen.generateSymbol(
+ try codegen.generateSymbol(
&elf_file.base,
pt,
zcu.navSrcLoc(nav_index),
@@ -1572,14 +1580,7 @@ pub fn updateNav(
&code_buffer,
.{ .atom_index = sym_index },
);
-
- const code = switch (res) {
- .ok => code_buffer.items,
- .fail => |em| {
- try zcu.failed_codegen.put(zcu.gpa, nav_index, em);
- return;
- },
- };
+ const code = code_buffer.items;
const shndx = try self.getNavShdrIndex(elf_file, zcu, nav_index, sym_index, code);
log.debug("setting shdr({x},{s}) for {}", .{
@@ -1592,7 +1593,11 @@ pub fn updateNav(
else
try self.updateNavCode(elf_file, pt, nav_index, sym_index, shndx, code, elf.STT_OBJECT);
- if (debug_wip_nav) |*wip_nav| try self.dwarf.?.finishWipNav(pt, nav_index, wip_nav);
+ if (debug_wip_nav) |*wip_nav| self.dwarf.?.finishWipNav(pt, nav_index, wip_nav) catch |err| switch (err) {
+ error.OutOfMemory => return error.OutOfMemory,
+ error.Overflow => return error.Overflow,
+ else => |e| return elf_file.base.cgFail(nav_index, "failed to finish dwarf nav: {s}", .{@errorName(e)}),
+ };
} else if (self.dwarf) |*dwarf| try dwarf.updateComptimeNav(pt, nav_index);
// Exports will be updated by `Zcu.processExports` after the update.
@@ -1602,7 +1607,7 @@ pub fn updateContainerType(
self: *ZigObject,
pt: Zcu.PerThread,
ty: InternPool.Index,
-) link.File.UpdateNavError!void {
+) !void {
const tracy = trace(@src());
defer tracy.end();
@@ -1620,8 +1625,8 @@ fn updateLazySymbol(
const gpa = zcu.gpa;
var required_alignment: InternPool.Alignment = .none;
- var code_buffer = std.ArrayList(u8).init(gpa);
- defer code_buffer.deinit();
+ var code_buffer: std.ArrayListUnmanaged(u8) = .empty;
+ defer code_buffer.deinit(gpa);
const name_str_index = blk: {
const name = try std.fmt.allocPrint(gpa, "__lazy_{s}_{}", .{
@@ -1633,7 +1638,7 @@ fn updateLazySymbol(
};
const src = Type.fromInterned(sym.ty).srcLocOrNull(zcu) orelse Zcu.LazySrcLoc.unneeded;
- const res = try codegen.generateLazySymbol(
+ try codegen.generateLazySymbol(
&elf_file.base,
pt,
src,
@@ -1643,13 +1648,7 @@ fn updateLazySymbol(
.none,
.{ .atom_index = symbol_index },
);
- const code = switch (res) {
- .ok => code_buffer.items,
- .fail => |em| {
- log.err("{s}", .{em.msg});
- return error.CodegenFail;
- },
- };
+ const code = code_buffer.items;
const output_section_index = switch (sym.kind) {
.code => if (self.text_index) |sym_index|
@@ -1696,7 +1695,7 @@ fn updateLazySymbol(
local_sym.value = 0;
local_esym.st_value = 0;
- try elf_file.base.file.?.pwriteAll(code, atom_ptr.offset(elf_file));
+ try elf_file.pwriteAll(code, atom_ptr.offset(elf_file));
}
const LowerConstResult = union(enum) {
@@ -1716,13 +1715,13 @@ fn lowerConst(
) !LowerConstResult {
const gpa = pt.zcu.gpa;
- var code_buffer = std.ArrayList(u8).init(gpa);
- defer code_buffer.deinit();
+ var code_buffer: std.ArrayListUnmanaged(u8) = .empty;
+ defer code_buffer.deinit(gpa);
const name_off = try self.addString(gpa, name);
const sym_index = try self.newSymbolWithAtom(gpa, name_off);
- const res = try codegen.generateSymbol(
+ try codegen.generateSymbol(
&elf_file.base,
pt,
src_loc,
@@ -1730,10 +1729,7 @@ fn lowerConst(
&code_buffer,
.{ .atom_index = sym_index },
);
- const code = switch (res) {
- .ok => code_buffer.items,
- .fail => |em| return .{ .fail = em },
- };
+ const code = code_buffer.items;
const local_sym = self.symbol(sym_index);
const local_esym = &self.symtab.items(.elf_sym)[local_sym.esym_index];
@@ -1748,7 +1744,7 @@ fn lowerConst(
try self.allocateAtom(atom_ptr, true, elf_file);
errdefer self.freeNavMetadata(elf_file, sym_index);
- try elf_file.base.file.?.pwriteAll(code, atom_ptr.offset(elf_file));
+ try elf_file.pwriteAll(code, atom_ptr.offset(elf_file));
return .{ .ok = sym_index };
}
@@ -1758,7 +1754,7 @@ pub fn updateExports(
elf_file: *Elf,
pt: Zcu.PerThread,
exported: Zcu.Exported,
- export_indices: []const u32,
+ export_indices: []const Zcu.Export.Index,
) link.File.UpdateExportsError!void {
const tracy = trace(@src());
defer tracy.end();
@@ -1771,7 +1767,7 @@ pub fn updateExports(
break :blk self.navs.getPtr(nav).?;
},
.uav => |uav| self.uavs.getPtr(uav) orelse blk: {
- const first_exp = zcu.all_exports.items[export_indices[0]];
+ const first_exp = export_indices[0].ptr(zcu);
const res = try self.lowerUav(elf_file, pt, uav, .none, first_exp.src);
switch (res) {
.mcv => {},
@@ -1792,7 +1788,7 @@ pub fn updateExports(
const esym_shndx = self.symtab.items(.shndx)[esym_index];
for (export_indices) |export_idx| {
- const exp = zcu.all_exports.items[export_idx];
+ const exp = export_idx.ptr(zcu);
if (exp.opts.section.unwrap()) |section_name| {
if (!section_name.eqlSlice(".text", &zcu.intern_pool)) {
try zcu.failed_exports.ensureUnusedCapacity(zcu.gpa, 1);
@@ -1849,7 +1845,13 @@ pub fn updateExports(
pub fn updateLineNumber(self: *ZigObject, pt: Zcu.PerThread, ti_id: InternPool.TrackedInst.Index) !void {
if (self.dwarf) |*dwarf| {
- try dwarf.updateLineNumber(pt.zcu, ti_id);
+ const comp = dwarf.bin_file.comp;
+ const diags = &comp.link_diags;
+ dwarf.updateLineNumber(pt.zcu, ti_id) catch |err| switch (err) {
+ error.Overflow => return error.Overflow,
+ error.OutOfMemory => return error.OutOfMemory,
+ else => |e| return diags.fail("failed to update dwarf line numbers: {s}", .{@errorName(e)}),
+ };
}
}
@@ -1935,8 +1937,8 @@ pub fn allocateAtom(self: *ZigObject, atom_ptr: *Atom, requires_padding: bool, e
const shdr = &slice.items(.shdr)[atom_ptr.output_section_index];
const last_atom_ref = &slice.items(.last_atom)[atom_ptr.output_section_index];
- // FIXME:JK this only works if this atom is the only atom in the output section
- // In every other case, we need to redo the prev/next links
+ // This only works if this atom is the only atom in the output section. In
+ // every other case, we need to redo the prev/next links.
if (last_atom_ref.eql(atom_ptr.ref())) last_atom_ref.* = .{};
const alloc_res = try elf_file.allocateChunk(.{
diff --git a/src/link/Elf/eh_frame.zig b/src/link/Elf/eh_frame.zig
index 4df05d49d3..bf46fb0262 100644
--- a/src/link/Elf/eh_frame.zig
+++ b/src/link/Elf/eh_frame.zig
@@ -611,7 +611,7 @@ fn reportInvalidReloc(rec: anytype, elf_file: *Elf, rel: elf.Elf64_Rela) !void {
relocation.fmtRelocType(rel.r_type(), elf_file.getTarget().cpu.arch),
rel.r_offset,
});
- try err.addNote("in {}:.eh_frame", .{elf_file.file(rec.file_index).?.fmtPath()});
+ err.addNote("in {}:.eh_frame", .{elf_file.file(rec.file_index).?.fmtPath()});
return error.RelocFailure;
}
diff --git a/src/link/Elf/relocatable.zig b/src/link/Elf/relocatable.zig
index 3035c33790..e8f9414da6 100644
--- a/src/link/Elf/relocatable.zig
+++ b/src/link/Elf/relocatable.zig
@@ -1,8 +1,8 @@
-pub fn flushStaticLib(elf_file: *Elf, comp: *Compilation) link.File.FlushError!void {
+pub fn flushStaticLib(elf_file: *Elf, comp: *Compilation) !void {
const gpa = comp.gpa;
const diags = &comp.link_diags;
- if (diags.hasErrors()) return error.FlushFailure;
+ if (diags.hasErrors()) return error.LinkFailure;
// First, we flush relocatable object file generated with our backends.
if (elf_file.zigObjectPtr()) |zig_object| {
@@ -127,13 +127,13 @@ pub fn flushStaticLib(elf_file: *Elf, comp: *Compilation) link.File.FlushError!v
try elf_file.base.file.?.setEndPos(total_size);
try elf_file.base.file.?.pwriteAll(buffer.items, 0);
- if (diags.hasErrors()) return error.FlushFailure;
+ if (diags.hasErrors()) return error.LinkFailure;
}
-pub fn flushObject(elf_file: *Elf, comp: *Compilation) link.File.FlushError!void {
+pub fn flushObject(elf_file: *Elf, comp: *Compilation) !void {
const diags = &comp.link_diags;
- if (diags.hasErrors()) return error.FlushFailure;
+ if (diags.hasErrors()) return error.LinkFailure;
// Now, we are ready to resolve the symbols across all input files.
// We will first resolve the files in the ZigObject, next in the parsed
@@ -179,7 +179,7 @@ pub fn flushObject(elf_file: *Elf, comp: *Compilation) link.File.FlushError!void
try elf_file.writeShdrTable();
try elf_file.writeElfHeader();
- if (diags.hasErrors()) return error.FlushFailure;
+ if (diags.hasErrors()) return error.LinkFailure;
}
fn claimUnresolved(elf_file: *Elf) void {