File tree 2 files changed +40
-6
lines changed
2 files changed +40
-6
lines changed Original file line number Diff line number Diff line change @@ -946,16 +946,48 @@ impl<'tcx> Machine<'tcx> for MiriMachine<'tcx> {
946
946
ecx. machine . validation == ValidationMode :: Deep
947
947
}
948
948
949
- #[ inline( always) ]
950
- fn enforce_abi ( _ecx : & MiriInterpCx < ' tcx > ) -> bool {
951
- true
952
- }
953
-
954
949
#[ inline( always) ]
955
950
fn ignore_optional_overflow_checks ( ecx : & MiriInterpCx < ' tcx > ) -> bool {
956
951
!ecx. tcx . sess . overflow_checks ( )
957
952
}
958
953
954
+ fn check_fn_target_features (
955
+ ecx : & MiriInterpCx < ' tcx > ,
956
+ instance : ty:: Instance < ' tcx > ,
957
+ ) -> InterpResult < ' tcx > {
958
+ let attrs = ecx. tcx . codegen_fn_attrs ( instance. def_id ( ) ) ;
959
+ if attrs
960
+ . target_features
961
+ . iter ( )
962
+ . any ( |feature| !ecx. tcx . sess . target_features . contains ( & feature. name ) )
963
+ {
964
+ let unavailable = attrs
965
+ . target_features
966
+ . iter ( )
967
+ . filter ( |& feature| {
968
+ !feature. implied && !ecx. tcx . sess . target_features . contains ( & feature. name )
969
+ } )
970
+ . fold ( String :: new ( ) , |mut s, feature| {
971
+ if !s. is_empty ( ) {
972
+ s. push_str ( ", " ) ;
973
+ }
974
+ s. push_str ( feature. name . as_str ( ) ) ;
975
+ s
976
+ } ) ;
977
+ let msg = format ! (
978
+ "calling a function that requires unavailable target features: {unavailable}"
979
+ ) ;
980
+ // On WASM, this is not UB, but instead gets rejected during validation of the module
981
+ // (see #84988).
982
+ if ecx. tcx . sess . target . is_like_wasm {
983
+ throw_machine_stop ! ( TerminationInfo :: Abort ( msg) ) ;
984
+ } else {
985
+ throw_ub_format ! ( "{msg}" ) ;
986
+ }
987
+ }
988
+ Ok ( ( ) )
989
+ }
990
+
959
991
#[ inline( always) ]
960
992
fn find_mir_or_eval_fn (
961
993
ecx : & mut MiriInterpCx < ' tcx > ,
Original file line number Diff line number Diff line change 2
2
//@compile-flags: -C target-feature=-simd128
3
3
4
4
fn main ( ) {
5
- // Calling functions with `#[target_feature]` is not unsound on WASM, see #84988
5
+ // Calling functions with `#[target_feature]` is not unsound on WASM, see #84988.
6
+ // But if the compiler actually uses the target feature, it will lead to an error when the module is loaded.
7
+ // We emulate this with an "unsupported" error.
6
8
assert ! ( !cfg!( target_feature = "simd128" ) ) ;
7
9
simd128_fn ( ) ;
8
10
}
You can’t perform that action at this time.
0 commit comments