From d02ae3940c9c744d59d7cbf14d004d934676e1cd Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Mon, 2 Nov 2020 13:07:49 +0100 Subject: [PATCH] machinst ABI: Allow back-end to define stack alignment The common gen_prologue code currently assumes that the stack pointer has to be aligned to twice the word size. While this is true for many ABIs, it does not hold universally. This patch adds a new callback stack_align that back-ends can provide to define the specific stack alignment required by the ABI on that platform. --- cranelift/codegen/src/isa/aarch64/abi.rs | 5 +++++ cranelift/codegen/src/isa/arm32/abi.rs | 5 +++++ cranelift/codegen/src/isa/x64/abi.rs | 5 +++++ cranelift/codegen/src/machinst/abi_impl.rs | 5 ++++- 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/cranelift/codegen/src/isa/aarch64/abi.rs b/cranelift/codegen/src/isa/aarch64/abi.rs index b897352ebe..6dc3deea4c 100644 --- a/cranelift/codegen/src/isa/aarch64/abi.rs +++ b/cranelift/codegen/src/isa/aarch64/abi.rs @@ -152,6 +152,11 @@ impl ABIMachineSpec for AArch64MachineDeps { 64 } + /// Return required stack alignment in bytes. + fn stack_align(_call_conv: isa::CallConv) -> u32 { + 16 + } + fn compute_arg_locs( call_conv: isa::CallConv, params: &[ir::AbiParam], diff --git a/cranelift/codegen/src/isa/arm32/abi.rs b/cranelift/codegen/src/isa/arm32/abi.rs index 8cd2df1396..cfd37f4c4d 100644 --- a/cranelift/codegen/src/isa/arm32/abi.rs +++ b/cranelift/codegen/src/isa/arm32/abi.rs @@ -45,6 +45,11 @@ impl ABIMachineSpec for Arm32MachineDeps { 32 } + /// Return required stack alignment in bytes. + fn stack_align(_call_conv: isa::CallConv) -> u32 { + 8 + } + fn compute_arg_locs( _call_conv: isa::CallConv, params: &[ir::AbiParam], diff --git a/cranelift/codegen/src/isa/x64/abi.rs b/cranelift/codegen/src/isa/x64/abi.rs index bbbabc5ff4..3034701e91 100644 --- a/cranelift/codegen/src/isa/x64/abi.rs +++ b/cranelift/codegen/src/isa/x64/abi.rs @@ -90,6 +90,11 @@ impl ABIMachineSpec for X64ABIMachineSpec { 64 } + /// Return required stack alignment in bytes. + fn stack_align(_call_conv: isa::CallConv) -> u32 { + 16 + } + fn compute_arg_locs( call_conv: isa::CallConv, params: &[ir::AbiParam], diff --git a/cranelift/codegen/src/machinst/abi_impl.rs b/cranelift/codegen/src/machinst/abi_impl.rs index 68024b3f08..bb5cff506c 100644 --- a/cranelift/codegen/src/machinst/abi_impl.rs +++ b/cranelift/codegen/src/machinst/abi_impl.rs @@ -216,6 +216,9 @@ pub trait ABIMachineSpec { } } + /// Returns required stack alignment in bytes. + fn stack_align(call_conv: isa::CallConv) -> u32; + /// Process a list of parameters or return values and allocate them to registers /// and stack slots. /// @@ -936,7 +939,7 @@ impl ABICallee for ABICalleeImpl { ); total_stacksize += self.flags.baldrdash_prologue_words() as u32 * bytes; } - let mask = 2 * bytes - 1; + let mask = M::stack_align(self.call_conv) - 1; let total_stacksize = (total_stacksize + mask) & !mask; // 16-align the stack. let mut fixed_frame_storage_size = 0;