]>
Commit | Line | Data |
---|---|---|
9fa01778 XL |
1 | use crate::abi::call::{ArgType, FnType, Reg, Uniform}; |
2 | use crate::abi::{HasDataLayout, LayoutOf, Size, TyLayoutMethods}; | |
1a4d82fc | 3 | |
9fa01778 | 4 | fn classify_ret_ty<'a, Ty, C>(cx: &C, ret: &mut ArgType<'_, Ty>, offset: &mut Size) |
83c7162d XL |
5 | where Ty: TyLayoutMethods<'a, C>, C: LayoutOf<Ty = Ty> + HasDataLayout |
6 | { | |
cc61c64b | 7 | if !ret.layout.is_aggregate() { |
54a0048b | 8 | ret.extend_integer_width_to(32); |
1a4d82fc | 9 | } else { |
ff7c6d11 | 10 | ret.make_indirect(); |
83c7162d | 11 | *offset += cx.data_layout().pointer_size; |
1a4d82fc JJ |
12 | } |
13 | } | |
14 | ||
9fa01778 | 15 | fn classify_arg_ty<'a, Ty, C>(cx: &C, arg: &mut ArgType<'_, Ty>, offset: &mut Size) |
83c7162d XL |
16 | where Ty: TyLayoutMethods<'a, C>, C: LayoutOf<Ty = Ty> + HasDataLayout |
17 | { | |
18 | let dl = cx.data_layout(); | |
ff7c6d11 | 19 | let size = arg.layout.size; |
a1dfa0c6 | 20 | let align = arg.layout.align.max(dl.i32_align).min(dl.i64_align).abi; |
1a4d82fc | 21 | |
cc61c64b | 22 | if arg.layout.is_aggregate() { |
ff7c6d11 | 23 | arg.cast_to(Uniform { |
cc61c64b XL |
24 | unit: Reg::i32(), |
25 | total: size | |
26 | }); | |
a1dfa0c6 | 27 | if !offset.is_aligned(align) { |
ff7c6d11 | 28 | arg.pad_with(Reg::i32()); |
cc61c64b | 29 | } |
1a4d82fc | 30 | } else { |
54a0048b | 31 | arg.extend_integer_width_to(32); |
1a4d82fc | 32 | } |
1a4d82fc | 33 | |
a1dfa0c6 | 34 | *offset = offset.align_to(align) + size.align_to(align); |
1a4d82fc JJ |
35 | } |
36 | ||
9fa01778 | 37 | pub fn compute_abi_info<'a, Ty, C>(cx: &C, fty: &mut FnType<'_, Ty>) |
83c7162d XL |
38 | where Ty: TyLayoutMethods<'a, C>, C: LayoutOf<Ty = Ty> + HasDataLayout |
39 | { | |
94b46f34 | 40 | let mut offset = Size::ZERO; |
54a0048b | 41 | if !fty.ret.is_ignore() { |
2c00a5a8 | 42 | classify_ret_ty(cx, &mut fty.ret, &mut offset); |
54a0048b | 43 | } |
1a4d82fc | 44 | |
54a0048b SL |
45 | for arg in &mut fty.args { |
46 | if arg.is_ignore() { continue; } | |
2c00a5a8 | 47 | classify_arg_ty(cx, arg, &mut offset); |
54a0048b | 48 | } |
1a4d82fc | 49 | } |