diff options
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/x86_64/CodeGen.zig | 9 |
1 files changed, 8 insertions, 1 deletions
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 }, }; |
