From cacf9f98db25a9467a1e925046838f7e04930550 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Mon, 2 Oct 2023 18:29:49 +0200 Subject: [PATCH] add test for a function ABI mismatch due to target features --- .../simd_feature_flag_difference.rs | 30 +++++++++++++++++++ .../simd_feature_flag_difference.stderr | 20 +++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 tests/fail/function_calls/simd_feature_flag_difference.rs create mode 100644 tests/fail/function_calls/simd_feature_flag_difference.stderr diff --git a/tests/fail/function_calls/simd_feature_flag_difference.rs b/tests/fail/function_calls/simd_feature_flag_difference.rs new file mode 100644 index 0000000000..e98a3abadf --- /dev/null +++ b/tests/fail/function_calls/simd_feature_flag_difference.rs @@ -0,0 +1,30 @@ +//@only-target-x86_64 +#![allow(improper_ctypes_definitions)] +use std::arch::x86_64::*; +use std::mem::transmute; + +#[no_mangle] +#[target_feature(enable = "avx")] +pub unsafe extern "C" fn foo(_y: f32, x: __m256) -> __m256 { + x +} + +pub fn bar(x: __m256) -> __m256 { + // The first and second argument get mixed up here since caller + // and callee do not have the same feature flags. + // In Miri, we don't have a concept of "dynamically available feature flags", + // so this will always lead to an error due to calling a function that requires + // an unavailable feature. If we ever support dynamically available features, + // this will need some dedicated checks. + unsafe { foo(0.0, x) } //~ERROR: unavailable target features +} + +fn assert_eq_m256(a: __m256, b: __m256) { + unsafe { assert_eq!(transmute::<_, [f32; 8]>(a), transmute::<_, [f32; 8]>(b)) } +} + +fn main() { + let input = unsafe { transmute::<_, __m256>([1.0f32; 8]) }; + let copy = bar(input); + assert_eq_m256(input, copy); +} diff --git a/tests/fail/function_calls/simd_feature_flag_difference.stderr b/tests/fail/function_calls/simd_feature_flag_difference.stderr new file mode 100644 index 0000000000..ab3ff5fcdc --- /dev/null +++ b/tests/fail/function_calls/simd_feature_flag_difference.stderr @@ -0,0 +1,20 @@ +error: Undefined Behavior: calling a function that requires unavailable target features: avx + --> $DIR/simd_feature_flag_difference.rs:LL:CC + | +LL | unsafe { foo(0.0, x) } + | ^^^^^^^^^^^ calling a function that requires unavailable target features: avx + | + = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior + = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information + = note: BACKTRACE: + = note: inside `bar` at $DIR/simd_feature_flag_difference.rs:LL:CC +note: inside `main` + --> $DIR/simd_feature_flag_difference.rs:LL:CC + | +LL | let copy = bar(input); + | ^^^^^^^^^^ + +note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace + +error: aborting due to previous error +