aboutsummaryrefslogtreecommitdiff
path: root/src/link/MachO/Atom.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-05-23 10:13:05 +0200
committerJakub Konka <kubkon@jakubkonka.com>2024-05-23 12:04:17 +0200
commit71bbc5efc9c35e4d862dba4f40e5bafe165fcbe4 (patch)
tree079f4683ca39675d86ff2763a3090ad327d851d8 /src/link/MachO/Atom.zig
parent78b441e8deeb4e779335c09b865a497c13531657 (diff)
downloadzig-71bbc5efc9c35e4d862dba4f40e5bafe165fcbe4.tar.gz
zig-71bbc5efc9c35e4d862dba4f40e5bafe165fcbe4.zip
link/macho: print error message when hitting unexpected remainder error
Diffstat (limited to 'src/link/MachO/Atom.zig')
-rw-r--r--src/link/MachO/Atom.zig25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/link/MachO/Atom.zig b/src/link/MachO/Atom.zig
index e31619162e..1a315330e3 100644
--- a/src/link/MachO/Atom.zig
+++ b/src/link/MachO/Atom.zig
@@ -660,6 +660,19 @@ fn resolveRelocInner(
// Address of the __got_zig table entry if any.
const ZIG_GOT = @as(i64, @intCast(rel.getZigGotTargetAddress(macho_file)));
+ const divExact = struct {
+ fn divExact(atom: Atom, r: Relocation, num: u12, den: u12, ctx: *MachO) !u12 {
+ return math.divExact(u12, num, den) catch {
+ try ctx.reportParseError2(atom.getFile(ctx).getIndex(), "{s}: unexpected remainder when resolving {s} at offset 0x{x}", .{
+ atom.getName(ctx),
+ r.fmtPretty(ctx.getTarget().cpu.arch),
+ r.offset,
+ });
+ return error.UnexpectedRemainder;
+ };
+ }
+ }.divExact;
+
switch (rel.tag) {
.local => relocs_log.debug(" {x}<+{d}>: {s}: [=> {x}] atom({d})", .{
P,
@@ -831,12 +844,12 @@ fn resolveRelocInner(
};
inst.load_store_register.offset = switch (inst.load_store_register.size) {
0 => if (inst.load_store_register.v == 1)
- try math.divExact(u12, @truncate(target), 16)
+ try divExact(self, rel, @truncate(target), 16, macho_file)
else
@truncate(target),
- 1 => try math.divExact(u12, @truncate(target), 2),
- 2 => try math.divExact(u12, @truncate(target), 4),
- 3 => try math.divExact(u12, @truncate(target), 8),
+ 1 => try divExact(self, rel, @truncate(target), 2, macho_file),
+ 2 => try divExact(self, rel, @truncate(target), 4, macho_file),
+ 3 => try divExact(self, rel, @truncate(target), 8, macho_file),
};
try writer.writeInt(u32, inst.toU32(), .little);
}
@@ -847,7 +860,7 @@ fn resolveRelocInner(
assert(rel.meta.length == 2);
assert(!rel.meta.pcrel);
const target = math.cast(u64, G + A) orelse return error.Overflow;
- aarch64.writeLoadStoreRegInst(try math.divExact(u12, @truncate(target), 8), code[rel_offset..][0..4]);
+ aarch64.writeLoadStoreRegInst(try divExact(self, rel, @truncate(target), 8, macho_file), code[rel_offset..][0..4]);
},
.tlvp_pageoff => {
@@ -899,7 +912,7 @@ fn resolveRelocInner(
.load_store_register = .{
.rt = reg_info.rd,
.rn = reg_info.rn,
- .offset = try math.divExact(u12, @truncate(target), 8),
+ .offset = try divExact(self, rel, @truncate(target), 8, macho_file),
.opc = 0b01,
.op1 = 0b01,
.v = 0,