From 5783ea2c9a95116a5c73e917ebe321b5eea513ab Mon Sep 17 00:00:00 2001 From: Tyler McMullen Date: Mon, 4 Dec 2017 17:19:27 -0800 Subject: [PATCH] Account for return address when reserving stack space for CSRs. --- cranelift/filetests/isa/intel/prologue-epilogue.cton | 4 ++-- lib/cretonne/src/isa/intel/abi.rs | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/cranelift/filetests/isa/intel/prologue-epilogue.cton b/cranelift/filetests/isa/intel/prologue-epilogue.cton index df0bf28ff0..425b790fbf 100644 --- a/cranelift/filetests/isa/intel/prologue-epilogue.cton +++ b/cranelift/filetests/isa/intel/prologue-epilogue.cton @@ -10,8 +10,8 @@ ebb0: } ; check: function %foo(i64 fp [%rbp], i64 csr [%rbx], i64 csr [%r12], i64 csr [%r13], i64 csr [%r14], i64 csr [%r15]) -> i64 fp [%rbp], i64 csr [%rbx], i64 csr [%r12], i64 csr [%r13], i64 csr [%r14], i64 csr [%r15] native { -; nextln: ss0 = local 168, offset -216 -; nextln: ss1 = incoming_arg 48, offset -48 +; nextln: ss0 = local 168, offset -224 +; nextln: ss1 = incoming_arg 56, offset -56 ; check: ebb0(v0: i64 [%rbp], v1: i64 [%rbx], v2: i64 [%r12], v3: i64 [%r13], v4: i64 [%r14], v5: i64 [%r15]): ; nextln: x86_push v0 ; nextln: copy_special %rsp -> %rbp diff --git a/lib/cretonne/src/isa/intel/abi.rs b/lib/cretonne/src/isa/intel/abi.rs index ad85a8e0af..733c2a3eb5 100644 --- a/lib/cretonne/src/isa/intel/abi.rs +++ b/lib/cretonne/src/isa/intel/abi.rs @@ -177,8 +177,15 @@ pub fn prologue_epilogue(func: &mut ir::Function, isa: &TargetIsa) -> result::Ct ir::types::I32 }; let csrs = callee_saved_registers(isa.flags()); - let csr_stack_size = ((csrs.len() + 1) * word_size as usize) as i32; + // The reserved stack area is composed of: + // return address + frame pointer + all callee-saved registers + // + // Pushing the return address is an implicit function of the `call` + // instruction. Each of the others we will then push explicitly. Then we + // will adjust the stack pointer to make room for the rest of the required + // space for this frame. + let csr_stack_size = ((csrs.len() + 2) * word_size as usize) as i32; func.create_stack_slot(ir::StackSlotData { kind: ir::StackSlotKind::IncomingArg, size: csr_stack_size as u32,