diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2022-03-02 14:53:02 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2022-03-02 14:53:02 +0100 |
| commit | c9d1db7e8eda6374bfc5ba51097e24d93ab91ddb (patch) | |
| tree | 939a84bc006c6bbf24f89c050b95a3f577dc1b78 /src | |
| parent | 350bf9db131dd5573da0d06d38e40746c99a8a34 (diff) | |
| download | zig-c9d1db7e8eda6374bfc5ba51097e24d93ab91ddb.tar.gz zig-c9d1db7e8eda6374bfc5ba51097e24d93ab91ddb.zip | |
x64: fix incorrect calc of rdi spill stack loc for backpatching
Diffstat (limited to 'src')
| -rw-r--r-- | src/arch/x86_64/CodeGen.zig | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 8efb1042ef..da98c1c901 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -472,10 +472,14 @@ fn gen(self: *Self) InnerError!void { .regs = 0, .disp = mem.alignForwardGeneric(u32, self.next_stack_offset, 8), }; + var disp = data.disp + 8; inline for (callee_preserved_regs) |reg, i| { if (self.register_manager.isRegAllocated(reg)) { if (reg.to64() == .rdi) { for (self.ret_backpatches.items) |inst| { + log.debug(".rdi was spilled, backpatching with mov from stack at offset {}", .{ + -@intCast(i32, disp), + }); const ops = Mir.Ops.decode(self.mir_instructions.items(.ops)[inst]); self.mir_instructions.set(inst, Mir.Inst{ .tag = .mov, @@ -484,12 +488,13 @@ fn gen(self: *Self) InnerError!void { .reg2 = .rbp, .flags = 0b01, }).encode(), - .data = .{ .imm = @bitCast(u32, -@intCast(i32, self.max_end_stack + 8)) }, + .data = .{ .imm = @bitCast(u32, -@intCast(i32, disp)) }, }); } } data.regs |= 1 << @intCast(u5, i); self.max_end_stack += 8; + disp += 8; } } break :blk try self.addExtra(data); |
