Skip to content

Commit b5f5f62

Browse files
committed
make abi_unsupported_vector_types a hard error
1 parent 49e5e4e commit b5f5f62

20 files changed

+124
-955
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/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/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
}

tests/ui/abi/simd-abi-checks-avx.rs

+12-24
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
//@ only-x86_64
2-
//@ build-pass
3-
//@ ignore-pass (test emits codegen-time warnings)
2+
//@ build-fail
43
//@ compile-flags: -C target-feature=-avx
54

65
#![feature(avx512_target_feature)]
@@ -14,20 +13,17 @@ use std::arch::x86_64::*;
1413
struct Wrapper(__m256);
1514

1615
unsafe extern "C" fn w(_: Wrapper) {
17-
//~^ WARN requires the `avx` target feature, which is not enabled
18-
//~| WARNING this was previously accepted by the compiler
16+
//~^ ERROR: requires the `avx` target feature, which is not enabled
1917
todo!()
2018
}
2119

2220
unsafe extern "C" fn f(_: __m256) {
23-
//~^ WARN requires the `avx` target feature, which is not enabled
24-
//~| WARNING this was previously accepted by the compiler
21+
//~^ ERROR: requires the `avx` target feature, which is not enabled
2522
todo!()
2623
}
2724

2825
unsafe extern "C" fn g() -> __m256 {
29-
//~^ WARN requires the `avx` target feature, which is not enabled
30-
//~| WARNING this was previously accepted by the compiler
26+
//~^ ERROR: requires the `avx` target feature, which is not enabled
3127
todo!()
3228
}
3329

@@ -56,25 +52,20 @@ unsafe fn test() {
5652
unsafe fn in_closure() -> impl FnOnce() -> __m256 {
5753
#[inline(always)] // this disables target-feature inheritance
5854
|| g()
59-
//~^ WARNING requires the `avx` target feature, which is not enabled in the caller
60-
//~| WARNING this was previously accepted by the compiler
55+
//~^ ERROR requires the `avx` target feature, which is not enabled in the caller
6156
}
6257

6358
fn main() {
6459
unsafe {
6560
f(g());
66-
//~^ WARNING requires the `avx` target feature, which is not enabled in the caller
67-
//~| WARNING requires the `avx` target feature, which is not enabled in the caller
68-
//~| WARNING this was previously accepted by the compiler
69-
//~| WARNING this was previously accepted by the compiler
61+
//~^ ERROR requires the `avx` target feature, which is not enabled in the caller
62+
//~| ERROR requires the `avx` target feature, which is not enabled in the caller
7063
}
7164

7265
unsafe {
7366
gavx(favx());
74-
//~^ WARNING requires the `avx` target feature, which is not enabled in the caller
75-
//~| WARNING requires the `avx` target feature, which is not enabled in the caller
76-
//~| WARNING this was previously accepted by the compiler
77-
//~| WARNING this was previously accepted by the compiler
67+
//~^ ERROR requires the `avx` target feature, which is not enabled in the caller
68+
//~| ERROR requires the `avx` target feature, which is not enabled in the caller
7869
}
7970

8071
unsafe {
@@ -83,10 +74,8 @@ fn main() {
8374

8475
unsafe {
8576
w(Wrapper(g()));
86-
//~^ WARNING requires the `avx` target feature, which is not enabled in the caller
87-
//~| WARNING requires the `avx` target feature, which is not enabled in the caller
88-
//~| WARNING this was previously accepted by the compiler
89-
//~| WARNING this was previously accepted by the compiler
77+
//~^ ERROR requires the `avx` target feature, which is not enabled in the caller
78+
//~| ERROR requires the `avx` target feature, which is not enabled in the caller
9079
}
9180

9281
unsafe {
@@ -99,8 +88,7 @@ fn main() {
9988
fn some_extern() -> __m256;
10089
}
10190
some_extern();
102-
//~^ WARNING requires the `avx` target feature, which is not enabled in the caller
103-
//~| WARNING this was previously accepted by the compiler
91+
//~^ ERROR requires the `avx` target feature, which is not enabled in the caller
10492
}
10593
}
10694

0 commit comments

Comments
 (0)