Commit 52a029e503
Changed files (2)
src
codegen
x86_64
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);
+}