diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-05-23 10:13:05 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-05-23 12:04:17 +0200 |
| commit | 71bbc5efc9c35e4d862dba4f40e5bafe165fcbe4 (patch) | |
| tree | 079f4683ca39675d86ff2763a3090ad327d851d8 /src/link/MachO/Atom.zig | |
| parent | 78b441e8deeb4e779335c09b865a497c13531657 (diff) | |
| download | zig-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.zig | 25 |
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, |
