Merge pull request #2345 from uweigand/abi-stackalign
machinst ABI: Allow back-end to define stack alignment
This commit is contained in:
@@ -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],
|
||||||
|
|||||||
@@ -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],
|
||||||
|
|||||||
@@ -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],
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user