| ... | ... | @@ -2581,16 +2581,10 @@ fn airArg(self: *Self, inst: Air.Inst.Index) !void { |
| 2581 | 2581 | self.arg_index += 1; |
| 2582 | 2582 | |
| 2583 | 2583 | const mcv = self.args[arg_index]; |
| 2584 | | const max_stack = loop: for (self.args) |arg| { |
| 2585 | | switch (arg) { |
| 2586 | | .stack_offset => |last| break :loop last, |
| 2587 | | else => {}, |
| 2588 | | } |
| 2589 | | } else 0; |
| 2590 | 2584 | const payload = try self.addExtra(Mir.ArgDbgInfo{ |
| 2591 | 2585 | .air_inst = inst, |
| 2592 | 2586 | .arg_index = arg_index, |
| 2593 | | .max_stack = @intCast(u32, max_stack), |
| 2587 | .max_stack = self.max_end_stack, |
| 2594 | 2588 | }); |
| 2595 | 2589 | _ = try self.addInst(.{ |
| 2596 | 2590 | .tag = .arg_dbg_info, |
| ... | ... | @@ -2607,7 +2601,7 @@ fn airArg(self: *Self, inst: Air.Inst.Index) !void { |
| 2607 | 2601 | break :blk mcv; |
| 2608 | 2602 | }, |
| 2609 | 2603 | .stack_offset => |off| { |
| 2610 | | const offset = max_stack - off + 16; |
| 2604 | const offset = @intCast(i32, self.max_end_stack) - off + 16; |
| 2611 | 2605 | break :blk MCValue{ .stack_offset = -offset }; |
| 2612 | 2606 | }, |
| 2613 | 2607 | else => return self.fail("TODO implement arg for {}", .{mcv}), |
| ... | ... | @@ -2651,7 +2645,6 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void { |
| 2651 | 2645 | var info = try self.resolveCallingConventionValues(fn_ty); |
| 2652 | 2646 | defer info.deinit(self); |
| 2653 | 2647 | |
| 2654 | | var stack_adjustment: ?u32 = null; |
| 2655 | 2648 | for (args) |arg, arg_i| { |
| 2656 | 2649 | const mc_arg = info.args[arg_i]; |
| 2657 | 2650 | const arg_ty = self.air.typeOf(arg); |
| ... | ... | @@ -2666,9 +2659,6 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void { |
| 2666 | 2659 | }, |
| 2667 | 2660 | .stack_offset => |off| { |
| 2668 | 2661 | try self.genSetStackArg(arg_ty, off, arg_mcv); |
| 2669 | | if (stack_adjustment == null) { |
| 2670 | | stack_adjustment = @intCast(u32, off); |
| 2671 | | } |
| 2672 | 2662 | }, |
| 2673 | 2663 | .ptr_stack_offset => { |
| 2674 | 2664 | return self.fail("TODO implement calling with MCValue.ptr_stack_offset arg", .{}); |
| ... | ... | @@ -2689,14 +2679,14 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void { |
| 2689 | 2679 | } |
| 2690 | 2680 | } |
| 2691 | 2681 | |
| 2692 | | if (stack_adjustment) |off| { |
| 2682 | if (info.stack_byte_count > 0) { |
| 2693 | 2683 | // Adjust the stack |
| 2694 | 2684 | _ = try self.addInst(.{ |
| 2695 | 2685 | .tag = .sub, |
| 2696 | 2686 | .ops = (Mir.Ops{ |
| 2697 | 2687 | .reg1 = .rsp, |
| 2698 | 2688 | }).encode(), |
| 2699 | | .data = .{ .imm = off }, |
| 2689 | .data = .{ .imm = info.stack_byte_count }, |
| 2700 | 2690 | }); |
| 2701 | 2691 | } |
| 2702 | 2692 | |
| ... | ... | @@ -2824,14 +2814,14 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void { |
| 2824 | 2814 | } |
| 2825 | 2815 | } else unreachable; |
| 2826 | 2816 | |
| 2827 | | if (stack_adjustment) |off| { |
| 2817 | if (info.stack_byte_count > 0) { |
| 2828 | 2818 | // Readjust the stack |
| 2829 | 2819 | _ = try self.addInst(.{ |
| 2830 | 2820 | .tag = .add, |
| 2831 | 2821 | .ops = (Mir.Ops{ |
| 2832 | 2822 | .reg1 = .rsp, |
| 2833 | 2823 | }).encode(), |
| 2834 | | .data = .{ .imm = off }, |
| 2824 | .data = .{ .imm = info.stack_byte_count }, |
| 2835 | 2825 | }); |
| 2836 | 2826 | } |
| 2837 | 2827 | |
| ... | ... | @@ -4847,8 +4837,8 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues { |
| 4847 | 4837 | } |
| 4848 | 4838 | } |
| 4849 | 4839 | |
| 4850 | | result.stack_byte_count = next_stack_offset; |
| 4851 | 4840 | result.stack_align = 16; |
| 4841 | result.stack_byte_count = mem.alignForwardGeneric(u32, next_stack_offset, result.stack_align); |
| 4852 | 4842 | }, |
| 4853 | 4843 | else => return self.fail("TODO implement function parameters for {} on x86_64", .{cc}), |
| 4854 | 4844 | } |