Skip to content

Commit 49fa644

Browse files
committed
Auto merge of rust-lang#139309 - RalfJung:abi_unsupported_vector_types, r=fee1-dead,traviscross
make abi_unsupported_vector_types a hard error Fixes rust-lang#116558 by completing the transition; see that issue for context. The lint was introduced with Rust 1.84 and this has been shown in cargo's future breakage reports since Rust 1.85, released 6 weeks ago, and so far we got 0 complaints by users. There's not even a backlink on the tracking issue. We did a [crater run](rust-lang#127731 (comment)) when the lint was originally added and found no breakage. So I don't think we need another crater run now, but I can do one if the team prefers that. rust-lang#131800 is done, so for most current targets (in particular, all tier 1 and tier 2 targets) we have the information to implement this check (modulo the targets where we don't properly support SIMD vectors yet, see the sub-issues of rust-lang#116558). If a new target gets added in the future, it will default to reject all SIMD vector types until proper information is added, which is the default we want. This will need approval by for `@rust-lang/lang.` Cc `@workingjubilee` `@veluca93` try-job: test-various try-job: armhf-gnu
2 parents 645d0ad + 64d0bb2 commit 49fa644

23 files changed

+147
-978
lines changed

compiler/rustc_codegen_cranelift/example/std_example.rs

-3
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@
88
unboxed_closures
99
)]
1010
#![allow(internal_features)]
11-
// FIXME once abi_unsupported_vector_types is a hard error disable the foo test when the respective
12-
// target feature is not enabled.
13-
#![allow(abi_unsupported_vector_types)]
1411

1512
#[cfg(target_arch = "x86_64")]
1613
use std::arch::x86_64::*;

compiler/rustc_lint/src/lib.rs

+5
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,11 @@ fn register_builtins(store: &mut LintStore) {
608608
"converted into hard error, see PR #139001 \
609609
<https://github.com/rust-lang/rust/issues/139001> for more information",
610610
);
611+
store.register_removed(
612+
"abi_unsupported_vector_types",
613+
"converted into hard error, \
614+
see <https://github.com/rust-lang/rust/issues/116558> for more information",
615+
);
611616
}
612617

613618
fn register_internals(store: &mut LintStore) {

compiler/rustc_lint_defs/src/builtin.rs

-69
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ declare_lint_pass! {
1616
/// that are used by other parts of the compiler.
1717
HardwiredLints => [
1818
// tidy-alphabetical-start
19-
ABI_UNSUPPORTED_VECTOR_TYPES,
2019
ABSOLUTE_PATHS_NOT_STARTING_WITH_CRATE,
2120
AMBIGUOUS_ASSOCIATED_ITEMS,
2221
AMBIGUOUS_GLOB_IMPORTS,
@@ -5027,74 +5026,6 @@ declare_lint! {
50275026
crate_level_only
50285027
}
50295028

5030-
declare_lint! {
5031-
/// The `abi_unsupported_vector_types` lint detects function definitions and calls
5032-
/// whose ABI depends on enabling certain target features, but those features are not enabled.
5033-
///
5034-
/// ### Example
5035-
///
5036-
/// ```rust,ignore (fails on non-x86_64)
5037-
/// extern "C" fn missing_target_feature(_: std::arch::x86_64::__m256) {
5038-
/// todo!()
5039-
/// }
5040-
///
5041-
/// #[target_feature(enable = "avx")]
5042-
/// unsafe extern "C" fn with_target_feature(_: std::arch::x86_64::__m256) {
5043-
/// todo!()
5044-
/// }
5045-
///
5046-
/// fn main() {
5047-
/// let v = unsafe { std::mem::zeroed() };
5048-
/// unsafe { with_target_feature(v); }
5049-
/// }
5050-
/// ```
5051-
///
5052-
/// This will produce:
5053-
///
5054-
/// ```text
5055-
/// warning: ABI error: this function call uses a avx vector type, which is not enabled in the caller
5056-
/// --> lint_example.rs:18:12
5057-
/// |
5058-
/// | unsafe { with_target_feature(v); }
5059-
/// | ^^^^^^^^^^^^^^^^^^^^^^ function called here
5060-
/// |
5061-
/// = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
5062-
/// = note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
5063-
/// = help: consider enabling it globally (-C target-feature=+avx) or locally (#[target_feature(enable="avx")])
5064-
/// = note: `#[warn(abi_unsupported_vector_types)]` on by default
5065-
///
5066-
///
5067-
/// warning: ABI error: this function definition uses a avx vector type, which is not enabled
5068-
/// --> lint_example.rs:3:1
5069-
/// |
5070-
/// | pub extern "C" fn with_target_feature(_: std::arch::x86_64::__m256) {
5071-
/// | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
5072-
/// |
5073-
/// = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
5074-
/// = note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
5075-
/// = help: consider enabling it globally (-C target-feature=+avx) or locally (#[target_feature(enable="avx")])
5076-
/// ```
5077-
///
5078-
///
5079-
///
5080-
/// ### Explanation
5081-
///
5082-
/// The C ABI for `__m256` requires the value to be passed in an AVX register,
5083-
/// which is only possible when the `avx` target feature is enabled.
5084-
/// Therefore, `missing_target_feature` cannot be compiled without that target feature.
5085-
/// A similar (but complementary) message is triggered when `with_target_feature` is called
5086-
/// by a function that does not enable the `avx` target feature.
5087-
///
5088-
/// Note that this lint is very similar to the `-Wpsabi` warning in `gcc`/`clang`.
5089-
pub ABI_UNSUPPORTED_VECTOR_TYPES,
5090-
Warn,
5091-
"this function call or definition uses a vector type which is not enabled",
5092-
@future_incompatible = FutureIncompatibleInfo {
5093-
reason: FutureIncompatibilityReason::FutureReleaseErrorReportInDeps,
5094-
reference: "issue #116558 <https://github.com/rust-lang/rust/issues/116558>",
5095-
};
5096-
}
5097-
50985029
declare_lint! {
50995030
/// The `wasm_c_abi` lint detects usage of the `extern "C"` ABI of wasm that is affected
51005031
/// by a planned ABI change that has the goal of aligning Rust with the standard C ABI

compiler/rustc_monomorphize/src/errors.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,11 @@ pub(crate) struct UnknownCguCollectionMode<'a> {
7070
pub mode: &'a str,
7171
}
7272

73-
#[derive(LintDiagnostic)]
73+
#[derive(Diagnostic)]
7474
#[diag(monomorphize_abi_error_disabled_vector_type)]
7575
#[help]
7676
pub(crate) struct AbiErrorDisabledVectorType<'a> {
77+
#[primary_span]
7778
#[label]
7879
pub span: Span,
7980
pub required_feature: &'a str,
@@ -82,9 +83,10 @@ pub(crate) struct AbiErrorDisabledVectorType<'a> {
8283
pub is_call: bool,
8384
}
8485

85-
#[derive(LintDiagnostic)]
86+
#[derive(Diagnostic)]
8687
#[diag(monomorphize_abi_error_unsupported_vector_type)]
8788
pub(crate) struct AbiErrorUnsupportedVectorType<'a> {
89+
#[primary_span]
8890
#[label]
8991
pub span: Span,
9092
pub ty: Ty<'a>,

compiler/rustc_monomorphize/src/mono_checks/abi_check.rs

+12-22
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use rustc_hir::{CRATE_HIR_ID, HirId};
55
use rustc_middle::mir::{self, Location, traversal};
66
use rustc_middle::ty::layout::LayoutCx;
77
use rustc_middle::ty::{self, Instance, InstanceKind, Ty, TyCtxt, TypingEnv};
8-
use rustc_session::lint::builtin::{ABI_UNSUPPORTED_VECTOR_TYPES, WASM_C_ABI};
8+
use rustc_session::lint::builtin::WASM_C_ABI;
99
use rustc_span::def_id::DefId;
1010
use rustc_span::{DUMMY_SP, Span, Symbol, sym};
1111
use rustc_target::callconv::{ArgAbi, Conv, FnAbi, PassMode};
@@ -50,34 +50,24 @@ fn do_check_simd_vector_abi<'tcx>(
5050
let feature = match feature_def.iter().find(|(bits, _)| size.bits() <= *bits) {
5151
Some((_, feature)) => feature,
5252
None => {
53-
let (span, hir_id) = loc();
54-
tcx.emit_node_span_lint(
55-
ABI_UNSUPPORTED_VECTOR_TYPES,
56-
hir_id,
53+
let (span, _hir_id) = loc();
54+
tcx.dcx().emit_err(errors::AbiErrorUnsupportedVectorType {
5755
span,
58-
errors::AbiErrorUnsupportedVectorType {
59-
span,
60-
ty: arg_abi.layout.ty,
61-
is_call,
62-
},
63-
);
56+
ty: arg_abi.layout.ty,
57+
is_call,
58+
});
6459
continue;
6560
}
6661
};
6762
if !have_feature(Symbol::intern(feature)) {
6863
// Emit error.
69-
let (span, hir_id) = loc();
70-
tcx.emit_node_span_lint(
71-
ABI_UNSUPPORTED_VECTOR_TYPES,
72-
hir_id,
64+
let (span, _hir_id) = loc();
65+
tcx.dcx().emit_err(errors::AbiErrorDisabledVectorType {
7366
span,
74-
errors::AbiErrorDisabledVectorType {
75-
span,
76-
required_feature: feature,
77-
ty: arg_abi.layout.ty,
78-
is_call,
79-
},
80-
);
67+
required_feature: feature,
68+
ty: arg_abi.layout.ty,
69+
is_call,
70+
});
8171
}
8272
}
8373
}

compiler/rustc_target/src/target_features.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -775,7 +775,7 @@ const RISCV_FEATURES_FOR_CORRECT_VECTOR_ABI: &'static [(u64, &'static str)] = &[
775775
(32768, "zvl32768b"),
776776
(65536, "zvl65536b"),
777777
];
778-
// Always warn on SPARC, as the necessary target features cannot be enabled in Rust at the moment.
778+
// Always error on SPARC, as the necessary target features cannot be enabled in Rust at the moment.
779779
const SPARC_FEATURES_FOR_CORRECT_VECTOR_ABI: &'static [(u64, &'static str)] = &[/*(64, "vis")*/];
780780

781781
const HEXAGON_FEATURES_FOR_CORRECT_VECTOR_ABI: &'static [(u64, &'static str)] =

tests/assembly/simd-bitmask.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,9 @@ pub unsafe extern "C" fn bitmask_m8x16(mask: m8x16) -> u16 {
6565
simd_bitmask(mask)
6666
}
6767

68-
// CHECK-LABEL: bitmask_m8x64
68+
// x86-avx512-LABEL: bitmask_m8x64
6969
#[no_mangle]
70+
#[cfg(x86_avx512)]
7071
pub unsafe extern "C" fn bitmask_m8x64(mask: m8x64) -> u64 {
7172
// The simd_bitmask intrinsic already uses the most significant bit, so no shift is necessary.
7273
// Note that x86 has no byte shift, llvm uses a word shift to move the least significant bit
@@ -128,8 +129,10 @@ pub unsafe extern "C" fn bitmask_m64x2(mask: m64x2) -> u8 {
128129
simd_bitmask(mask)
129130
}
130131

131-
// CHECK-LABEL: bitmask_m64x4
132+
// x86-avx2-LABEL: bitmask_m64x4
133+
// x86-avx512-LABEL: bitmask_m64x4
132134
#[no_mangle]
135+
#[cfg(any(x86_avx2, x86_avx512))]
133136
pub unsafe extern "C" fn bitmask_m64x4(mask: m64x4) -> u8 {
134137
// The simd_bitmask intrinsic already uses the most significant bit, so no shift is necessary.
135138
//

tests/assembly/simd-intrinsic-select.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,10 @@ pub unsafe extern "C" fn select_f64x2(mask: m64x2, a: f64x2, b: f64x2) -> f64x2
9999
simd_select(mask, a, b)
100100
}
101101

102-
// CHECK-LABEL: select_f64x4
102+
// x86-avx2-LABEL: select_f64x4
103+
// x86-avx512-LABEL: select_f64x4
103104
#[no_mangle]
105+
#[cfg(any(x86_avx2, x86_avx512))]
104106
pub unsafe extern "C" fn select_f64x4(mask: m64x4, a: f64x4, b: f64x4) -> f64x4 {
105107
// The parameter is a 256 bit vector which in the C abi is only valid for avx targets.
106108
//
@@ -113,8 +115,9 @@ pub unsafe extern "C" fn select_f64x4(mask: m64x4, a: f64x4, b: f64x4) -> f64x4
113115
simd_select(mask, a, b)
114116
}
115117

116-
// CHECK-LABEL: select_f64x8
118+
// x86-avx512-LABEL: select_f64x8
117119
#[no_mangle]
120+
#[cfg(x86_avx512)]
118121
pub unsafe extern "C" fn select_f64x8(mask: m64x8, a: f64x8, b: f64x8) -> f64x8 {
119122
// The parameter is a 256 bit vector which in the C abi is only valid for avx512 targets.
120123
//

tests/codegen/const-vector.rs

+3-21
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#![feature(repr_simd)]
99
#![feature(rustc_attrs)]
1010
#![feature(simd_ffi)]
11+
#![feature(arm_target_feature)]
1112
#![allow(non_camel_case_types)]
1213

1314
// Setting up structs that can be used as const vectors
@@ -28,40 +29,21 @@ pub struct Simd<T, const N: usize>([T; N]);
2829

2930
extern "unadjusted" {
3031
fn test_i8x2(a: i8x2);
31-
}
32-
33-
extern "unadjusted" {
3432
fn test_i8x2_two_args(a: i8x2, b: i8x2);
35-
}
36-
37-
extern "unadjusted" {
3833
fn test_i8x2_mixed_args(a: i8x2, c: i32, b: i8x2);
39-
}
40-
41-
extern "unadjusted" {
4234
fn test_i8x2_arr(a: i8x2);
43-
}
44-
45-
extern "unadjusted" {
4635
fn test_f32x2(a: f32x2);
47-
}
48-
49-
extern "unadjusted" {
5036
fn test_f32x2_arr(a: f32x2);
51-
}
52-
53-
extern "unadjusted" {
5437
fn test_simd(a: Simd<i32, 4>);
55-
}
56-
57-
extern "unadjusted" {
5838
fn test_simd_unaligned(a: Simd<i32, 3>);
5939
}
6040

6141
// Ensure the packed variant of the simd struct does not become a const vector
6242
// if the size is not a power of 2
6343
// CHECK: %"Simd<i32, 3>" = type { [3 x i32] }
6444

45+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
46+
#[cfg_attr(target_arch = "arm", target_feature(enable = "neon"))]
6547
pub fn do_call() {
6648
unsafe {
6749
// CHECK: call void @test_i8x2(<2 x i8> <i8 32, i8 64>

tests/codegen/regparm-inreg.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// x86 only.
44

55
//@ add-core-stubs
6-
//@ compile-flags: --target i686-unknown-linux-gnu -Cno-prepopulate-passes -Copt-level=3
6+
//@ compile-flags: --target i686-unknown-linux-gnu -Cno-prepopulate-passes -Copt-level=3 -Ctarget-feature=+avx
77
//@ needs-llvm-components: x86
88

99
//@ revisions:regparm0 regparm1 regparm2 regparm3

tests/codegen/repr/transparent.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// For LoongArch: see codegen/loongarch-abi
1010

1111
#![crate_type = "lib"]
12-
#![feature(repr_simd, transparent_unions)]
12+
#![feature(repr_simd, transparent_unions, arm_target_feature)]
1313

1414
use std::marker::PhantomData;
1515

@@ -139,6 +139,8 @@ pub struct Vector(f32x4);
139139

140140
// CHECK: define{{.*}}<4 x float> @test_Vector(<4 x float> %_1)
141141
#[no_mangle]
142+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
143+
#[cfg_attr(target_arch = "arm", target_feature(enable = "neon"))]
142144
pub extern "C" fn test_Vector(_: Vector) -> Vector {
143145
loop {}
144146
}

tests/codegen/simd/extract-insert-dyn.rs

+17-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//@compile-flags: -C opt-level=3 -C no-prepopulate-passes
22

3-
#![feature(core_intrinsics, repr_simd)]
3+
#![feature(core_intrinsics, repr_simd, arm_target_feature)]
44
#![no_std]
55
#![crate_type = "lib"]
66
#![allow(non_camel_case_types)]
@@ -21,55 +21,71 @@ pub struct i8x16([i8; 16]);
2121
// CHECK-LABEL: dyn_simd_extract
2222
// CHECK: extractelement <16 x i8> %x, i32 %idx
2323
#[no_mangle]
24+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
25+
#[cfg_attr(target_arch = "arm", target_feature(enable = "neon"))]
2426
unsafe extern "C" fn dyn_simd_extract(x: i8x16, idx: u32) -> i8 {
2527
simd_extract_dyn(x, idx)
2628
}
2729

2830
// CHECK-LABEL: literal_dyn_simd_extract
2931
// CHECK: extractelement <16 x i8> %x, i32 7
3032
#[no_mangle]
33+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
34+
#[cfg_attr(target_arch = "arm", target_feature(enable = "neon"))]
3135
unsafe extern "C" fn literal_dyn_simd_extract(x: i8x16) -> i8 {
3236
simd_extract_dyn(x, 7)
3337
}
3438

3539
// CHECK-LABEL: const_dyn_simd_extract
3640
// CHECK: extractelement <16 x i8> %x, i32 7
3741
#[no_mangle]
42+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
43+
#[cfg_attr(target_arch = "arm", target_feature(enable = "neon"))]
3844
unsafe extern "C" fn const_dyn_simd_extract(x: i8x16) -> i8 {
3945
simd_extract_dyn(x, const { 3 + 4 })
4046
}
4147

4248
// CHECK-LABEL: const_simd_extract
4349
// CHECK: extractelement <16 x i8> %x, i32 7
4450
#[no_mangle]
51+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
52+
#[cfg_attr(target_arch = "arm", target_feature(enable = "neon"))]
4553
unsafe extern "C" fn const_simd_extract(x: i8x16) -> i8 {
4654
simd_extract(x, const { 3 + 4 })
4755
}
4856

4957
// CHECK-LABEL: dyn_simd_insert
5058
// CHECK: insertelement <16 x i8> %x, i8 %e, i32 %idx
5159
#[no_mangle]
60+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
61+
#[cfg_attr(target_arch = "arm", target_feature(enable = "neon"))]
5262
unsafe extern "C" fn dyn_simd_insert(x: i8x16, e: i8, idx: u32) -> i8x16 {
5363
simd_insert_dyn(x, idx, e)
5464
}
5565

5666
// CHECK-LABEL: literal_dyn_simd_insert
5767
// CHECK: insertelement <16 x i8> %x, i8 %e, i32 7
5868
#[no_mangle]
69+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
70+
#[cfg_attr(target_arch = "arm", target_feature(enable = "neon"))]
5971
unsafe extern "C" fn literal_dyn_simd_insert(x: i8x16, e: i8) -> i8x16 {
6072
simd_insert_dyn(x, 7, e)
6173
}
6274

6375
// CHECK-LABEL: const_dyn_simd_insert
6476
// CHECK: insertelement <16 x i8> %x, i8 %e, i32 7
6577
#[no_mangle]
78+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
79+
#[cfg_attr(target_arch = "arm", target_feature(enable = "neon"))]
6680
unsafe extern "C" fn const_dyn_simd_insert(x: i8x16, e: i8) -> i8x16 {
6781
simd_insert_dyn(x, const { 3 + 4 }, e)
6882
}
6983

7084
// CHECK-LABEL: const_simd_insert
7185
// CHECK: insertelement <16 x i8> %x, i8 %e, i32 7
7286
#[no_mangle]
87+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
88+
#[cfg_attr(target_arch = "arm", target_feature(enable = "neon"))]
7389
unsafe extern "C" fn const_simd_insert(x: i8x16, e: i8) -> i8x16 {
7490
simd_insert(x, const { 3 + 4 }, e)
7591
}

0 commit comments

Comments
 (0)