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