]> git.proxmox.com Git - rustc.git/blame - src/librustc_target/abi/call/sparc.rs
New upstream version 1.41.1+dfsg1
[rustc.git] / src / librustc_target / abi / call / sparc.rs
CommitLineData
60c5eb7d 1use crate::abi::call::{ArgAbi, FnAbi, Reg, Uniform};
9fa01778 2use crate::abi::{HasDataLayout, LayoutOf, Size, TyLayoutMethods};
1a4d82fc 3
60c5eb7d 4fn classify_ret<'a, Ty, C>(cx: &C, ret: &mut ArgAbi<'_, 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
60c5eb7d 15fn classify_arg<'a, Ty, C>(cx: &C, arg: &mut ArgAbi<'_, 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
60c5eb7d 37pub fn compute_abi_info<'a, Ty, C>(cx: &C, fn_abi: &mut FnAbi<'_, Ty>)
83c7162d
XL
38 where Ty: TyLayoutMethods<'a, C>, C: LayoutOf<Ty = Ty> + HasDataLayout
39{
94b46f34 40 let mut offset = Size::ZERO;
60c5eb7d
XL
41 if !fn_abi.ret.is_ignore() {
42 classify_ret(cx, &mut fn_abi.ret, &mut offset);
54a0048b 43 }
1a4d82fc 44
60c5eb7d 45 for arg in &mut fn_abi.args {
54a0048b 46 if arg.is_ignore() { continue; }
60c5eb7d 47 classify_arg(cx, arg, &mut offset);
54a0048b 48 }
1a4d82fc 49}