1 use crate::abi
::call
::{ArgAbi, FnAbi, Reg, Uniform}
;
2 use crate::abi
::{HasDataLayout, Size}
;
4 fn classify_ret
<Ty
, C
>(cx
: &C
, ret
: &mut ArgAbi
<'_
, Ty
>, offset
: &mut Size
)
8 if !ret
.layout
.is_aggregate() {
9 ret
.extend_integer_width_to(32);
12 *offset
+= cx
.data_layout().pointer_size
;
16 fn classify_arg
<Ty
, C
>(cx
: &C
, arg
: &mut ArgAbi
<'_
, Ty
>, offset
: &mut Size
)
20 let dl
= cx
.data_layout();
21 let size
= arg
.layout
.size
;
22 let align
= arg
.layout
.align
.max(dl
.i32_align
).min(dl
.i64_align
).abi
;
24 if arg
.layout
.is_aggregate() {
25 arg
.cast_to(Uniform { unit: Reg::i32(), total: size }
);
26 if !offset
.is_aligned(align
) {
27 arg
.pad_with(Reg
::i32());
30 arg
.extend_integer_width_to(32);
33 *offset
= offset
.align_to(align
) + size
.align_to(align
);
36 pub fn compute_abi_info
<Ty
, C
>(cx
: &C
, fn_abi
: &mut FnAbi
<'_
, Ty
>)
40 let mut offset
= Size
::ZERO
;
41 if !fn_abi
.ret
.is_ignore() {
42 classify_ret(cx
, &mut fn_abi
.ret
, &mut offset
);
45 for arg
in &mut fn_abi
.args
{
49 classify_arg(cx
, arg
, &mut offset
);