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 b897352ebe37..6dc3deea4c27 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 8cd2df1396b8..cfd37f4c4d84 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 bbbabc5ff4d6..3034701e91d5 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 68024b3f0874..bb5cff506c2e 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;