rustc_target/callconv/
x86_win32.rs1use rustc_abi::{Align, Float, HasDataLayout, Primitive, Reg, RegKind, TyAbiInterface};
2
3use crate::callconv::FnAbi;
4use crate::spec::HasTargetSpec;
5
6pub(crate) fn compute_abi_info<'a, Ty, C>(
7 cx: &C,
8 fn_abi: &mut FnAbi<'a, Ty>,
9 opts: super::x86::X86Options,
10) where
11 Ty: TyAbiInterface<'a, C> + Copy,
12 C: HasDataLayout + HasTargetSpec,
13{
14 if !fn_abi.ret.is_ignore() {
15 if fn_abi.ret.layout.is_aggregate() && fn_abi.ret.layout.is_sized() {
16 let t = cx.target_spec();
24 if let Some(Float::F16) = fn_abi.ret.layout.complex_float(cx) {
29 let kind = RegKind::Vector { hint_vector_elem: Primitive::Float(Float::F16) };
31 fn_abi.ret.cast_to(Reg { kind, size: fn_abi.ret.layout.size });
32 } else if t.abi_return_struct_as_int || opts.reg_struct_return {
33 match fn_abi.ret.layout.size.bytes() {
34 1 => fn_abi.ret.cast_to(Reg::i8()),
35 2 => fn_abi.ret.cast_to(Reg::i16()),
36 4 => fn_abi.ret.cast_to(Reg::i32()),
37 8 => fn_abi.ret.cast_to(Reg::i64()),
38 _ => fn_abi.ret.make_indirect(),
39 }
40 } else {
41 fn_abi.ret.make_indirect();
42 }
43 } else {
44 fn_abi.ret.extend_integer_width_to(32);
45 }
46 }
47
48 for arg in fn_abi.args.iter_mut() {
49 if arg.is_ignore() || !arg.layout.is_sized() {
50 continue;
51 }
52
53 if arg.layout.pass_indirectly_in_non_rustic_abis(cx) {
54 arg.make_indirect();
55 continue;
56 }
57
58 let align_4 = Align::from_bytes(4).unwrap();
62
63 if arg.layout.is_adt()
64 && let Some(max_repr_align) = arg.layout.max_repr_align
65 && max_repr_align > align_4
66 {
67 if !(arg.layout.align.abi >= max_repr_align) {
{
::core::panicking::panic_fmt(format_args!("abi alignment {0:?} less than requested alignment {1:?}",
arg.layout.align.abi, max_repr_align));
}
};assert!(
74 arg.layout.align.abi >= max_repr_align,
75 "abi alignment {:?} less than requested alignment {max_repr_align:?}",
76 arg.layout.align.abi,
77 );
78 arg.make_indirect();
79 } else if arg.layout.is_aggregate() {
80 let byval_align = align_4;
83 arg.pass_by_stack_offset(Some(byval_align));
84 } else {
85 arg.extend_integer_width_to(32);
86 }
87 }
88
89 super::x86::fill_inregs(cx, fn_abi, opts, false);
90}