Commit 52a029e503

Jacob Young <jacobly0@users.noreply.github.com>
2025-10-26 16:12:23
x86_64: continue hacking around unimplemented linker logic
Closes #25666
1 parent ada9035
Changed files (2)
src
codegen
test
behavior
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 },
     };
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);
+}