1 use crate::abi
::call
::{ArgAbi, FnAbi, Reg, Uniform}
;
2 use crate::abi
::{HasDataLayout, LayoutOf, Size, TyLayoutMethods}
;
4 fn classify_ret
<'a
, Ty
, C
>(cx
: &C
, ret
: &mut ArgAbi
<'_
, Ty
>, offset
: &mut Size
)
5 where Ty
: TyLayoutMethods
<'a
, C
>, C
: LayoutOf
<Ty
= Ty
> + HasDataLayout
7 if !ret
.layout
.is_aggregate() {
8 ret
.extend_integer_width_to(32);
11 *offset
+= cx
.data_layout().pointer_size
;
15 fn classify_arg
<'a
, Ty
, C
>(cx
: &C
, arg
: &mut ArgAbi
<'_
, Ty
>, offset
: &mut Size
)
16 where Ty
: TyLayoutMethods
<'a
, C
>, C
: LayoutOf
<Ty
= Ty
> + HasDataLayout
18 let dl
= cx
.data_layout();
19 let size
= arg
.layout
.size
;
20 let align
= arg
.layout
.align
.max(dl
.i32_align
).min(dl
.i64_align
).abi
;
22 if arg
.layout
.is_aggregate() {
27 if !offset
.is_aligned(align
) {
28 arg
.pad_with(Reg
::i32());
31 arg
.extend_integer_width_to(32);
34 *offset
= offset
.align_to(align
) + size
.align_to(align
);
37 pub fn compute_abi_info
<'a
, Ty
, C
>(cx
: &C
, fn_abi
: &mut FnAbi
<'_
, Ty
>)
38 where Ty
: TyLayoutMethods
<'a
, C
>, C
: LayoutOf
<Ty
= Ty
> + HasDataLayout
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
{
46 if arg
.is_ignore() { continue; }
47 classify_arg(cx
, arg
, &mut offset
);