Merge pull request #2345 from uweigand/abi-stackalign

machinst ABI: Allow back-end to define stack alignment
This commit is contained in:
Chris Fallin
2020-11-03 09:02:41 -08:00
committed by GitHub
4 changed files with 19 additions and 1 deletions

View File

@@ -152,6 +152,11 @@ impl ABIMachineSpec for AArch64MachineDeps {
64 64
} }
/// Return required stack alignment in bytes.
fn stack_align(_call_conv: isa::CallConv) -> u32 {
16
}
fn compute_arg_locs( fn compute_arg_locs(
call_conv: isa::CallConv, call_conv: isa::CallConv,
params: &[ir::AbiParam], params: &[ir::AbiParam],

View File

@@ -45,6 +45,11 @@ impl ABIMachineSpec for Arm32MachineDeps {
32 32
} }
/// Return required stack alignment in bytes.
fn stack_align(_call_conv: isa::CallConv) -> u32 {
8
}
fn compute_arg_locs( fn compute_arg_locs(
_call_conv: isa::CallConv, _call_conv: isa::CallConv,
params: &[ir::AbiParam], params: &[ir::AbiParam],

View File

@@ -90,6 +90,11 @@ impl ABIMachineSpec for X64ABIMachineSpec {
64 64
} }
/// Return required stack alignment in bytes.
fn stack_align(_call_conv: isa::CallConv) -> u32 {
16
}
fn compute_arg_locs( fn compute_arg_locs(
call_conv: isa::CallConv, call_conv: isa::CallConv,
params: &[ir::AbiParam], params: &[ir::AbiParam],

View File

@@ -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 /// Process a list of parameters or return values and allocate them to registers
/// and stack slots. /// and stack slots.
/// ///
@@ -942,7 +945,7 @@ impl<M: ABIMachineSpec> ABICallee for ABICalleeImpl<M> {
); );
total_stacksize += self.flags.baldrdash_prologue_words() as u32 * bytes; 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 total_stacksize = (total_stacksize + mask) & !mask; // 16-align the stack.
if !self.call_conv.extends_baldrdash() { if !self.call_conv.extends_baldrdash() {