authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-13 17:34:09-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-15 15:11:36-08:00
logcde84c8795e8da13512098c8b19f17217e691dde
tree2d700b667d20cdb9751eb6a7264d4ecf61c75080
parentdd9a64721030cf10065e74755f0c757cb470bcf3

wasm linker: fix missed addend for uav and nav fixups


3 files changed, 6 insertions(+), 2 deletions(-)

src/codegen.zig+2
......@@ -677,6 +677,7 @@ fn lowerUavRef(
677677 wasm.uav_fixups.appendAssumeCapacity(.{
678678 .uavs_exe_index = try wasm.refUavExe(uav.val),
679679 .offset = @intCast(code.items.len),
680 .addend = @intCast(offset),
680681 });
681682 }
682683 code.appendNTimesAssumeCapacity(0, ptr_width_bytes);
......@@ -761,6 +762,7 @@ fn lowerNavRef(
761762 wasm.nav_fixups.appendAssumeCapacity(.{
762763 .navs_exe_index = try wasm.refNavExe(nav_index),
763764 .offset = @intCast(code.items.len),
765 .addend = @intCast(offset),
764766 });
765767 }
766768 }
src/link/Wasm.zig+2
......@@ -312,12 +312,14 @@ pub const UavFixup = extern struct {
312312 uavs_exe_index: UavsExeIndex,
313313 /// Index into `string_bytes`.
314314 offset: u32,
315 addend: u32,
315316};
316317
317318pub const NavFixup = extern struct {
318319 navs_exe_index: NavsExeIndex,
319320 /// Index into `string_bytes`.
320321 offset: u32,
322 addend: u32,
321323};
322324
323325pub const FuncTableFixup = extern struct {
src/link/Wasm/Flush.zig+2-2
......@@ -796,7 +796,7 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {
796796 if (!is_obj) {
797797 for (wasm.uav_fixups.items) |uav_fixup| {
798798 const ds_id: Wasm.DataSegmentId = .pack(wasm, .{ .uav_exe = uav_fixup.uavs_exe_index });
799 const vaddr = f.data_segments.get(ds_id).?;
799 const vaddr = f.data_segments.get(ds_id).? + uav_fixup.addend;
800800 if (!is64) {
801801 mem.writeInt(u32, wasm.string_bytes.items[uav_fixup.offset..][0..4], vaddr, .little);
802802 } else {
......@@ -805,7 +805,7 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {
805805 }
806806 for (wasm.nav_fixups.items) |nav_fixup| {
807807 const ds_id: Wasm.DataSegmentId = .pack(wasm, .{ .nav_exe = nav_fixup.navs_exe_index });
808 const vaddr = f.data_segments.get(ds_id).?;
808 const vaddr = f.data_segments.get(ds_id).? + nav_fixup.addend;
809809 if (!is64) {
810810 mem.writeInt(u32, wasm.string_bytes.items[nav_fixup.offset..][0..4], vaddr, .little);
811811 } else {