]> git.lizzy.rs Git - rust.git/blob - src/librustc_target/abi/call/mips.rs
Auto merge of #68414 - michaelwoerister:share-drop-glue, r=alexcrichton
[rust.git] / src / librustc_target / abi / call / mips.rs
1 use crate::abi::call::{ArgAbi, FnAbi, Reg, Uniform};
2 use crate::abi::{HasDataLayout, LayoutOf, Size, TyLayoutMethods};
3
4 fn classify_ret<'a, Ty, C>(cx: &C, ret: &mut ArgAbi<'_, Ty>, offset: &mut Size)
5 where
6     Ty: TyLayoutMethods<'a, C>,
7     C: LayoutOf<Ty = Ty> + HasDataLayout,
8 {
9     if !ret.layout.is_aggregate() {
10         ret.extend_integer_width_to(32);
11     } else {
12         ret.make_indirect();
13         *offset += cx.data_layout().pointer_size;
14     }
15 }
16
17 fn classify_arg<'a, Ty, C>(cx: &C, arg: &mut ArgAbi<'_, Ty>, offset: &mut Size)
18 where
19     Ty: TyLayoutMethods<'a, C>,
20     C: LayoutOf<Ty = Ty> + HasDataLayout,
21 {
22     let dl = cx.data_layout();
23     let size = arg.layout.size;
24     let align = arg.layout.align.max(dl.i32_align).min(dl.i64_align).abi;
25
26     if arg.layout.is_aggregate() {
27         arg.cast_to(Uniform { unit: Reg::i32(), total: size });
28         if !offset.is_aligned(align) {
29             arg.pad_with(Reg::i32());
30         }
31     } else {
32         arg.extend_integer_width_to(32);
33     }
34
35     *offset = offset.align_to(align) + size.align_to(align);
36 }
37
38 pub fn compute_abi_info<'a, Ty, C>(cx: &C, fn_abi: &mut FnAbi<'_, Ty>)
39 where
40     Ty: TyLayoutMethods<'a, C>,
41     C: LayoutOf<Ty = Ty> + HasDataLayout,
42 {
43     let mut offset = Size::ZERO;
44     if !fn_abi.ret.is_ignore() {
45         classify_ret(cx, &mut fn_abi.ret, &mut offset);
46     }
47
48     for arg in &mut fn_abi.args {
49         if arg.is_ignore() {
50             continue;
51         }
52         classify_arg(cx, arg, &mut offset);
53     }
54 }