rustc_target/callconv/
x86_win32.rs1use rustc_abi::{Align, HasDataLayout, Reg, 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 t.abi_return_struct_as_int || opts.reg_struct_return {
29 match fn_abi.ret.layout.size.bytes() {
30 1 => fn_abi.ret.cast_to(Reg::i8()),
31 2 => fn_abi.ret.cast_to(Reg::i16()),
32 4 => fn_abi.ret.cast_to(Reg::i32()),
33 8 => fn_abi.ret.cast_to(Reg::i64()),
34 _ => fn_abi.ret.make_indirect(),
35 }
36 } else {
37 fn_abi.ret.make_indirect();
38 }
39 } else {
40 fn_abi.ret.extend_integer_width_to(32);
41 }
42 }
43
44 for arg in fn_abi.args.iter_mut() {
45 if arg.is_ignore() || !arg.layout.is_sized() {
46 continue;
47 }
48
49 if arg.layout.pass_indirectly_in_non_rustic_abis(cx) {
50 arg.make_indirect();
51 continue;
52 }
53
54 let align_4 = Align::from_bytes(4).unwrap();
58
59 if arg.layout.is_adt()
60 && let Some(max_repr_align) = arg.layout.max_repr_align
61 && max_repr_align > align_4
62 {
63 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!(
70 arg.layout.align.abi >= max_repr_align,
71 "abi alignment {:?} less than requested alignment {max_repr_align:?}",
72 arg.layout.align.abi,
73 );
74 arg.make_indirect();
75 } else if arg.layout.is_aggregate() {
76 let byval_align = align_4;
79 arg.pass_by_stack_offset(Some(byval_align));
80 } else {
81 arg.extend_integer_width_to(32);
82 }
83 }
84
85 super::x86::fill_inregs(cx, fn_abi, opts, false);
86}