vectorcall ABI: error if sse2 is not available
This commit is contained in:
parent
79b2360d98
commit
83fd16f625
12 changed files with 102 additions and 74 deletions
|
@ -22,6 +22,20 @@ monomorphize_abi_error_unsupported_vector_type =
|
|||
*[false] defined
|
||||
} here
|
||||
|
||||
monomorphize_abi_required_target_feature =
|
||||
this function {$is_call ->
|
||||
[true] call
|
||||
*[false] definition
|
||||
} uses ABI "{$abi}" which requires the `{$required_feature}` target feature, which is not enabled{$is_call ->
|
||||
[true] {" "}in the caller
|
||||
*[false] {""}
|
||||
}
|
||||
.label = function {$is_call ->
|
||||
[true] called
|
||||
*[false] defined
|
||||
} here
|
||||
.help = consider enabling it globally (`-C target-feature=+{$required_feature}`) or locally (`#[target_feature(enable="{$required_feature}")]`)
|
||||
|
||||
monomorphize_couldnt_dump_mono_stats =
|
||||
unexpected error occurred while dumping monomorphization stats: {$error}
|
||||
|
||||
|
|
|
@ -90,3 +90,16 @@ pub(crate) struct AbiErrorUnsupportedVectorType<'a> {
|
|||
/// Whether this is a problem at a call site or at a declaration.
|
||||
pub is_call: bool,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(monomorphize_abi_required_target_feature)]
|
||||
#[help]
|
||||
pub(crate) struct AbiRequiredTargetFeature<'a> {
|
||||
#[primary_span]
|
||||
#[label]
|
||||
pub span: Span,
|
||||
pub required_feature: &'a str,
|
||||
pub abi: &'a str,
|
||||
/// Whether this is a problem at a call site or at a declaration.
|
||||
pub is_call: bool,
|
||||
}
|
||||
|
|
|
@ -29,12 +29,12 @@ fn uses_vector_registers(mode: &PassMode, repr: &BackendRepr) -> bool {
|
|||
fn do_check_abi<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
abi: &FnAbi<'tcx, Ty<'tcx>>,
|
||||
target_feature_def: DefId,
|
||||
def_id: DefId,
|
||||
is_call: bool,
|
||||
span: impl Fn() -> Span,
|
||||
) {
|
||||
let feature_def = tcx.sess.target.features_for_correct_vector_abi();
|
||||
let codegen_attrs = tcx.codegen_fn_attrs(target_feature_def);
|
||||
let codegen_attrs = tcx.codegen_fn_attrs(def_id);
|
||||
let have_feature = |feat: Symbol| {
|
||||
tcx.sess.unstable_target_features.contains(&feat)
|
||||
|| codegen_attrs.target_features.iter().any(|x| x.name == feat)
|
||||
|
@ -77,6 +77,15 @@ fn do_check_abi<'tcx>(
|
|||
}
|
||||
}
|
||||
}
|
||||
// The `vectorcall` ABI is special in that it requires SSE2 no matter which types are being passed.
|
||||
if abi.conv == Conv::X86VectorCall && !have_feature(sym::sse2) {
|
||||
tcx.dcx().emit_err(errors::AbiRequiredTargetFeature {
|
||||
span: span(),
|
||||
required_feature: "sse2",
|
||||
abi: "vectorcall",
|
||||
is_call,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// Checks that the ABI of a given instance of a function does not contain vector-passed arguments
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
warning: this function call uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled in the caller
|
||||
--> $DIR/simd-abi-checks.rs:64:11
|
||||
--> $DIR/simd-abi-checks-avx.rs:64:11
|
||||
|
|
||||
LL | f(g());
|
||||
| ^^^ function called here
|
||||
|
@ -10,7 +10,7 @@ LL | f(g());
|
|||
= note: `#[warn(abi_unsupported_vector_types)]` on by default
|
||||
|
||||
warning: this function call uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled in the caller
|
||||
--> $DIR/simd-abi-checks.rs:64:9
|
||||
--> $DIR/simd-abi-checks-avx.rs:64:9
|
||||
|
|
||||
LL | f(g());
|
||||
| ^^^^^^ function called here
|
||||
|
@ -20,7 +20,7 @@ LL | f(g());
|
|||
= help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
|
||||
|
||||
warning: this function call uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled in the caller
|
||||
--> $DIR/simd-abi-checks.rs:72:14
|
||||
--> $DIR/simd-abi-checks-avx.rs:72:14
|
||||
|
|
||||
LL | gavx(favx());
|
||||
| ^^^^^^ function called here
|
||||
|
@ -30,7 +30,7 @@ LL | gavx(favx());
|
|||
= help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
|
||||
|
||||
warning: this function call uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled in the caller
|
||||
--> $DIR/simd-abi-checks.rs:72:9
|
||||
--> $DIR/simd-abi-checks-avx.rs:72:9
|
||||
|
|
||||
LL | gavx(favx());
|
||||
| ^^^^^^^^^^^^ function called here
|
||||
|
@ -40,7 +40,7 @@ LL | gavx(favx());
|
|||
= help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
|
||||
|
||||
warning: this function call uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled in the caller
|
||||
--> $DIR/simd-abi-checks.rs:84:19
|
||||
--> $DIR/simd-abi-checks-avx.rs:84:19
|
||||
|
|
||||
LL | w(Wrapper(g()));
|
||||
| ^^^ function called here
|
||||
|
@ -50,7 +50,7 @@ LL | w(Wrapper(g()));
|
|||
= help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
|
||||
|
||||
warning: this function call uses SIMD vector type `Wrapper` which (with the chosen ABI) requires the `avx` target feature, which is not enabled in the caller
|
||||
--> $DIR/simd-abi-checks.rs:84:9
|
||||
--> $DIR/simd-abi-checks-avx.rs:84:9
|
||||
|
|
||||
LL | w(Wrapper(g()));
|
||||
| ^^^^^^^^^^^^^^^ function called here
|
||||
|
@ -60,7 +60,7 @@ LL | w(Wrapper(g()));
|
|||
= help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
|
||||
|
||||
warning: this function call uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled in the caller
|
||||
--> $DIR/simd-abi-checks.rs:100:9
|
||||
--> $DIR/simd-abi-checks-avx.rs:100:9
|
||||
|
|
||||
LL | some_extern();
|
||||
| ^^^^^^^^^^^^^ function called here
|
||||
|
@ -70,7 +70,7 @@ LL | some_extern();
|
|||
= help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
|
||||
|
||||
warning: this function definition uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled
|
||||
--> $DIR/simd-abi-checks.rs:27:1
|
||||
--> $DIR/simd-abi-checks-avx.rs:27:1
|
||||
|
|
||||
LL | unsafe extern "C" fn g() -> __m256 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
|
||||
|
@ -80,7 +80,7 @@ LL | unsafe extern "C" fn g() -> __m256 {
|
|||
= help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
|
||||
|
||||
warning: this function definition uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled
|
||||
--> $DIR/simd-abi-checks.rs:21:1
|
||||
--> $DIR/simd-abi-checks-avx.rs:21:1
|
||||
|
|
||||
LL | unsafe extern "C" fn f(_: __m256) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
|
||||
|
@ -90,7 +90,7 @@ LL | unsafe extern "C" fn f(_: __m256) {
|
|||
= help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
|
||||
|
||||
warning: this function definition uses SIMD vector type `Wrapper` which (with the chosen ABI) requires the `avx` target feature, which is not enabled
|
||||
--> $DIR/simd-abi-checks.rs:15:1
|
||||
--> $DIR/simd-abi-checks-avx.rs:15:1
|
||||
|
|
||||
LL | unsafe extern "C" fn w(_: Wrapper) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
|
||||
|
@ -100,7 +100,7 @@ LL | unsafe extern "C" fn w(_: Wrapper) {
|
|||
= help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
|
||||
|
||||
warning: this function call uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled in the caller
|
||||
--> $DIR/simd-abi-checks.rs:57:8
|
||||
--> $DIR/simd-abi-checks-avx.rs:57:8
|
||||
|
|
||||
LL | || g()
|
||||
| ^^^ function called here
|
||||
|
@ -113,7 +113,7 @@ warning: 11 warnings emitted
|
|||
|
||||
Future incompatibility report: Future breakage diagnostic:
|
||||
warning: this function call uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled in the caller
|
||||
--> $DIR/simd-abi-checks.rs:64:11
|
||||
--> $DIR/simd-abi-checks-avx.rs:64:11
|
||||
|
|
||||
LL | f(g());
|
||||
| ^^^ function called here
|
||||
|
@ -125,7 +125,7 @@ LL | f(g());
|
|||
|
||||
Future breakage diagnostic:
|
||||
warning: this function call uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled in the caller
|
||||
--> $DIR/simd-abi-checks.rs:64:9
|
||||
--> $DIR/simd-abi-checks-avx.rs:64:9
|
||||
|
|
||||
LL | f(g());
|
||||
| ^^^^^^ function called here
|
||||
|
@ -137,7 +137,7 @@ LL | f(g());
|
|||
|
||||
Future breakage diagnostic:
|
||||
warning: this function call uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled in the caller
|
||||
--> $DIR/simd-abi-checks.rs:72:14
|
||||
--> $DIR/simd-abi-checks-avx.rs:72:14
|
||||
|
|
||||
LL | gavx(favx());
|
||||
| ^^^^^^ function called here
|
||||
|
@ -149,7 +149,7 @@ LL | gavx(favx());
|
|||
|
||||
Future breakage diagnostic:
|
||||
warning: this function call uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled in the caller
|
||||
--> $DIR/simd-abi-checks.rs:72:9
|
||||
--> $DIR/simd-abi-checks-avx.rs:72:9
|
||||
|
|
||||
LL | gavx(favx());
|
||||
| ^^^^^^^^^^^^ function called here
|
||||
|
@ -161,7 +161,7 @@ LL | gavx(favx());
|
|||
|
||||
Future breakage diagnostic:
|
||||
warning: this function call uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled in the caller
|
||||
--> $DIR/simd-abi-checks.rs:84:19
|
||||
--> $DIR/simd-abi-checks-avx.rs:84:19
|
||||
|
|
||||
LL | w(Wrapper(g()));
|
||||
| ^^^ function called here
|
||||
|
@ -173,7 +173,7 @@ LL | w(Wrapper(g()));
|
|||
|
||||
Future breakage diagnostic:
|
||||
warning: this function call uses SIMD vector type `Wrapper` which (with the chosen ABI) requires the `avx` target feature, which is not enabled in the caller
|
||||
--> $DIR/simd-abi-checks.rs:84:9
|
||||
--> $DIR/simd-abi-checks-avx.rs:84:9
|
||||
|
|
||||
LL | w(Wrapper(g()));
|
||||
| ^^^^^^^^^^^^^^^ function called here
|
||||
|
@ -185,7 +185,7 @@ LL | w(Wrapper(g()));
|
|||
|
||||
Future breakage diagnostic:
|
||||
warning: this function call uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled in the caller
|
||||
--> $DIR/simd-abi-checks.rs:100:9
|
||||
--> $DIR/simd-abi-checks-avx.rs:100:9
|
||||
|
|
||||
LL | some_extern();
|
||||
| ^^^^^^^^^^^^^ function called here
|
||||
|
@ -197,7 +197,7 @@ LL | some_extern();
|
|||
|
||||
Future breakage diagnostic:
|
||||
warning: this function definition uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled
|
||||
--> $DIR/simd-abi-checks.rs:27:1
|
||||
--> $DIR/simd-abi-checks-avx.rs:27:1
|
||||
|
|
||||
LL | unsafe extern "C" fn g() -> __m256 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
|
||||
|
@ -209,7 +209,7 @@ LL | unsafe extern "C" fn g() -> __m256 {
|
|||
|
||||
Future breakage diagnostic:
|
||||
warning: this function definition uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled
|
||||
--> $DIR/simd-abi-checks.rs:21:1
|
||||
--> $DIR/simd-abi-checks-avx.rs:21:1
|
||||
|
|
||||
LL | unsafe extern "C" fn f(_: __m256) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
|
||||
|
@ -221,7 +221,7 @@ LL | unsafe extern "C" fn f(_: __m256) {
|
|||
|
||||
Future breakage diagnostic:
|
||||
warning: this function definition uses SIMD vector type `Wrapper` which (with the chosen ABI) requires the `avx` target feature, which is not enabled
|
||||
--> $DIR/simd-abi-checks.rs:15:1
|
||||
--> $DIR/simd-abi-checks-avx.rs:15:1
|
||||
|
|
||||
LL | unsafe extern "C" fn w(_: Wrapper) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
|
||||
|
@ -233,7 +233,7 @@ LL | unsafe extern "C" fn w(_: Wrapper) {
|
|||
|
||||
Future breakage diagnostic:
|
||||
warning: this function call uses SIMD vector type `std::arch::x86_64::__m256` which (with the chosen ABI) requires the `avx` target feature, which is not enabled in the caller
|
||||
--> $DIR/simd-abi-checks.rs:57:8
|
||||
--> $DIR/simd-abi-checks-avx.rs:57:8
|
||||
|
|
||||
LL | || g()
|
||||
| ^^^ function called here
|
|
@ -1,5 +1,5 @@
|
|||
warning: this function definition uses SIMD vector type `SseVector` which (with the chosen ABI) requires the `sse` target feature, which is not enabled
|
||||
--> $DIR/sse-simd-abi-checks.rs:20:1
|
||||
--> $DIR/simd-abi-checks-sse.rs:20:1
|
||||
|
|
||||
LL | pub unsafe extern "C" fn f(_: SseVector) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
|
||||
|
@ -13,7 +13,7 @@ warning: 1 warning emitted
|
|||
|
||||
Future incompatibility report: Future breakage diagnostic:
|
||||
warning: this function definition uses SIMD vector type `SseVector` which (with the chosen ABI) requires the `sse` target feature, which is not enabled
|
||||
--> $DIR/sse-simd-abi-checks.rs:20:1
|
||||
--> $DIR/simd-abi-checks-sse.rs:20:1
|
||||
|
|
||||
LL | pub unsafe extern "C" fn f(_: SseVector) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
|
21
tests/ui/abi/vectorcall-abi-checks.rs
Normal file
21
tests/ui/abi/vectorcall-abi-checks.rs
Normal file
|
@ -0,0 +1,21 @@
|
|||
//@ add-core-stubs
|
||||
//@ compile-flags: --crate-type=rlib --target=i586-unknown-linux-gnu -C target-feature=-sse,-sse2
|
||||
//@ build-fail
|
||||
//@ ignore-pass (test emits codegen-time errors)
|
||||
//@ needs-llvm-components: x86
|
||||
#![feature(no_core, abi_vectorcall)]
|
||||
#![no_core]
|
||||
|
||||
extern crate minicore;
|
||||
use minicore::*;
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "vectorcall" fn f() {
|
||||
//~^ ABI "vectorcall" which requires the `sse2` target feature
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn call_site() {
|
||||
f();
|
||||
//~^ ABI "vectorcall" which requires the `sse2` target feature
|
||||
}
|
18
tests/ui/abi/vectorcall-abi-checks.stderr
Normal file
18
tests/ui/abi/vectorcall-abi-checks.stderr
Normal file
|
@ -0,0 +1,18 @@
|
|||
error: this function definition uses ABI "vectorcall" which requires the `sse2` target feature, which is not enabled
|
||||
--> $DIR/vectorcall-abi-checks.rs:13:1
|
||||
|
|
||||
LL | pub extern "vectorcall" fn f() {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
|
||||
|
|
||||
= help: consider enabling it globally (`-C target-feature=+sse2`) or locally (`#[target_feature(enable="sse2")]`)
|
||||
|
||||
error: this function call uses ABI "vectorcall" which requires the `sse2` target feature, which is not enabled in the caller
|
||||
--> $DIR/vectorcall-abi-checks.rs:19:5
|
||||
|
|
||||
LL | f();
|
||||
| ^^^ function called here
|
||||
|
|
||||
= help: consider enabling it globally (`-C target-feature=+sse2`) or locally (`#[target_feature(enable="sse2")]`)
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
1
tests/ui/extern/extern-vectorcall.rs
vendored
1
tests/ui/extern/extern-vectorcall.rs
vendored
|
@ -2,6 +2,7 @@
|
|||
//@ revisions: x64 x32
|
||||
//@ [x64]only-x86_64
|
||||
//@ [x32]only-x86
|
||||
//@ [x32]compile-flags: -Ctarget-feature=+sse2
|
||||
|
||||
#![feature(abi_vectorcall)]
|
||||
|
||||
|
|
|
@ -1,23 +0,0 @@
|
|||
//! Ensure we trigger abi_unsupported_vector_types for target features that are usually enabled
|
||||
//! on a target via the base CPU, but disabled in this file via a `-C` flag.
|
||||
//@ compile-flags: --crate-type=rlib --target=i586-unknown-linux-gnu
|
||||
//@ compile-flags: -Ctarget-cpu=pentium4 -C target-feature=-sse,-sse2
|
||||
//@ add-core-stubs
|
||||
//@ build-pass
|
||||
//@ ignore-pass (test emits codegen-time warnings)
|
||||
//@ needs-llvm-components: x86
|
||||
#![feature(no_core, repr_simd)]
|
||||
#![no_core]
|
||||
#![allow(improper_ctypes_definitions)]
|
||||
|
||||
extern crate minicore;
|
||||
use minicore::*;
|
||||
|
||||
#[repr(simd)]
|
||||
pub struct SseVector([i64; 2]);
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn f(_: SseVector) {
|
||||
//~^ this function definition uses SIMD vector type `SseVector` which (with the chosen ABI) requires the `sse` target feature, which is not enabled
|
||||
//~| WARNING this was previously accepted by the compiler
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
warning: this function definition uses SIMD vector type `SseVector` which (with the chosen ABI) requires the `sse` target feature, which is not enabled
|
||||
--> $DIR/sse-simd-abi-checks.rs:20:1
|
||||
|
|
||||
LL | pub unsafe extern "C" fn f(_: SseVector) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
|
||||
|
|
||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||
= note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
|
||||
= help: consider enabling it globally (`-C target-feature=+sse`) or locally (`#[target_feature(enable="sse")]`)
|
||||
= note: `#[warn(abi_unsupported_vector_types)]` on by default
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
||||
Future incompatibility report: Future breakage diagnostic:
|
||||
warning: this function definition uses SIMD vector type `SseVector` which (with the chosen ABI) requires the `sse` target feature, which is not enabled
|
||||
--> $DIR/sse-simd-abi-checks.rs:20:1
|
||||
|
|
||||
LL | pub unsafe extern "C" fn f(_: SseVector) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
|
||||
|
|
||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||
= note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
|
||||
= help: consider enabling it globally (`-C target-feature=+sse`) or locally (`#[target_feature(enable="sse")]`)
|
||||
= note: `#[warn(abi_unsupported_vector_types)]` on by default
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue