1 use crate::abi
::call
::{FnType, ArgType, Uniform}
;
2 use crate::abi
::{HasDataLayout, LayoutOf, TyLayout, TyLayoutMethods}
;
4 fn unwrap_trivial_aggregate
<'a
, Ty
, C
>(cx
: &C
, val
: &mut ArgType
<'a
, Ty
>) -> bool
5 where Ty
: TyLayoutMethods
<'a
, C
> + Copy
,
6 C
: LayoutOf
<Ty
= Ty
, TyLayout
= TyLayout
<'a
, Ty
>> + HasDataLayout
8 if val
.layout
.is_aggregate() {
9 if let Some(unit
) = val
.layout
.homogeneous_aggregate(cx
).unit() {
10 let size
= val
.layout
.size
;
11 if unit
.size
== size
{
24 fn classify_ret_ty
<'a
, Ty
, C
>(cx
: &C
, ret
: &mut ArgType
<'a
, Ty
>)
25 where Ty
: TyLayoutMethods
<'a
, C
> + Copy
,
26 C
: LayoutOf
<Ty
= Ty
, TyLayout
= TyLayout
<'a
, Ty
>> + HasDataLayout
28 ret
.extend_integer_width_to(32);
29 if ret
.layout
.is_aggregate() {
30 if !unwrap_trivial_aggregate(cx
, ret
) {
36 fn classify_arg_ty
<'a
, Ty
, C
>(cx
: &C
, arg
: &mut ArgType
<'a
, Ty
>)
37 where Ty
: TyLayoutMethods
<'a
, C
> + Copy
,
38 C
: LayoutOf
<Ty
= Ty
, TyLayout
= TyLayout
<'a
, Ty
>> + HasDataLayout
40 arg
.extend_integer_width_to(32);
41 if arg
.layout
.is_aggregate() {
42 if !unwrap_trivial_aggregate(cx
, arg
) {
43 arg
.make_indirect_byval();
48 pub fn compute_abi_info
<'a
, Ty
, C
>(cx
: &C
, fty
: &mut FnType
<'a
, Ty
>)
49 where Ty
: TyLayoutMethods
<'a
, C
> + Copy
,
50 C
: LayoutOf
<Ty
= Ty
, TyLayout
= TyLayout
<'a
, Ty
>> + HasDataLayout
52 if !fty
.ret
.is_ignore() {
53 classify_ret_ty(cx
, &mut fty
.ret
);
56 for arg
in &mut fty
.args
{
57 if arg
.is_ignore() { continue; }
58 classify_arg_ty(cx
, arg
);