Fix sret for AArch64 (#4634)
* Fix sret for AArch64 AArch64 requires the struct return address argument to be stored in the x8 register. This register is never used for regular arguments. * Add extra sret tests for x86_64
This commit is contained in:
@@ -143,6 +143,7 @@ impl ABIMachineSpec for AArch64MachineDeps {
|
||||
let (rcs, reg_types) = Inst::rc_for_type(param.value_type)?;
|
||||
|
||||
if let ir::ArgumentPurpose::StructArgument(size) = param.purpose {
|
||||
assert_eq!(args_or_rets, ArgsOrRets::Args);
|
||||
let offset = next_stack as i64;
|
||||
let size = size as u64;
|
||||
assert!(size % 8 == 0, "StructArgument size is not properly aligned");
|
||||
@@ -156,6 +157,24 @@ impl ABIMachineSpec for AArch64MachineDeps {
|
||||
continue;
|
||||
}
|
||||
|
||||
if let ir::ArgumentPurpose::StructReturn = param.purpose {
|
||||
// FIXME add assert_eq!(args_or_rets, ArgsOrRets::Args); once
|
||||
// ensure_struct_return_ptr_is_returned is gone.
|
||||
assert!(
|
||||
param.value_type == types::I64,
|
||||
"StructReturn must be a pointer sized integer"
|
||||
);
|
||||
ret.push(ABIArg::Slots {
|
||||
slots: smallvec![ABIArgSlot::Reg {
|
||||
reg: xreg(8).to_real_reg().unwrap(),
|
||||
ty: types::I64,
|
||||
extension: param.extension,
|
||||
},],
|
||||
purpose: ir::ArgumentPurpose::StructReturn,
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
// Handle multi register params
|
||||
//
|
||||
// See AArch64 ABI (https://github.com/ARM-software/abi-aa/blob/2021Q1/aapcs64/aapcs64.rst#642parameter-passing-rules), (Section 6.4.2 Stage C).
|
||||
|
||||
Reference in New Issue
Block a user