]>
Commit | Line | Data |
---|---|---|
60c5eb7d | 1 | use crate::abi::call::{ArgAbi, FnAbi, Reg, Uniform}; |
94222f64 | 2 | use crate::abi::{HasDataLayout, Size}; |
1a4d82fc | 3 | |
94222f64 | 4 | fn classify_ret<Ty, C>(cx: &C, ret: &mut ArgAbi<'_, Ty>, offset: &mut Size) |
dfeec247 | 5 | where |
94222f64 | 6 | C: HasDataLayout, |
83c7162d | 7 | { |
cc61c64b | 8 | if !ret.layout.is_aggregate() { |
54a0048b | 9 | ret.extend_integer_width_to(32); |
1a4d82fc | 10 | } else { |
ff7c6d11 | 11 | ret.make_indirect(); |
83c7162d | 12 | *offset += cx.data_layout().pointer_size; |
1a4d82fc JJ |
13 | } |
14 | } | |
15 | ||
94222f64 | 16 | fn classify_arg<Ty, C>(cx: &C, arg: &mut ArgAbi<'_, Ty>, offset: &mut Size) |
dfeec247 | 17 | where |
94222f64 | 18 | C: HasDataLayout, |
83c7162d | 19 | { |
4b012472 FG |
20 | if !arg.layout.is_sized() { |
21 | // Not touching this... | |
22 | return; | |
23 | } | |
83c7162d | 24 | let dl = cx.data_layout(); |
ff7c6d11 | 25 | let size = arg.layout.size; |
a1dfa0c6 | 26 | let align = arg.layout.align.max(dl.i32_align).min(dl.i64_align).abi; |
1a4d82fc | 27 | |
cc61c64b | 28 | if arg.layout.is_aggregate() { |
f2b60f7d | 29 | let pad_i32 = !offset.is_aligned(align); |
e8be2606 | 30 | arg.cast_to_and_pad_i32(Uniform::new(Reg::i32(), size), pad_i32); |
1a4d82fc | 31 | } else { |
54a0048b | 32 | arg.extend_integer_width_to(32); |
1a4d82fc | 33 | } |
1a4d82fc | 34 | |
a1dfa0c6 | 35 | *offset = offset.align_to(align) + size.align_to(align); |
1a4d82fc JJ |
36 | } |
37 | ||
94222f64 | 38 | pub fn compute_abi_info<Ty, C>(cx: &C, fn_abi: &mut FnAbi<'_, Ty>) |
dfeec247 | 39 | where |
94222f64 | 40 | C: HasDataLayout, |
83c7162d | 41 | { |
94b46f34 | 42 | let mut offset = Size::ZERO; |
60c5eb7d XL |
43 | if !fn_abi.ret.is_ignore() { |
44 | classify_ret(cx, &mut fn_abi.ret, &mut offset); | |
54a0048b | 45 | } |
1a4d82fc | 46 | |
f2b60f7d | 47 | for arg in fn_abi.args.iter_mut() { |
dfeec247 XL |
48 | if arg.is_ignore() { |
49 | continue; | |
50 | } | |
60c5eb7d | 51 | classify_arg(cx, arg, &mut offset); |
54a0048b | 52 | } |
1a4d82fc | 53 | } |