1 use crate::abi::call::{ArgType, FnType, Reg, Uniform};
2 use crate::abi::{HasDataLayout, LayoutOf, Size, TyLayoutMethods};
4 fn classify_ret_ty<'a, Ty, C>(cx: &C, ret: &mut ArgType<'_, 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_ty<'a, Ty, C>(cx: &C, arg: &mut ArgType<'_, 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, fty: &mut FnType<'_, Ty>)
38 where Ty: TyLayoutMethods<'a, C>, C: LayoutOf<Ty = Ty> + HasDataLayout
40 let mut offset = Size::ZERO;
41 if !fty.ret.is_ignore() {
42 classify_ret_ty(cx, &mut fty.ret, &mut offset);
45 for arg in &mut fty.args {
46 if arg.is_ignore() { continue; }
47 classify_arg_ty(cx, arg, &mut offset);