diff --git a/cranelift/codegen/src/isa/aarch64/abi.rs b/cranelift/codegen/src/isa/aarch64/abi.rs index acd8cc88e5..287b570efd 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 4611899af6..8de86ca861 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 25d1f58762..48f5d92a77 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 2fe61d78d1..70ffaa753f 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. /// @@ -942,7 +945,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. if !self.call_conv.extends_baldrdash() {