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(...@@ -677,6 +677,7 @@ fn lowerUavRef(
677 wasm.uav_fixups.appendAssumeCapacity(.{677 wasm.uav_fixups.appendAssumeCapacity(.{
678 .uavs_exe_index = try wasm.refUavExe(uav.val),678 .uavs_exe_index = try wasm.refUavExe(uav.val),
679 .offset = @intCast(code.items.len),679 .offset = @intCast(code.items.len),
680 .addend = @intCast(offset),
680 });681 });
681 }682 }
682 code.appendNTimesAssumeCapacity(0, ptr_width_bytes);683 code.appendNTimesAssumeCapacity(0, ptr_width_bytes);
...@@ -761,6 +762,7 @@ fn lowerNavRef(...@@ -761,6 +762,7 @@ fn lowerNavRef(
761 wasm.nav_fixups.appendAssumeCapacity(.{762 wasm.nav_fixups.appendAssumeCapacity(.{
762 .navs_exe_index = try wasm.refNavExe(nav_index),763 .navs_exe_index = try wasm.refNavExe(nav_index),
763 .offset = @intCast(code.items.len),764 .offset = @intCast(code.items.len),
765 .addend = @intCast(offset),
764 });766 });
765 }767 }
766 }768 }
src/link/Wasm.zig+2
...@@ -312,12 +312,14 @@ pub const UavFixup = extern struct {...@@ -312,12 +312,14 @@ pub const UavFixup = extern struct {
312 uavs_exe_index: UavsExeIndex,312 uavs_exe_index: UavsExeIndex,
313 /// Index into `string_bytes`.313 /// Index into `string_bytes`.
314 offset: u32,314 offset: u32,
315 addend: u32,
315};316};
316317
317pub const NavFixup = extern struct {318pub const NavFixup = extern struct {
318 navs_exe_index: NavsExeIndex,319 navs_exe_index: NavsExeIndex,
319 /// Index into `string_bytes`.320 /// Index into `string_bytes`.
320 offset: u32,321 offset: u32,
322 addend: u32,
321};323};
322324
323pub const FuncTableFixup = extern struct {325pub const FuncTableFixup = extern struct {
src/link/Wasm/Flush.zig+2-2
...@@ -796,7 +796,7 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {...@@ -796,7 +796,7 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {
796 if (!is_obj) {796 if (!is_obj) {
797 for (wasm.uav_fixups.items) |uav_fixup| {797 for (wasm.uav_fixups.items) |uav_fixup| {
798 const ds_id: Wasm.DataSegmentId = .pack(wasm, .{ .uav_exe = uav_fixup.uavs_exe_index });798 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;
800 if (!is64) {800 if (!is64) {
801 mem.writeInt(u32, wasm.string_bytes.items[uav_fixup.offset..][0..4], vaddr, .little);801 mem.writeInt(u32, wasm.string_bytes.items[uav_fixup.offset..][0..4], vaddr, .little);
802 } else {802 } else {
...@@ -805,7 +805,7 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {...@@ -805,7 +805,7 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {
805 }805 }
806 for (wasm.nav_fixups.items) |nav_fixup| {806 for (wasm.nav_fixups.items) |nav_fixup| {
807 const ds_id: Wasm.DataSegmentId = .pack(wasm, .{ .nav_exe = nav_fixup.navs_exe_index });807 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;
809 if (!is64) {809 if (!is64) {
810 mem.writeInt(u32, wasm.string_bytes.items[nav_fixup.offset..][0..4], vaddr, .little);810 mem.writeInt(u32, wasm.string_bytes.items[nav_fixup.offset..][0..4], vaddr, .little);
811 } else {811 } else {