@@ -291,26 +291,34 @@ pub(crate) fn to_llvm_features<'a>(sess: &Session, s: &'a str) -> Option<LLVMFea
291291pub ( crate ) fn target_config ( sess : & Session ) -> TargetConfig {
292292 let target_machine = create_informational_target_machine ( sess, true ) ;
293293
294- let ( unstable_target_features, target_features) = cfg_target_feature ( sess, |feature| {
295- // This closure determines whether the target CPU has the feature according to LLVM. We do
296- // *not* consider the `-Ctarget-feature`s here, as that will be handled later in
297- // `cfg_target_feature`.
298- if let Some ( feat) = to_llvm_features ( sess, feature) {
299- // All the LLVM features this expands to must be enabled.
300- for llvm_feature in feat {
301- let cstr = SmallCStr :: new ( llvm_feature) ;
302- // `LLVMRustHasFeature` is moderately expensive. On targets with many
303- // features (e.g. x86) these calls take a non-trivial fraction of runtime
304- // when compiling very small programs.
305- if !unsafe { llvm:: LLVMRustHasFeature ( target_machine. raw ( ) , cstr. as_ptr ( ) ) } {
306- return false ;
294+ let ( unstable_target_features, target_features) = cfg_target_feature (
295+ sess,
296+ |feature| {
297+ to_llvm_features ( sess, feature)
298+ . map ( |f| SmallVec :: < [ & str ; 2 ] > :: from_iter ( f. into_iter ( ) ) )
299+ . unwrap_or_default ( )
300+ } ,
301+ |feature| {
302+ // This closure determines whether the target CPU has the feature according to LLVM. We do
303+ // *not* consider the `-Ctarget-feature`s here, as that will be handled later in
304+ // `cfg_target_feature`.
305+ if let Some ( feat) = to_llvm_features ( sess, feature) {
306+ // All the LLVM features this expands to must be enabled.
307+ for llvm_feature in feat {
308+ let cstr = SmallCStr :: new ( llvm_feature) ;
309+ // `LLVMRustHasFeature` is moderately expensive. On targets with many
310+ // features (e.g. x86) these calls take a non-trivial fraction of runtime
311+ // when compiling very small programs.
312+ if !unsafe { llvm:: LLVMRustHasFeature ( target_machine. raw ( ) , cstr. as_ptr ( ) ) } {
313+ return false ;
314+ }
307315 }
316+ true
317+ } else {
318+ false
308319 }
309- true
310- } else {
311- false
312- }
313- } ) ;
320+ } ,
321+ ) ;
314322
315323 let mut cfg = TargetConfig {
316324 target_features,
@@ -615,11 +623,7 @@ fn llvm_features_by_flags(sess: &Session, features: &mut Vec<String>) {
615623
616624/// The list of LLVM features computed from CLI flags (`-Ctarget-cpu`, `-Ctarget-feature`,
617625/// `--target` and similar).
618- pub ( crate ) fn global_llvm_features (
619- sess : & Session ,
620- diagnostics : bool ,
621- only_base_features : bool ,
622- ) -> Vec < String > {
626+ pub ( crate ) fn global_llvm_features ( sess : & Session , only_base_features : bool ) -> Vec < String > {
623627 // Features that come earlier are overridden by conflicting features later in the string.
624628 // Typically we'll want more explicit settings to override the implicit ones, so:
625629 //
@@ -679,39 +683,27 @@ pub(crate) fn global_llvm_features(
679683
680684 // -Ctarget-features
681685 if !only_base_features {
682- target_features:: flag_to_backend_features (
683- sess,
684- diagnostics,
685- |feature| {
686- to_llvm_features ( sess, feature)
687- . map ( |f| SmallVec :: < [ & str ; 2 ] > :: from_iter ( f. into_iter ( ) ) )
688- . unwrap_or_default ( )
689- } ,
690- |feature, enable| {
691- let enable_disable = if enable { '+' } else { '-' } ;
692- // We run through `to_llvm_features` when
693- // passing requests down to LLVM. This means that all in-language
694- // features also work on the command line instead of having two
695- // different names when the LLVM name and the Rust name differ.
696- let Some ( llvm_feature) = to_llvm_features ( sess, feature) else { return } ;
697-
698- features. extend (
699- std:: iter:: once ( format ! (
700- "{}{}" ,
701- enable_disable, llvm_feature. llvm_feature_name
702- ) )
703- . chain ( llvm_feature. dependencies . into_iter ( ) . filter_map (
704- move |feat| match ( enable, feat) {
686+ target_features:: flag_to_backend_features ( sess, |feature, enable| {
687+ let enable_disable = if enable { '+' } else { '-' } ;
688+ // We run through `to_llvm_features` when
689+ // passing requests down to LLVM. This means that all in-language
690+ // features also work on the command line instead of having two
691+ // different names when the LLVM name and the Rust name differ.
692+ let Some ( llvm_feature) = to_llvm_features ( sess, feature) else { return } ;
693+
694+ features. extend (
695+ std:: iter:: once ( format ! ( "{}{}" , enable_disable, llvm_feature. llvm_feature_name) )
696+ . chain ( llvm_feature. dependencies . into_iter ( ) . filter_map ( move |feat| {
697+ match ( enable, feat) {
705698 ( _, TargetFeatureFoldStrength :: Both ( f) )
706699 | ( true , TargetFeatureFoldStrength :: EnableOnly ( f) ) => {
707700 Some ( format ! ( "{enable_disable}{f}" ) )
708701 }
709702 _ => None ,
710- } ,
711- ) ) ,
712- )
713- } ,
714- ) ;
703+ }
704+ } ) ) ,
705+ )
706+ } ) ;
715707 }
716708
717709 // We add this in the "base target" so that these show up in `sess.unstable_target_features`.
0 commit comments