diff --git a/ir_x86.dasc b/ir_x86.dasc index 3abab8e..916717f 100644 --- a/ir_x86.dasc +++ b/ir_x86.dasc @@ -1611,7 +1611,7 @@ static void ir_emit_prologue(ir_ctx *ctx) | push rbp | mov rbp, rsp } - if (data->stack_frame_size) { + if (data->stack_frame_size + data->call_stack_size) { | sub rsp, (data->stack_frame_size + data->call_stack_size) } if (data->used_preserved_regs) { @@ -1671,7 +1671,7 @@ static void ir_emit_epilogue(ir_ctx *ctx) if (ctx->flags & IR_USE_FRAME_POINTER) { | mov rsp, rbp | pop rbp - } else if (data->stack_frame_size) { + } else if (data->stack_frame_size + data->call_stack_size) { | add rsp, (data->stack_frame_size + data->call_stack_size) } } @@ -3565,7 +3565,7 @@ static int ir_parallel_copy(ir_ctx *ctx, ir_copy *copies, int count, ir_reg tmp_ return 1; } -static int32_t ir_call_used_stack(ir_ctx *ctx, ir_insn *insn) +static int32_t ir_call_used_stack(ir_ctx *ctx, ir_insn *insn, bool align) { int j, n; ir_type type; @@ -3593,7 +3593,7 @@ static int32_t ir_call_used_stack(ir_ctx *ctx, ir_insn *insn) } } - if (used_stack % 16 != 0) { + if (align && used_stack % 16 != 0) { /* Stack must be 16 byte aligned */ used_stack += 8; } @@ -3626,7 +3626,7 @@ static int32_t ir_emit_arguments(ir_ctx *ctx, ir_ref def, ir_insn *insn, ir_reg // TODO: support for preallocated stack used_stack = 0; } else { - used_stack = ir_call_used_stack(ctx, insn); + used_stack = ir_call_used_stack(ctx, insn, 1); data->call_stack_size += used_stack; if (used_stack) { | sub rsp, used_stack @@ -4395,7 +4395,7 @@ static void ir_preallocate_call_stack(ir_ctx *ctx, ir_backend_data *data) for (i = 1, insn = ctx->ir_base + 1; i < ctx->insns_count;) { if (insn->op == IR_CALL) { - call_stack_size = ir_call_used_stack(ctx, insn); + call_stack_size = ir_call_used_stack(ctx, insn, 0); if (call_stack_size > peak_call_stack_size) { peak_call_stack_size = call_stack_size; } @@ -4443,11 +4443,12 @@ static void ir_calc_stack_frame_size(ir_ctx *ctx, ir_backend_data *data) data->stack_frame_alignment += 8; } } else { - while (IR_ALIGNED_SIZE(data->stack_frame_size + sizeof(void*), 16) != data->stack_frame_size + sizeof(void*)) { + ir_preallocate_call_stack(ctx, data); + while (IR_ALIGNED_SIZE(data->stack_frame_size + data->call_stack_size + sizeof(void*), 16) != + data->stack_frame_size + data->call_stack_size + sizeof(void*)) { data->stack_frame_size += 8; data->stack_frame_alignment += 8; } - ir_preallocate_call_stack(ctx, data); } } } diff --git a/tests/debug/args_001.irt b/tests/debug/args_001.irt index 5806981..2311387 100644 --- a/tests/debug/args_001.irt +++ b/tests/debug/args_001.irt @@ -22,7 +22,7 @@ } --EXPECT-- test: - subq $0x38, %rsp + subq $0x28, %rsp movl $6, (%rsp) movl $7, 8(%rsp) movl $8, 0x10(%rsp) @@ -37,7 +37,7 @@ test: movabsq $0x100000000, %r9 movabsq $_IO_printf, %rax callq *%rax - addq $0x38, %rsp + addq $0x28, %rsp retq 1 2 3 4 0x100000000 6 7 8 9 0x100000000