1
1
use crate :: back:: write:: create_informational_target_machine;
2
2
use crate :: errors:: {
3
- PossibleFeature , TargetFeatureDisableOrEnable , UnknownCTargetFeature ,
4
- UnknownCTargetFeaturePrefix , UnstableCTargetFeature ,
3
+ InvalidTargetFeaturePrefix , PossibleFeature , TargetFeatureDisableOrEnable ,
4
+ UnknownCTargetFeature , UnknownCTargetFeaturePrefix , UnstableCTargetFeature ,
5
5
} ;
6
6
use crate :: llvm;
7
7
use libc:: c_int;
@@ -511,7 +511,7 @@ pub(crate) fn global_llvm_features(sess: &Session, diagnostics: bool) -> Vec<Str
511
511
sess. target
512
512
. features
513
513
. split ( ',' )
514
- . filter ( |v| !v. is_empty ( ) && backend_feature_name ( v) . is_some ( ) )
514
+ . filter ( |v| !v. is_empty ( ) && backend_feature_name ( sess , v) . is_some ( ) )
515
515
. map ( String :: from) ,
516
516
) ;
517
517
@@ -535,7 +535,7 @@ pub(crate) fn global_llvm_features(sess: &Session, diagnostics: bool) -> Vec<Str
535
535
}
536
536
} ;
537
537
538
- let feature = backend_feature_name ( s) ?;
538
+ let feature = backend_feature_name ( sess , s) ?;
539
539
// Warn against use of LLVM specific feature names and unstable features on the CLI.
540
540
if diagnostics {
541
541
let feature_state = supported_features. iter ( ) . find ( |& & ( v, _) | v == feature) ;
@@ -611,11 +611,11 @@ pub(crate) fn global_llvm_features(sess: &Session, diagnostics: bool) -> Vec<Str
611
611
/// Returns a feature name for the given `+feature` or `-feature` string.
612
612
///
613
613
/// Only allows features that are backend specific (i.e. not [`RUSTC_SPECIFIC_FEATURES`].)
614
- fn backend_feature_name ( s : & str ) -> Option < & str > {
614
+ fn backend_feature_name < ' a > ( sess : & Session , s : & ' a str ) -> Option < & ' a str > {
615
615
// features must start with a `+` or `-`.
616
- let feature = s. strip_prefix ( & [ '+' , '-' ] [ .. ] ) . unwrap_or_else ( || {
617
- bug ! ( "target feature `{}` must begin with a `+` or `-`" , s ) ;
618
- } ) ;
616
+ let feature = s
617
+ . strip_prefix ( & [ '+' , '-' ] [ .. ] )
618
+ . unwrap_or_else ( || sess . dcx ( ) . emit_fatal ( InvalidTargetFeaturePrefix { feature : s } ) ) ;
619
619
// Rustc-specific feature requests like `+crt-static` or `-crt-static`
620
620
// are not passed down to LLVM.
621
621
if RUSTC_SPECIFIC_FEATURES . contains ( & feature) {
0 commit comments