1 use crate::abi
::call
::{ArgAbi, FnAbi, Uniform}
;
2 use crate::abi
::{HasDataLayout, LayoutOf, TyAndLayout, TyAndLayoutMethods}
;
4 fn unwrap_trivial_aggregate
<'a
, Ty
, C
>(cx
: &C
, val
: &mut ArgAbi
<'a
, Ty
>) -> bool
6 Ty
: TyAndLayoutMethods
<'a
, C
> + Copy
,
7 C
: LayoutOf
<Ty
= Ty
, TyAndLayout
= TyAndLayout
<'a
, Ty
>> + HasDataLayout
,
9 if val
.layout
.is_aggregate() {
10 if let Some(unit
) = val
.layout
.homogeneous_aggregate(cx
).ok().and_then(|ha
| ha
.unit()) {
11 let size
= val
.layout
.size
;
12 if unit
.size
== size
{
13 val
.cast_to(Uniform { unit, total: size }
);
21 fn classify_ret
<'a
, Ty
, C
>(cx
: &C
, ret
: &mut ArgAbi
<'a
, Ty
>)
23 Ty
: TyAndLayoutMethods
<'a
, C
> + Copy
,
24 C
: LayoutOf
<Ty
= Ty
, TyAndLayout
= TyAndLayout
<'a
, Ty
>> + HasDataLayout
,
26 ret
.extend_integer_width_to(32);
27 if ret
.layout
.is_aggregate() {
28 if !unwrap_trivial_aggregate(cx
, ret
) {
34 fn classify_arg
<'a
, Ty
, C
>(cx
: &C
, arg
: &mut ArgAbi
<'a
, Ty
>)
36 Ty
: TyAndLayoutMethods
<'a
, C
> + Copy
,
37 C
: LayoutOf
<Ty
= Ty
, TyAndLayout
= TyAndLayout
<'a
, Ty
>> + HasDataLayout
,
39 arg
.extend_integer_width_to(32);
40 if arg
.layout
.is_aggregate() {
41 if !unwrap_trivial_aggregate(cx
, arg
) {
42 arg
.make_indirect_byval();
47 pub fn compute_abi_info
<'a
, Ty
, C
>(cx
: &C
, fn_abi
: &mut FnAbi
<'a
, Ty
>)
49 Ty
: TyAndLayoutMethods
<'a
, C
> + Copy
,
50 C
: LayoutOf
<Ty
= Ty
, TyAndLayout
= TyAndLayout
<'a
, Ty
>> + HasDataLayout
,
52 if !fn_abi
.ret
.is_ignore() {
53 classify_ret(cx
, &mut fn_abi
.ret
);
56 for arg
in &mut fn_abi
.args
{
60 classify_arg(cx
, arg
);