]> git.proxmox.com Git - rustc.git/blob - compiler/rustc_target/src/abi/call/sparc.rs
0e5a7f37a094cdfde4b157d246819fa99a3bf1c6
[rustc.git] / compiler / rustc_target / src / abi / call / sparc.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 if !arg.layout.is_sized() {
21 // Not touching this...
22 return;
23 }
24 let dl = cx.data_layout();
25 let size = arg.layout.size;
26 let align = arg.layout.align.max(dl.i32_align).min(dl.i64_align).abi;
27
28 if arg.layout.is_aggregate() {
29 let pad_i32 = !offset.is_aligned(align);
30 arg.cast_to_and_pad_i32(Uniform::new(Reg::i32(), size), pad_i32);
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<Ty, C>(cx: &C, fn_abi: &mut FnAbi<'_, Ty>)
39 where
40 C: HasDataLayout,
41 {
42 let mut offset = Size::ZERO;
43 if !fn_abi.ret.is_ignore() {
44 classify_ret(cx, &mut fn_abi.ret, &mut offset);
45 }
46
47 for arg in fn_abi.args.iter_mut() {
48 if arg.is_ignore() {
49 continue;
50 }
51 classify_arg(cx, arg, &mut offset);
52 }
53 }