aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-01-13 17:34:09 -0800
committerAndrew Kelley <andrew@ziglang.org>2025-01-15 15:11:36 -0800
commitcde84c8795e8da13512098c8b19f17217e691dde (patch)
tree2d700b667d20cdb9751eb6a7264d4ecf61c75080
parentdd9a64721030cf10065e74755f0c757cb470bcf3 (diff)
downloadzig-cde84c8795e8da13512098c8b19f17217e691dde.tar.gz
zig-cde84c8795e8da13512098c8b19f17217e691dde.zip
wasm linker: fix missed addend for uav and nav fixups
-rw-r--r--src/codegen.zig2
-rw-r--r--src/link/Wasm.zig2
-rw-r--r--src/link/Wasm/Flush.zig4
3 files changed, 6 insertions, 2 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index 0040e9c921..f4b524c872 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -677,6 +677,7 @@ fn lowerUavRef(
wasm.uav_fixups.appendAssumeCapacity(.{
.uavs_exe_index = try wasm.refUavExe(uav.val),
.offset = @intCast(code.items.len),
+ .addend = @intCast(offset),
});
}
code.appendNTimesAssumeCapacity(0, ptr_width_bytes);
@@ -761,6 +762,7 @@ fn lowerNavRef(
wasm.nav_fixups.appendAssumeCapacity(.{
.navs_exe_index = try wasm.refNavExe(nav_index),
.offset = @intCast(code.items.len),
+ .addend = @intCast(offset),
});
}
}
diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig
index 4b130fce00..517a9002f1 100644
--- a/src/link/Wasm.zig
+++ b/src/link/Wasm.zig
@@ -312,12 +312,14 @@ pub const UavFixup = extern struct {
uavs_exe_index: UavsExeIndex,
/// Index into `string_bytes`.
offset: u32,
+ addend: u32,
};
pub const NavFixup = extern struct {
navs_exe_index: NavsExeIndex,
/// Index into `string_bytes`.
offset: u32,
+ addend: u32,
};
pub const FuncTableFixup = extern struct {
diff --git a/src/link/Wasm/Flush.zig b/src/link/Wasm/Flush.zig
index 5a7fbc091b..b6627bff07 100644
--- a/src/link/Wasm/Flush.zig
+++ b/src/link/Wasm/Flush.zig
@@ -796,7 +796,7 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {
if (!is_obj) {
for (wasm.uav_fixups.items) |uav_fixup| {
const ds_id: Wasm.DataSegmentId = .pack(wasm, .{ .uav_exe = uav_fixup.uavs_exe_index });
- const vaddr = f.data_segments.get(ds_id).?;
+ const vaddr = f.data_segments.get(ds_id).? + uav_fixup.addend;
if (!is64) {
mem.writeInt(u32, wasm.string_bytes.items[uav_fixup.offset..][0..4], vaddr, .little);
} else {
@@ -805,7 +805,7 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {
}
for (wasm.nav_fixups.items) |nav_fixup| {
const ds_id: Wasm.DataSegmentId = .pack(wasm, .{ .nav_exe = nav_fixup.navs_exe_index });
- const vaddr = f.data_segments.get(ds_id).?;
+ const vaddr = f.data_segments.get(ds_id).? + nav_fixup.addend;
if (!is64) {
mem.writeInt(u32, wasm.string_bytes.items[nav_fixup.offset..][0..4], vaddr, .little);
} else {