x86_64: continue hacking around unimplemented linker logic

Closes #25666
This commit is contained in:
Jacob Young 2025-10-26 11:12:23 -04:00 committed by Jacob Young
parent ada9035af5
commit 52a029e503
2 changed files with 19 additions and 1 deletions

View File

@ -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 },
};

View File

@ -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);
}