From 52a029e503f1c8180a5479871737f01a3b43d1b5 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Sun, 26 Oct 2025 11:12:23 -0400 Subject: [PATCH] x86_64: continue hacking around unimplemented linker logic Closes #25666 --- src/codegen/x86_64/CodeGen.zig | 9 ++++++++- test/behavior/memset.zig | 11 +++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/codegen/x86_64/CodeGen.zig b/src/codegen/x86_64/CodeGen.zig index 4fb935f01d..e826797671 100644 --- a/src/codegen/x86_64/CodeGen.zig +++ b/src/codegen/x86_64/CodeGen.zig @@ -179000,7 +179000,14 @@ fn genSetMem( .reg => |base_reg| .{ .register_offset = .{ .reg = base_reg, .off = disp } }, .frame => |base_frame_index| .{ .lea_frame = .{ .index = base_frame_index, .off = disp } }, .table, .rip_inst, .lazy_sym => unreachable, - .nav => |nav| .{ .lea_nav = nav }, + .nav => |nav| { + // hack around linker relocation bugs + const addr_reg = try self.copyToTmpRegister(.usize, .{ .lea_nav = nav }); + const addr_lock = self.register_manager.lockRegAssumeUnused(addr_reg); + defer self.register_manager.unlockReg(addr_lock); + + return self.genSetMem(.{ .reg = addr_reg }, disp, ty, src_mcv, opts); + }, .uav => |uav| .{ .lea_uav = uav }, .extern_func => |extern_func| .{ .lea_extern_func = extern_func }, }; diff --git a/test/behavior/memset.zig b/test/behavior/memset.zig index f4bb080e30..5d8db9e6e7 100644 --- a/test/behavior/memset.zig +++ b/test/behavior/memset.zig @@ -179,3 +179,14 @@ test "@memset with zero-length array" { var array: [0]usize = undefined; @memset(&array, 0); } + +test "@memset a global array" { + const S = struct { + var buf: [1]u32 = .{123}; + }; + try expect(S.buf[0] == 123); + @memset(&S.buf, 456); + try expect(S.buf[0] == 456); + @memset(&S.buf, S.buf[0] + 333); + try expect(S.buf[0] == 789); +}