Skip to content

Commit 48459fb

Browse files
committed
Auto merge of #139309 - RalfJung:abi_unsupported_vector_types, r=<try>
make abi_unsupported_vector_types a hard error Fixes #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](#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. #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 #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
2 parents fae7785 + 8b62073 commit 48459fb

23 files changed

+134
-976
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

+1-21
Original file line numberDiff line numberDiff line change
@@ -28,40 +28,20 @@ pub struct Simd<T, const N: usize>([T; N]);
2828

2929
extern "unadjusted" {
3030
fn test_i8x2(a: i8x2);
31-
}
32-
33-
extern "unadjusted" {
3431
fn test_i8x2_two_args(a: i8x2, b: i8x2);
35-
}
36-
37-
extern "unadjusted" {
3832
fn test_i8x2_mixed_args(a: i8x2, c: i32, b: i8x2);
39-
}
40-
41-
extern "unadjusted" {
4233
fn test_i8x2_arr(a: i8x2);
43-
}
44-
45-
extern "unadjusted" {
4634
fn test_f32x2(a: f32x2);
47-
}
48-
49-
extern "unadjusted" {
5035
fn test_f32x2_arr(a: f32x2);
51-
}
52-
53-
extern "unadjusted" {
5436
fn test_simd(a: Simd<i32, 4>);
55-
}
56-
57-
extern "unadjusted" {
5837
fn test_simd_unaligned(a: Simd<i32, 3>);
5938
}
6039

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

44+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
6545
pub fn do_call() {
6646
unsafe {
6747
// 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

+1
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ 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"))]
142143
pub extern "C" fn test_Vector(_: Vector) -> Vector {
143144
loop {}
144145
}

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

+8
Original file line numberDiff line numberDiff line change
@@ -21,55 +21,63 @@ 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"))]
2425
unsafe extern "C" fn dyn_simd_extract(x: i8x16, idx: u32) -> i8 {
2526
simd_extract_dyn(x, idx)
2627
}
2728

2829
// CHECK-LABEL: literal_dyn_simd_extract
2930
// CHECK: extractelement <16 x i8> %x, i32 7
3031
#[no_mangle]
32+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
3133
unsafe extern "C" fn literal_dyn_simd_extract(x: i8x16) -> i8 {
3234
simd_extract_dyn(x, 7)
3335
}
3436

3537
// CHECK-LABEL: const_dyn_simd_extract
3638
// CHECK: extractelement <16 x i8> %x, i32 7
3739
#[no_mangle]
40+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
3841
unsafe extern "C" fn const_dyn_simd_extract(x: i8x16) -> i8 {
3942
simd_extract_dyn(x, const { 3 + 4 })
4043
}
4144

4245
// CHECK-LABEL: const_simd_extract
4346
// CHECK: extractelement <16 x i8> %x, i32 7
4447
#[no_mangle]
48+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
4549
unsafe extern "C" fn const_simd_extract(x: i8x16) -> i8 {
4650
simd_extract(x, const { 3 + 4 })
4751
}
4852

4953
// CHECK-LABEL: dyn_simd_insert
5054
// CHECK: insertelement <16 x i8> %x, i8 %e, i32 %idx
5155
#[no_mangle]
56+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
5257
unsafe extern "C" fn dyn_simd_insert(x: i8x16, e: i8, idx: u32) -> i8x16 {
5358
simd_insert_dyn(x, idx, e)
5459
}
5560

5661
// CHECK-LABEL: literal_dyn_simd_insert
5762
// CHECK: insertelement <16 x i8> %x, i8 %e, i32 7
5863
#[no_mangle]
64+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
5965
unsafe extern "C" fn literal_dyn_simd_insert(x: i8x16, e: i8) -> i8x16 {
6066
simd_insert_dyn(x, 7, e)
6167
}
6268

6369
// CHECK-LABEL: const_dyn_simd_insert
6470
// CHECK: insertelement <16 x i8> %x, i8 %e, i32 7
6571
#[no_mangle]
72+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
6673
unsafe extern "C" fn const_dyn_simd_insert(x: i8x16, e: i8) -> i8x16 {
6774
simd_insert_dyn(x, const { 3 + 4 }, e)
6875
}
6976

7077
// CHECK-LABEL: const_simd_insert
7178
// CHECK: insertelement <16 x i8> %x, i8 %e, i32 7
7279
#[no_mangle]
80+
#[cfg_attr(target_family = "wasm", target_feature(enable = "simd128"))]
7381
unsafe extern "C" fn const_simd_insert(x: i8x16, e: i8) -> i8x16 {
7482
simd_insert(x, const { 3 + 4 }, e)
7583
}

tests/run-make/simd-ffi/rmake.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,20 @@ fn main() {
5252
// enabled by-default for i686 and ARM; these features will be invalid
5353
// on some platforms, but LLVM just prints a warning so that's fine for
5454
// now.
55+
let target_feature = if target.starts_with("i686") || target.starts_with("x86") {
56+
"+sse2"
57+
} else if target.starts_with("arm") || target.starts_with("aarch64") {
58+
"-soft-float,+neon"
59+
} else if target.starts_with("mips") {
60+
"+msa,+fp64"
61+
} else {
62+
panic!("missing target_feature case for {target}");
63+
};
5564
rustc()
5665
.target(&target)
5766
.emit("llvm-ir,asm")
5867
.input("simd.rs")
59-
.arg("-Ctarget-feature=-soft-float,+neon,+sse")
68+
.arg(format!("-Ctarget-feature={target_feature}"))
6069
.arg(&format!("-Cextra-filename=-{target}"))
6170
.run();
6271
}

0 commit comments

Comments
 (0)