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 if !arg
.layout
.is_sized() {
21 // Not touching this...
24 let dl
= cx
.data_layout();
25 let size
= arg
.layout
.size
;
26 let align
= arg
.layout
.align
.max(dl
.i32_align
).min(dl
.i64_align
).abi
;
28 if arg
.layout
.is_aggregate() {
29 let pad_i32
= !offset
.is_aligned(align
);
30 arg
.cast_to_and_pad_i32(Uniform
::new(Reg
::i32(), size
), pad_i32
);
32 arg
.extend_integer_width_to(32);
35 *offset
= offset
.align_to(align
) + size
.align_to(align
);
38 pub fn compute_abi_info
<Ty
, C
>(cx
: &C
, fn_abi
: &mut FnAbi
<'_
, Ty
>)
42 let mut offset
= Size
::ZERO
;
43 if !fn_abi
.ret
.is_ignore() {
44 classify_ret(cx
, &mut fn_abi
.ret
, &mut offset
);
47 for arg
in fn_abi
.args
.iter_mut() {
51 classify_arg(cx
, arg
, &mut offset
);