Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit e18682e

Browse files
committedOct 14, 2024·
Support s390x z13 vector ABI
1 parent ac69dae commit e18682e

14 files changed

+704
-34
lines changed
 

‎compiler/rustc_monomorphize/src/collector/abi_check.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ use rustc_abi::Abi;
22
use rustc_middle::ty::{self, Instance, InstanceKind, ParamEnv, Ty, TyCtxt};
33
use rustc_span::def_id::DefId;
44
use rustc_span::{Span, Symbol};
5-
use rustc_target::abi::call::{FnAbi, PassMode};
5+
use rustc_target::abi::call::{FnAbi, PassMode, RegKind};
66

77
use crate::errors::{AbiErrorDisabledVectorTypeCall, AbiErrorDisabledVectorTypeDef};
88

99
// Represents the least-constraining feature that is required for vector types up to a certain size
1010
// to have their "proper" ABI.
1111
const X86_VECTOR_FEATURES: &'static [(u64, &'static str)] =
1212
&[(128, "sse"), (256, "avx"), (512, "avx512f")];
13+
const S390X_VECTOR_FEATURES: &'static [(u64, &'static str)] = &[(128, "vector")];
1314

1415
fn do_check_abi<'tcx>(
1516
tcx: TyCtxt<'tcx>,
@@ -22,6 +23,8 @@ fn do_check_abi<'tcx>(
2223
} else if tcx.sess.target.arch == "aarch64" {
2324
// ABI on aarch64 does not depend on target features.
2425
return;
26+
} else if tcx.sess.target.arch == "s390x" {
27+
S390X_VECTOR_FEATURES
2528
} else {
2629
// FIXME: add support for non-tier1 architectures
2730
return;
@@ -31,6 +34,7 @@ fn do_check_abi<'tcx>(
3134
let size = arg_abi.layout.size;
3235
if matches!(arg_abi.layout.abi, Abi::Vector { .. })
3336
&& !matches!(arg_abi.mode, PassMode::Indirect { .. })
37+
|| matches!(&arg_abi.mode, PassMode::Cast { cast, .. } if cast.rest.unit.kind == RegKind::Vector)
3438
{
3539
let feature = match feature_def.iter().find(|(bits, _)| size.bits() <= *bits) {
3640
Some((_, feature)) => feature,
@@ -48,7 +52,7 @@ fn do_check_abi<'tcx>(
4852

4953
/// Checks that the ABI of a given instance of a function does not contain vector-passed arguments
5054
/// or return values for which the corresponding target feature is not enabled.
51-
pub fn check_instance_abi<'tcx>(tcx: TyCtxt<'tcx>, instance: Instance<'tcx>) {
55+
pub(crate) fn check_instance_abi<'tcx>(tcx: TyCtxt<'tcx>, instance: Instance<'tcx>) {
5256
let param_env = ParamEnv::reveal_all();
5357
let Ok(abi) = tcx.fn_abi_of_instance(param_env.and((instance, ty::List::empty()))) else {
5458
// An error will be reported during codegen if we cannot determine the ABI of this
@@ -65,7 +69,7 @@ pub fn check_instance_abi<'tcx>(tcx: TyCtxt<'tcx>, instance: Instance<'tcx>) {
6569

6670
/// Checks that a call expression does not try to pass a vector-passed argument which requires a
6771
/// target feature that the caller does not have, as doing so causes UB because of ABI mismatch.
68-
pub fn check_call_site_abi<'tcx>(
72+
pub(crate) fn check_call_site_abi<'tcx>(
6973
tcx: TyCtxt<'tcx>,
7074
ty: Ty<'tcx>,
7175
span: Span,

‎compiler/rustc_monomorphize/src/errors.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ pub(crate) struct UnknownCguCollectionMode<'a> {
9696
#[derive(Diagnostic)]
9797
#[diag(monomorphize_abi_error_disabled_vector_type_def)]
9898
#[help]
99-
pub struct AbiErrorDisabledVectorTypeDef<'a> {
99+
pub(crate) struct AbiErrorDisabledVectorTypeDef<'a> {
100100
#[primary_span]
101101
pub span: Span,
102102
pub required_feature: &'a str,
@@ -105,7 +105,7 @@ pub struct AbiErrorDisabledVectorTypeDef<'a> {
105105
#[derive(Diagnostic)]
106106
#[diag(monomorphize_abi_error_disabled_vector_type_call)]
107107
#[help]
108-
pub struct AbiErrorDisabledVectorTypeCall<'a> {
108+
pub(crate) struct AbiErrorDisabledVectorTypeCall<'a> {
109109
#[primary_span]
110110
pub span: Span,
111111
pub required_feature: &'a str,

‎compiler/rustc_target/src/abi/call/s390x.rs

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,35 @@
1-
// FIXME: The assumes we're using the non-vector ABI, i.e., compiling
2-
// for a pre-z13 machine or using -mno-vx.
3-
4-
use crate::abi::call::{ArgAbi, FnAbi, Reg};
5-
use crate::abi::{HasDataLayout, TyAbiInterface};
1+
use crate::abi::call::{ArgAbi, FnAbi, Reg, RegKind};
2+
use crate::abi::{Abi, HasDataLayout, Size, TyAbiInterface, TyAndLayout};
63
use crate::spec::HasTargetSpec;
74

5+
fn contains_vector<'a, Ty, C>(cx: &C, layout: TyAndLayout<'a, Ty>, expected_size: Size) -> bool
6+
where
7+
Ty: TyAbiInterface<'a, C> + Copy,
8+
{
9+
match layout.abi {
10+
Abi::Uninhabited | Abi::Scalar(_) | Abi::ScalarPair(..) => false,
11+
Abi::Vector { .. } => layout.size == expected_size,
12+
Abi::Aggregate { .. } => {
13+
for i in 0..layout.fields.count() {
14+
if contains_vector(cx, layout.field(cx, i), expected_size) {
15+
return true;
16+
}
17+
}
18+
false
19+
}
20+
}
21+
}
22+
823
fn classify_ret<Ty>(ret: &mut ArgAbi<'_, Ty>) {
9-
if !ret.layout.is_aggregate() && ret.layout.size.bits() <= 64 {
24+
let size = ret.layout.size;
25+
if size.bits() <= 128 && matches!(ret.layout.abi, Abi::Vector { .. }) {
26+
return;
27+
}
28+
if !ret.layout.is_aggregate() && size.bits() <= 64 {
1029
ret.extend_integer_width_to(64);
11-
} else {
12-
ret.make_indirect();
30+
return;
1331
}
32+
ret.make_indirect();
1433
}
1534

1635
fn classify_arg<'a, Ty, C>(cx: &C, arg: &mut ArgAbi<'a, Ty>)
@@ -32,19 +51,25 @@ where
3251
}
3352
return;
3453
}
35-
if !arg.layout.is_aggregate() && arg.layout.size.bits() <= 64 {
54+
55+
let size = arg.layout.size;
56+
if size.bits() <= 128 && contains_vector(cx, arg.layout, size) {
57+
arg.cast_to(Reg { kind: RegKind::Vector, size });
58+
return;
59+
}
60+
if !arg.layout.is_aggregate() && size.bits() <= 64 {
3661
arg.extend_integer_width_to(64);
3762
return;
3863
}
3964

4065
if arg.layout.is_single_fp_element(cx) {
41-
match arg.layout.size.bytes() {
66+
match size.bytes() {
4267
4 => arg.cast_to(Reg::f32()),
4368
8 => arg.cast_to(Reg::f64()),
4469
_ => arg.make_indirect(),
4570
}
4671
} else {
47-
match arg.layout.size.bytes() {
72+
match size.bytes() {
4873
1 => arg.cast_to(Reg::i8()),
4974
2 => arg.cast_to(Reg::i16()),
5075
4 => arg.cast_to(Reg::i32()),

‎compiler/rustc_target/src/spec/targets/s390x_unknown_linux_gnu.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@ pub(crate) fn target() -> Target {
66
base.endian = Endian::Big;
77
// z10 is the oldest CPU supported by LLVM
88
base.cpu = "z10".into();
9-
// FIXME: The ABI implementation in abi/call/s390x.rs is for now hard-coded to assume the no-vector
10-
// ABI. Pass the -vector feature string to LLVM to respect this assumption.
11-
base.features = "-vector".into();
129
base.max_atomic_width = Some(128);
1310
base.min_global_align = Some(16);
1411
base.stack_probes = StackProbeType::Inline;

‎compiler/rustc_target/src/spec/targets/s390x_unknown_linux_musl.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@ pub(crate) fn target() -> Target {
66
base.endian = Endian::Big;
77
// z10 is the oldest CPU supported by LLVM
88
base.cpu = "z10".into();
9-
// FIXME: The ABI implementation in abi/call/s390x.rs is for now hard-coded to assume the no-vector
10-
// ABI. Pass the -vector feature string to LLVM to respect this assumption.
11-
base.features = "-vector".into();
129
base.max_atomic_width = Some(128);
1310
base.min_global_align = Some(16);
1411
base.static_position_independent_executables = true;

‎tests/assembly/s390x-vector-abi.rs

Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
//@ revisions: z10 z10_vector z13 z13_no_vector
2+
// ignore-tidy-linelength
3+
//@ assembly-output: emit-asm
4+
//@ compile-flags: -O -Z merge-functions=disabled
5+
//@[z10] compile-flags: --target s390x-unknown-linux-gnu --cfg no_vector
6+
//@[z10] needs-llvm-components: systemz
7+
//@[z10_vector] compile-flags: --target s390x-unknown-linux-gnu -C target-feature=+vector
8+
//@[z10_vector] needs-llvm-components: systemz
9+
//@[z13] compile-flags: --target s390x-unknown-linux-gnu -C target-cpu=z13
10+
//@[z13] needs-llvm-components: systemz
11+
//@[z13_no_vector] compile-flags: --target s390x-unknown-linux-gnu -C target-cpu=z13 -C target-feature=-vector --cfg no_vector
12+
//@[z13_no_vector] needs-llvm-components: systemz
13+
14+
#![feature(no_core, lang_items, repr_simd, s390x_target_feature)]
15+
#![no_core]
16+
#![crate_type = "lib"]
17+
#![allow(non_camel_case_types)]
18+
19+
// Cases where vector feature is disabled are rejected.
20+
// See tests/ui/simd-abi-checks-s390x.rs for test for them.
21+
22+
#[lang = "sized"]
23+
pub trait Sized {}
24+
#[lang = "copy"]
25+
pub trait Copy {}
26+
#[lang = "freeze"]
27+
pub trait Freeze {}
28+
29+
impl<T: Copy, const N: usize> Copy for [T; N] {}
30+
31+
#[repr(simd)]
32+
pub struct i8x8([i8; 8]);
33+
#[repr(simd)]
34+
pub struct i8x16([i8; 16]);
35+
#[repr(simd)]
36+
pub struct i8x32([i8; 32]);
37+
#[repr(C)]
38+
pub struct Wrapper<T>(T);
39+
#[repr(transparent)]
40+
pub struct TransparentWrapper<T>(T);
41+
42+
impl Copy for i8 {}
43+
impl Copy for i64 {}
44+
impl Copy for i8x8 {}
45+
impl Copy for i8x16 {}
46+
impl Copy for i8x32 {}
47+
impl<T: Copy> Copy for Wrapper<T> {}
48+
impl<T: Copy> Copy for TransparentWrapper<T> {}
49+
50+
// CHECK-LABEL: vector_ret_small:
51+
// CHECK: vlrepg %v24, 0(%r2)
52+
// CHECK-NEXT: br %r14
53+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
54+
#[no_mangle]
55+
unsafe extern "C" fn vector_ret_small(x: &i8x8) -> i8x8 {
56+
*x
57+
}
58+
// CHECK-LABEL: vector_ret:
59+
// CHECK: vl %v24, 0(%r2), 3
60+
// CHECK-NEXT: br %r14
61+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
62+
#[no_mangle]
63+
unsafe extern "C" fn vector_ret(x: &i8x16) -> i8x16 {
64+
*x
65+
}
66+
// CHECK-LABEL: vector_ret_large:
67+
// z10: vl %v0, 16(%r3), 4
68+
// z10-NEXT: vl %v1, 0(%r3), 4
69+
// z10-NEXT: vst %v0, 16(%r2), 4
70+
// z10-NEXT: vst %v1, 0(%r2), 4
71+
// z10-NEXT: br %r14
72+
// z13: vl %v0, 0(%r3), 4
73+
// z13-NEXT: vl %v1, 16(%r3), 4
74+
// z13-NEXT: vst %v1, 16(%r2), 4
75+
// z13-NEXT: vst %v0, 0(%r2), 4
76+
// z13-NEXT: br %r14
77+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
78+
#[no_mangle]
79+
unsafe extern "C" fn vector_ret_large(x: &i8x32) -> i8x32 {
80+
*x
81+
}
82+
83+
// CHECK-LABEL: vector_wrapper_ret_small:
84+
// CHECK: mvc 0(8,%r2), 0(%r3)
85+
// CHECK-NEXT: br %r14
86+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
87+
#[no_mangle]
88+
unsafe extern "C" fn vector_wrapper_ret_small(x: &Wrapper<i8x8>) -> Wrapper<i8x8> {
89+
*x
90+
}
91+
// CHECK-LABEL: vector_wrapper_ret:
92+
// CHECK: mvc 0(16,%r2), 0(%r3)
93+
// CHECK-NEXT: br %r14
94+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
95+
#[no_mangle]
96+
unsafe extern "C" fn vector_wrapper_ret(x: &Wrapper<i8x16>) -> Wrapper<i8x16> {
97+
*x
98+
}
99+
// CHECK-LABEL: vector_wrapper_ret_large:
100+
// z10: vl %v0, 16(%r3), 4
101+
// z10-NEXT: vl %v1, 0(%r3), 4
102+
// z10-NEXT: vst %v0, 16(%r2), 4
103+
// z10-NEXT: vst %v1, 0(%r2), 4
104+
// z10-NEXT: br %r14
105+
// z13: vl %v0, 16(%r3), 4
106+
// z13-NEXT: vst %v0, 16(%r2), 4
107+
// z13-NEXT: vl %v0, 0(%r3), 4
108+
// z13-NEXT: vst %v0, 0(%r2), 4
109+
// z13-NEXT: br %r14
110+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
111+
#[no_mangle]
112+
unsafe extern "C" fn vector_wrapper_ret_large(x: &Wrapper<i8x32>) -> Wrapper<i8x32> {
113+
*x
114+
}
115+
116+
// CHECK-LABEL: vector_transparent_wrapper_ret_small:
117+
// CHECK: vlrepg %v24, 0(%r2)
118+
// CHECK-NEXT: br %r14
119+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
120+
#[no_mangle]
121+
unsafe extern "C" fn vector_transparent_wrapper_ret_small(
122+
x: &TransparentWrapper<i8x8>,
123+
) -> TransparentWrapper<i8x8> {
124+
*x
125+
}
126+
// CHECK-LABEL: vector_transparent_wrapper_ret:
127+
// CHECK: vl %v24, 0(%r2), 3
128+
// CHECK-NEXT: br %r14
129+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
130+
#[no_mangle]
131+
unsafe extern "C" fn vector_transparent_wrapper_ret(
132+
x: &TransparentWrapper<i8x16>,
133+
) -> TransparentWrapper<i8x16> {
134+
*x
135+
}
136+
// CHECK-LABEL: vector_transparent_wrapper_ret_large:
137+
// z10: vl %v0, 16(%r3), 4
138+
// z10-NEXT: vl %v1, 0(%r3), 4
139+
// z10-NEXT: vst %v0, 16(%r2), 4
140+
// z10-NEXT: vst %v1, 0(%r2), 4
141+
// z10-NEXT: br %r14
142+
// z13: vl %v0, 0(%r3), 4
143+
// z13-NEXT: vl %v1, 16(%r3), 4
144+
// z13-NEXT: vst %v1, 16(%r2), 4
145+
// z13-NEXT: vst %v0, 0(%r2), 4
146+
// z13-NEXT: br %r14
147+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
148+
#[no_mangle]
149+
unsafe extern "C" fn vector_transparent_wrapper_ret_large(
150+
x: &TransparentWrapper<i8x32>,
151+
) -> TransparentWrapper<i8x32> {
152+
*x
153+
}
154+
155+
// CHECK-LABEL: vector_arg_small:
156+
// CHECK: vlgvg %r2, %v24, 0
157+
// CHECK-NEXT: br %r14
158+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
159+
#[no_mangle]
160+
unsafe extern "C" fn vector_arg_small(x: i8x8) -> i64 {
161+
unsafe { *(&x as *const i8x8 as *const i64) }
162+
}
163+
// CHECK-LABEL: vector_arg:
164+
// CHECK: vlgvg %r2, %v24, 0
165+
// CHECK-NEXT: br %r14
166+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
167+
#[no_mangle]
168+
unsafe extern "C" fn vector_arg(x: i8x16) -> i64 {
169+
unsafe { *(&x as *const i8x16 as *const i64) }
170+
}
171+
// CHECK-LABEL: vector_arg_large:
172+
// CHECK: lg %r2, 0(%r2)
173+
// CHECK-NEXT: br %r14
174+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
175+
#[no_mangle]
176+
unsafe extern "C" fn vector_arg_large(x: i8x32) -> i64 {
177+
unsafe { *(&x as *const i8x32 as *const i64) }
178+
}
179+
180+
// CHECK-LABEL: vector_wrapper_arg_small:
181+
// CHECK: vlgvg %r2, %v24, 0
182+
// CHECK-NEXT: br %r14
183+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
184+
#[no_mangle]
185+
unsafe extern "C" fn vector_wrapper_arg_small(x: Wrapper<i8x8>) -> i64 {
186+
unsafe { *(&x as *const Wrapper<i8x8> as *const i64) }
187+
}
188+
// CHECK-LABEL: vector_wrapper_arg:
189+
// CHECK: vlgvg %r2, %v24, 0
190+
// CHECK-NEXT: br %r14
191+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
192+
#[no_mangle]
193+
unsafe extern "C" fn vector_wrapper_arg(x: Wrapper<i8x16>) -> i64 {
194+
unsafe { *(&x as *const Wrapper<i8x16> as *const i64) }
195+
}
196+
// CHECK-LABEL: vector_wrapper_arg_large:
197+
// CHECK: lg %r2, 0(%r2)
198+
// CHECK-NEXT: br %r14
199+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
200+
#[no_mangle]
201+
unsafe extern "C" fn vector_wrapper_arg_large(x: Wrapper<i8x32>) -> i64 {
202+
unsafe { *(&x as *const Wrapper<i8x32> as *const i64) }
203+
}
204+
205+
// CHECK-LABEL: vector_transparent_wrapper_arg_small:
206+
// CHECK: vlgvg %r2, %v24, 0
207+
// CHECK-NEXT: br %r14
208+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
209+
#[no_mangle]
210+
unsafe extern "C" fn vector_transparent_wrapper_arg_small(x: TransparentWrapper<i8x8>) -> i64 {
211+
unsafe { *(&x as *const TransparentWrapper<i8x8> as *const i64) }
212+
}
213+
// CHECK-LABEL: vector_transparent_wrapper_arg:
214+
// CHECK: vlgvg %r2, %v24, 0
215+
// CHECK-NEXT: br %r14
216+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
217+
#[no_mangle]
218+
unsafe extern "C" fn vector_transparent_wrapper_arg(x: TransparentWrapper<i8x16>) -> i64 {
219+
unsafe { *(&x as *const TransparentWrapper<i8x16> as *const i64) }
220+
}
221+
// CHECK-LABEL: vector_transparent_wrapper_arg_large:
222+
// CHECK: lg %r2, 0(%r2)
223+
// CHECK-NEXT: br %r14
224+
#[cfg_attr(no_vector, target_feature(enable = "vector"))]
225+
#[no_mangle]
226+
unsafe extern "C" fn vector_transparent_wrapper_arg_large(x: TransparentWrapper<i8x32>) -> i64 {
227+
unsafe { *(&x as *const TransparentWrapper<i8x32> as *const i64) }
228+
}

‎tests/ui/layout/post-mono-layout-cycle-2.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ where
4545
T: Blah,
4646
{
4747
async fn ice(&mut self) {
48-
//~^ ERROR a cycle occurred during layout computation
4948
let arr: [(); 0] = [];
5049
self.t.iter(arr.into_iter()).await;
5150
}

‎tests/ui/layout/post-mono-layout-cycle-2.stderr

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ LL | Blah::iter(self, iterator).await
1212
|
1313
= note: a recursive `async fn` call must introduce indirection such as `Box::pin` to avoid an infinitely sized future
1414

15-
error: a cycle occurred during layout computation
16-
--> $DIR/post-mono-layout-cycle-2.rs:47:5
15+
note: the above error was encountered while instantiating `fn main::{closure#0}`
16+
--> $DIR/post-mono-layout-cycle-2.rs:16:15
1717
|
18-
LL | async fn ice(&mut self) {
19-
| ^^^^^^^^^^^^^^^^^^^^^^^
18+
LL | match fut.as_mut().poll(ctx) {
19+
| ^^^^^^^^^^^^^^^^^^^^^^
2020

21-
error: aborting due to 2 previous errors
21+
error: aborting due to 1 previous error
2222

2323
For more information about this error, try `rustc --explain E0733`.

‎tests/ui/layout/post-mono-layout-cycle.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ struct Wrapper<T: Trait> {
1414
}
1515

1616
fn abi<T: Trait>(_: Option<Wrapper<T>>) {}
17-
//~^ ERROR a cycle occurred during layout computation
1817

1918
fn indirect<T: Trait>() {
2019
abi::<T>(None);

‎tests/ui/layout/post-mono-layout-cycle.stderr

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ error[E0391]: cycle detected when computing layout of `Wrapper<()>`
55
= note: cycle used when computing layout of `core::option::Option<Wrapper<()>>`
66
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
77

8-
error: a cycle occurred during layout computation
9-
--> $DIR/post-mono-layout-cycle.rs:16:1
8+
note: the above error was encountered while instantiating `fn indirect::<()>`
9+
--> $DIR/post-mono-layout-cycle.rs:23:5
1010
|
11-
LL | fn abi<T: Trait>(_: Option<Wrapper<T>>) {}
12-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
11+
LL | indirect::<()>();
12+
| ^^^^^^^^^^^^^^^^
1313

14-
error: aborting due to 2 previous errors
14+
error: aborting due to 1 previous error
1515

1616
For more information about this error, try `rustc --explain E0391`.

‎tests/ui/simd-abi-checks-s390x.rs

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
//@ revisions: z10 z13_no_vector z13_soft_float
2+
//@ build-fail
3+
//@[z10] compile-flags: --target s390x-unknown-linux-gnu
4+
//@[z10] needs-llvm-components: systemz
5+
//@[z13_no_vector] compile-flags: --target s390x-unknown-linux-gnu -C target-cpu=z13 -C target-feature=-vector
6+
//@[z13_no_vector] needs-llvm-components: systemz
7+
// FIXME: +soft-float itself doesn't set -vector
8+
//@[z13_soft_float] compile-flags: --target s390x-unknown-linux-gnu -C target-cpu=z13 -C target-feature=-vector,+soft-float
9+
//@[z13_soft_float] needs-llvm-components: systemz
10+
11+
#![feature(no_core, lang_items, repr_simd, s390x_target_feature)]
12+
#![no_core]
13+
#![crate_type = "lib"]
14+
#![allow(non_camel_case_types, improper_ctypes_definitions)]
15+
16+
#[lang = "sized"]
17+
pub trait Sized {}
18+
#[lang = "copy"]
19+
pub trait Copy {}
20+
#[lang = "freeze"]
21+
pub trait Freeze {}
22+
23+
impl<T: Copy, const N: usize> Copy for [T; N] {}
24+
25+
#[repr(simd)]
26+
pub struct i8x8([i8; 8]);
27+
#[repr(simd)]
28+
pub struct i8x16([i8; 16]);
29+
#[repr(simd)]
30+
pub struct i8x32([i8; 32]);
31+
#[repr(C)]
32+
pub struct Wrapper<T>(T);
33+
#[repr(transparent)]
34+
pub struct TransparentWrapper<T>(T);
35+
36+
impl Copy for i8 {}
37+
impl Copy for i64 {}
38+
impl Copy for i8x8 {}
39+
impl Copy for i8x16 {}
40+
impl Copy for i8x32 {}
41+
impl<T: Copy> Copy for Wrapper<T> {}
42+
impl<T: Copy> Copy for TransparentWrapper<T> {}
43+
44+
#[no_mangle]
45+
extern "C" fn vector_ret_small(x: &i8x8) -> i8x8 {
46+
//~^ ABI error: this function definition uses a vector vector type, which is not enabled
47+
*x
48+
}
49+
#[no_mangle]
50+
extern "C" fn vector_ret(x: &i8x16) -> i8x16 {
51+
//~^ ABI error: this function definition uses a vector vector type, which is not enabled
52+
*x
53+
}
54+
#[no_mangle]
55+
extern "C" fn vector_ret_large(x: &i8x32) -> i8x32 {
56+
// Ok
57+
*x
58+
}
59+
60+
#[no_mangle]
61+
#[target_feature(enable = "vector")]
62+
unsafe extern "C" fn vector_ret_target_feature_small(x: &i8x8) -> i8x8 {
63+
// Ok
64+
*x
65+
}
66+
#[no_mangle]
67+
#[target_feature(enable = "vector")]
68+
unsafe extern "C" fn vector_target_feature_ret(x: &i8x16) -> i8x16 {
69+
// Ok
70+
*x
71+
}
72+
#[no_mangle]
73+
#[target_feature(enable = "vector")]
74+
unsafe extern "C" fn vector_ret_target_feature_large(x: &i8x32) -> i8x32 {
75+
// Ok
76+
*x
77+
}
78+
79+
#[no_mangle]
80+
extern "C" fn vector_wrapper_ret_small(x: &Wrapper<i8x8>) -> Wrapper<i8x8> {
81+
// Ok
82+
*x
83+
}
84+
#[no_mangle]
85+
extern "C" fn vector_wrapper_ret(x: &Wrapper<i8x16>) -> Wrapper<i8x16> {
86+
// Ok
87+
*x
88+
}
89+
#[no_mangle]
90+
extern "C" fn vector_wrapper_ret_large(x: &Wrapper<i8x32>) -> Wrapper<i8x32> {
91+
// Ok
92+
*x
93+
}
94+
95+
#[no_mangle]
96+
extern "C" fn vector_transparent_wrapper_ret_small(
97+
x: &TransparentWrapper<i8x8>,
98+
) -> TransparentWrapper<i8x8> {
99+
//~^^^ ABI error: this function definition uses a vector vector type, which is not enabled
100+
*x
101+
}
102+
#[no_mangle]
103+
extern "C" fn vector_transparent_wrapper_ret(
104+
x: &TransparentWrapper<i8x16>,
105+
) -> TransparentWrapper<i8x16> {
106+
//~^^^ ABI error: this function definition uses a vector vector type, which is not enabled
107+
*x
108+
}
109+
#[no_mangle]
110+
extern "C" fn vector_transparent_wrapper_ret_large(
111+
x: &TransparentWrapper<i8x32>,
112+
) -> TransparentWrapper<i8x32> {
113+
// Ok
114+
*x
115+
}
116+
117+
#[no_mangle]
118+
extern "C" fn vector_arg_small(x: i8x8) -> i64 {
119+
//~^ ABI error: this function definition uses a vector vector type, which is not enabled
120+
unsafe { *(&x as *const i8x8 as *const i64) }
121+
}
122+
#[no_mangle]
123+
extern "C" fn vector_arg(x: i8x16) -> i64 {
124+
//~^ ABI error: this function definition uses a vector vector type, which is not enabled
125+
unsafe { *(&x as *const i8x16 as *const i64) }
126+
}
127+
#[no_mangle]
128+
extern "C" fn vector_arg_large(x: i8x32) -> i64 {
129+
// Ok
130+
unsafe { *(&x as *const i8x32 as *const i64) }
131+
}
132+
133+
#[no_mangle]
134+
extern "C" fn vector_wrapper_arg_small(x: Wrapper<i8x8>) -> i64 {
135+
//~^ ABI error: this function definition uses a vector vector type, which is not enabled
136+
unsafe { *(&x as *const Wrapper<i8x8> as *const i64) }
137+
}
138+
#[no_mangle]
139+
extern "C" fn vector_wrapper_arg(x: Wrapper<i8x16>) -> i64 {
140+
//~^ ABI error: this function definition uses a vector vector type, which is not enabled
141+
unsafe { *(&x as *const Wrapper<i8x16> as *const i64) }
142+
}
143+
#[no_mangle]
144+
extern "C" fn vector_wrapper_arg_large(x: Wrapper<i8x32>) -> i64 {
145+
// Ok
146+
unsafe { *(&x as *const Wrapper<i8x32> as *const i64) }
147+
}
148+
149+
#[no_mangle]
150+
extern "C" fn vector_transparent_wrapper_arg_small(x: TransparentWrapper<i8x8>) -> i64 {
151+
//~^ ABI error: this function definition uses a vector vector type, which is not enabled
152+
unsafe { *(&x as *const TransparentWrapper<i8x8> as *const i64) }
153+
}
154+
#[no_mangle]
155+
extern "C" fn vector_transparent_wrapper_arg(x: TransparentWrapper<i8x16>) -> i64 {
156+
//~^ ABI error: this function definition uses a vector vector type, which is not enabled
157+
unsafe { *(&x as *const TransparentWrapper<i8x16> as *const i64) }
158+
}
159+
#[no_mangle]
160+
extern "C" fn vector_transparent_wrapper_arg_large(x: TransparentWrapper<i8x32>) -> i64 {
161+
// Ok
162+
unsafe { *(&x as *const TransparentWrapper<i8x32> as *const i64) }
163+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
error: ABI error: this function definition uses a vector vector type, which is not enabled
2+
--> $DIR/simd-abi-checks-s390x.rs:45:1
3+
|
4+
LL | extern "C" fn vector_ret_small(x: &i8x8) -> i8x8 {
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
6+
|
7+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
8+
9+
error: ABI error: this function definition uses a vector vector type, which is not enabled
10+
--> $DIR/simd-abi-checks-s390x.rs:50:1
11+
|
12+
LL | extern "C" fn vector_ret(x: &i8x16) -> i8x16 {
13+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
14+
|
15+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
16+
17+
error: ABI error: this function definition uses a vector vector type, which is not enabled
18+
--> $DIR/simd-abi-checks-s390x.rs:96:1
19+
|
20+
LL | / extern "C" fn vector_transparent_wrapper_ret_small(
21+
LL | | x: &TransparentWrapper<i8x8>,
22+
LL | | ) -> TransparentWrapper<i8x8> {
23+
| |_____________________________^
24+
|
25+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
26+
27+
error: ABI error: this function definition uses a vector vector type, which is not enabled
28+
--> $DIR/simd-abi-checks-s390x.rs:103:1
29+
|
30+
LL | / extern "C" fn vector_transparent_wrapper_ret(
31+
LL | | x: &TransparentWrapper<i8x16>,
32+
LL | | ) -> TransparentWrapper<i8x16> {
33+
| |______________________________^
34+
|
35+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
36+
37+
error: ABI error: this function definition uses a vector vector type, which is not enabled
38+
--> $DIR/simd-abi-checks-s390x.rs:118:1
39+
|
40+
LL | extern "C" fn vector_arg_small(x: i8x8) -> i64 {
41+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
42+
|
43+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
44+
45+
error: ABI error: this function definition uses a vector vector type, which is not enabled
46+
--> $DIR/simd-abi-checks-s390x.rs:123:1
47+
|
48+
LL | extern "C" fn vector_arg(x: i8x16) -> i64 {
49+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
50+
|
51+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
52+
53+
error: ABI error: this function definition uses a vector vector type, which is not enabled
54+
--> $DIR/simd-abi-checks-s390x.rs:134:1
55+
|
56+
LL | extern "C" fn vector_wrapper_arg_small(x: Wrapper<i8x8>) -> i64 {
57+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
58+
|
59+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
60+
61+
error: ABI error: this function definition uses a vector vector type, which is not enabled
62+
--> $DIR/simd-abi-checks-s390x.rs:139:1
63+
|
64+
LL | extern "C" fn vector_wrapper_arg(x: Wrapper<i8x16>) -> i64 {
65+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
66+
|
67+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
68+
69+
error: ABI error: this function definition uses a vector vector type, which is not enabled
70+
--> $DIR/simd-abi-checks-s390x.rs:150:1
71+
|
72+
LL | extern "C" fn vector_transparent_wrapper_arg_small(x: TransparentWrapper<i8x8>) -> i64 {
73+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
74+
|
75+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
76+
77+
error: ABI error: this function definition uses a vector vector type, which is not enabled
78+
--> $DIR/simd-abi-checks-s390x.rs:155:1
79+
|
80+
LL | extern "C" fn vector_transparent_wrapper_arg(x: TransparentWrapper<i8x16>) -> i64 {
81+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
82+
|
83+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
84+
85+
error: aborting due to 10 previous errors
86+
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
error: ABI error: this function definition uses a vector vector type, which is not enabled
2+
--> $DIR/simd-abi-checks-s390x.rs:45:1
3+
|
4+
LL | extern "C" fn vector_ret_small(x: &i8x8) -> i8x8 {
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
6+
|
7+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
8+
9+
error: ABI error: this function definition uses a vector vector type, which is not enabled
10+
--> $DIR/simd-abi-checks-s390x.rs:50:1
11+
|
12+
LL | extern "C" fn vector_ret(x: &i8x16) -> i8x16 {
13+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
14+
|
15+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
16+
17+
error: ABI error: this function definition uses a vector vector type, which is not enabled
18+
--> $DIR/simd-abi-checks-s390x.rs:96:1
19+
|
20+
LL | / extern "C" fn vector_transparent_wrapper_ret_small(
21+
LL | | x: &TransparentWrapper<i8x8>,
22+
LL | | ) -> TransparentWrapper<i8x8> {
23+
| |_____________________________^
24+
|
25+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
26+
27+
error: ABI error: this function definition uses a vector vector type, which is not enabled
28+
--> $DIR/simd-abi-checks-s390x.rs:103:1
29+
|
30+
LL | / extern "C" fn vector_transparent_wrapper_ret(
31+
LL | | x: &TransparentWrapper<i8x16>,
32+
LL | | ) -> TransparentWrapper<i8x16> {
33+
| |______________________________^
34+
|
35+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
36+
37+
error: ABI error: this function definition uses a vector vector type, which is not enabled
38+
--> $DIR/simd-abi-checks-s390x.rs:118:1
39+
|
40+
LL | extern "C" fn vector_arg_small(x: i8x8) -> i64 {
41+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
42+
|
43+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
44+
45+
error: ABI error: this function definition uses a vector vector type, which is not enabled
46+
--> $DIR/simd-abi-checks-s390x.rs:123:1
47+
|
48+
LL | extern "C" fn vector_arg(x: i8x16) -> i64 {
49+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
50+
|
51+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
52+
53+
error: ABI error: this function definition uses a vector vector type, which is not enabled
54+
--> $DIR/simd-abi-checks-s390x.rs:134:1
55+
|
56+
LL | extern "C" fn vector_wrapper_arg_small(x: Wrapper<i8x8>) -> i64 {
57+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
58+
|
59+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
60+
61+
error: ABI error: this function definition uses a vector vector type, which is not enabled
62+
--> $DIR/simd-abi-checks-s390x.rs:139:1
63+
|
64+
LL | extern "C" fn vector_wrapper_arg(x: Wrapper<i8x16>) -> i64 {
65+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
66+
|
67+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
68+
69+
error: ABI error: this function definition uses a vector vector type, which is not enabled
70+
--> $DIR/simd-abi-checks-s390x.rs:150:1
71+
|
72+
LL | extern "C" fn vector_transparent_wrapper_arg_small(x: TransparentWrapper<i8x8>) -> i64 {
73+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
74+
|
75+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
76+
77+
error: ABI error: this function definition uses a vector vector type, which is not enabled
78+
--> $DIR/simd-abi-checks-s390x.rs:155:1
79+
|
80+
LL | extern "C" fn vector_transparent_wrapper_arg(x: TransparentWrapper<i8x16>) -> i64 {
81+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
82+
|
83+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
84+
85+
error: aborting due to 10 previous errors
86+
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
error: ABI error: this function definition uses a vector vector type, which is not enabled
2+
--> $DIR/simd-abi-checks-s390x.rs:45:1
3+
|
4+
LL | extern "C" fn vector_ret_small(x: &i8x8) -> i8x8 {
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
6+
|
7+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
8+
9+
error: ABI error: this function definition uses a vector vector type, which is not enabled
10+
--> $DIR/simd-abi-checks-s390x.rs:50:1
11+
|
12+
LL | extern "C" fn vector_ret(x: &i8x16) -> i8x16 {
13+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
14+
|
15+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
16+
17+
error: ABI error: this function definition uses a vector vector type, which is not enabled
18+
--> $DIR/simd-abi-checks-s390x.rs:96:1
19+
|
20+
LL | / extern "C" fn vector_transparent_wrapper_ret_small(
21+
LL | | x: &TransparentWrapper<i8x8>,
22+
LL | | ) -> TransparentWrapper<i8x8> {
23+
| |_____________________________^
24+
|
25+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
26+
27+
error: ABI error: this function definition uses a vector vector type, which is not enabled
28+
--> $DIR/simd-abi-checks-s390x.rs:103:1
29+
|
30+
LL | / extern "C" fn vector_transparent_wrapper_ret(
31+
LL | | x: &TransparentWrapper<i8x16>,
32+
LL | | ) -> TransparentWrapper<i8x16> {
33+
| |______________________________^
34+
|
35+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
36+
37+
error: ABI error: this function definition uses a vector vector type, which is not enabled
38+
--> $DIR/simd-abi-checks-s390x.rs:118:1
39+
|
40+
LL | extern "C" fn vector_arg_small(x: i8x8) -> i64 {
41+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
42+
|
43+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
44+
45+
error: ABI error: this function definition uses a vector vector type, which is not enabled
46+
--> $DIR/simd-abi-checks-s390x.rs:123:1
47+
|
48+
LL | extern "C" fn vector_arg(x: i8x16) -> i64 {
49+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
50+
|
51+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
52+
53+
error: ABI error: this function definition uses a vector vector type, which is not enabled
54+
--> $DIR/simd-abi-checks-s390x.rs:134:1
55+
|
56+
LL | extern "C" fn vector_wrapper_arg_small(x: Wrapper<i8x8>) -> i64 {
57+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
58+
|
59+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
60+
61+
error: ABI error: this function definition uses a vector vector type, which is not enabled
62+
--> $DIR/simd-abi-checks-s390x.rs:139:1
63+
|
64+
LL | extern "C" fn vector_wrapper_arg(x: Wrapper<i8x16>) -> i64 {
65+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
66+
|
67+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
68+
69+
error: ABI error: this function definition uses a vector vector type, which is not enabled
70+
--> $DIR/simd-abi-checks-s390x.rs:150:1
71+
|
72+
LL | extern "C" fn vector_transparent_wrapper_arg_small(x: TransparentWrapper<i8x8>) -> i64 {
73+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
74+
|
75+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
76+
77+
error: ABI error: this function definition uses a vector vector type, which is not enabled
78+
--> $DIR/simd-abi-checks-s390x.rs:155:1
79+
|
80+
LL | extern "C" fn vector_transparent_wrapper_arg(x: TransparentWrapper<i8x16>) -> i64 {
81+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
82+
|
83+
= help: consider enabling it globally (-C target-feature=+vector) or locally (#[target_feature(enable="vector")])
84+
85+
error: aborting due to 10 previous errors
86+

0 commit comments

Comments
 (0)
Please sign in to comment.