|
5 | 5 | // can be fixed to work with the correct ABI. See #63649 for further
|
6 | 6 | // discussion.
|
7 | 7 |
|
8 |
| -use crate::abi::call::{ArgAbi, FnAbi}; |
| 8 | +use rustc_data_structures::stable_set::FxHashSet; |
| 9 | +use rustc_span::Symbol; |
9 | 10 |
|
10 |
| -fn classify_ret<Ty>(ret: &mut ArgAbi<'_, Ty>) { |
| 11 | +use crate::abi::call::{ArgAbi, FnAbi, Uniform}; |
| 12 | +use crate::abi::{HasDataLayout, LayoutOf, TyAndLayout, TyAndLayoutMethods}; |
| 13 | + |
| 14 | +fn classify_ret<'a, Ty, C>(cx: &C, target_features: &FxHashSet<Symbol>, ret: &mut ArgAbi<'a, Ty>) |
| 15 | +where |
| 16 | + Ty: TyAndLayoutMethods<'a, C> + Copy, |
| 17 | + C: LayoutOf<Ty = Ty, TyAndLayout = TyAndLayout<'a, Ty>> + HasDataLayout, |
| 18 | +{ |
| 19 | + if ret.layout.is_aggregate() { |
| 20 | + if let Some(unit) = ret.layout.homogeneous_aggregate(cx).ok().and_then(|ha| ha.unit()) { |
| 21 | + let size = ret.layout.size; |
| 22 | + if unit.size == size || target_features.contains(&Symbol::intern("multivalue")) { |
| 23 | + ret.cast_to(Uniform { unit, total: size }); |
| 24 | + } |
| 25 | + } |
| 26 | + } |
11 | 27 | ret.extend_integer_width_to(32);
|
12 | 28 | }
|
13 | 29 |
|
14 |
| -fn classify_arg<Ty>(arg: &mut ArgAbi<'_, Ty>) { |
| 30 | +fn classify_arg<'a, Ty, C>(cx: &C, arg: &mut ArgAbi<'a, Ty>) |
| 31 | +where |
| 32 | + Ty: TyAndLayoutMethods<'a, C> + Copy, |
| 33 | + C: LayoutOf<Ty = Ty, TyAndLayout = TyAndLayout<'a, Ty>> + HasDataLayout, |
| 34 | +{ |
| 35 | + if arg.layout.is_aggregate() { |
| 36 | + if let Some(unit) = arg.layout.homogeneous_aggregate(cx).ok().and_then(|ha| ha.unit()) { |
| 37 | + let size = arg.layout.size; |
| 38 | + arg.cast_to(Uniform { unit, total: size }); |
| 39 | + } |
| 40 | + } |
15 | 41 | arg.extend_integer_width_to(32);
|
16 | 42 | }
|
17 | 43 |
|
18 |
| -pub fn compute_abi_info<Ty>(fn_abi: &mut FnAbi<'_, Ty>) { |
| 44 | +pub fn compute_abi_info<'a, Ty, C>( |
| 45 | + cx: &C, |
| 46 | + target_features: &FxHashSet<Symbol>, |
| 47 | + fn_abi: &mut FnAbi<'a, Ty>, |
| 48 | +) where |
| 49 | + Ty: TyAndLayoutMethods<'a, C> + Copy, |
| 50 | + C: LayoutOf<Ty = Ty, TyAndLayout = TyAndLayout<'a, Ty>> + HasDataLayout, |
| 51 | +{ |
19 | 52 | if !fn_abi.ret.is_ignore() {
|
20 |
| - classify_ret(&mut fn_abi.ret); |
| 53 | + classify_ret(cx, target_features, &mut fn_abi.ret); |
21 | 54 | }
|
22 | 55 |
|
23 | 56 | for arg in &mut fn_abi.args {
|
24 | 57 | if arg.is_ignore() {
|
25 | 58 | continue;
|
26 | 59 | }
|
27 |
| - classify_arg(arg); |
| 60 | + classify_arg(cx, arg); |
28 | 61 | }
|
29 | 62 | }
|
0 commit comments