authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-10-26 11:12:23-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-10-29 19:31:44-04:00
log52a029e503f1c8180a5479871737f01a3b43d1b5
treed5d0f109ee24177a18a5562cc6190069aeefb48c
parentada9035af5cc80f9e8df9818a6dbc4cac5ffd287

x86_64: continue hacking around unimplemented linker logic

Closes #25666

2 files changed, 19 insertions(+), 1 deletions(-)

src/codegen/x86_64/CodeGen.zig+8-1
......@@ -179000,7 +179000,14 @@ fn genSetMem(
179000179000 .reg => |base_reg| .{ .register_offset = .{ .reg = base_reg, .off = disp } },
179001179001 .frame => |base_frame_index| .{ .lea_frame = .{ .index = base_frame_index, .off = disp } },
179002179002 .table, .rip_inst, .lazy_sym => unreachable,
179003 .nav => |nav| .{ .lea_nav = nav },
179003 .nav => |nav| {
179004 // hack around linker relocation bugs
179005 const addr_reg = try self.copyToTmpRegister(.usize, .{ .lea_nav = nav });
179006 const addr_lock = self.register_manager.lockRegAssumeUnused(addr_reg);
179007 defer self.register_manager.unlockReg(addr_lock);
179008
179009 return self.genSetMem(.{ .reg = addr_reg }, disp, ty, src_mcv, opts);
179010 },
179004179011 .uav => |uav| .{ .lea_uav = uav },
179005179012 .extern_func => |extern_func| .{ .lea_extern_func = extern_func },
179006179013 };
test/behavior/memset.zig+11
......@@ -179,3 +179,14 @@ test "@memset with zero-length array" {
179179 var array: [0]usize = undefined;
180180 @memset(&array, 0);
181181}
182
183test "@memset a global array" {
184 const S = struct {
185 var buf: [1]u32 = .{123};
186 };
187 try expect(S.buf[0] == 123);
188 @memset(&S.buf, 456);
189 try expect(S.buf[0] == 456);
190 @memset(&S.buf, S.buf[0] + 333);
191 try expect(S.buf[0] == 789);
192}