Skip to content

Commit 35b7994

Browse files
committed
Use collect to initialize features.
1 parent 936a823 commit 35b7994

File tree

1 file changed

+25
-28
lines changed

1 file changed

+25
-28
lines changed

compiler/rustc_codegen_llvm/src/llvm_util.rs

+25-28
Original file line numberDiff line numberDiff line change
@@ -307,8 +307,6 @@ pub(crate) fn to_llvm_features<'a>(sess: &Session, s: &'a str) -> Option<LLVMFea
307307
///
308308
/// We do not have to worry about RUSTC_SPECIFIC_FEATURES here, those are handled outside codegen.
309309
pub(crate) fn target_features_cfg(sess: &Session) -> (Vec<Symbol>, Vec<Symbol>) {
310-
let mut features: FxHashSet<Symbol> = Default::default();
311-
312310
// Add base features for the target.
313311
// We do *not* add the -Ctarget-features there, and instead duplicate the logic for that below.
314312
// The reason is that if LLVM considers a feature implied but we do not, we don't want that to
@@ -318,34 +316,33 @@ pub(crate) fn target_features_cfg(sess: &Session) -> (Vec<Symbol>, Vec<Symbol>)
318316
let target_machine = create_informational_target_machine(sess, true);
319317
// Compute which of the known target features are enabled in the 'base' target machine. We only
320318
// consider "supported" features; "forbidden" features are not reflected in `cfg` as of now.
321-
features.extend(
322-
sess.target
323-
.rust_target_features()
324-
.iter()
325-
.filter(|(feature, _, _)| {
326-
// skip checking special features, as LLVM may not understand them
327-
if RUSTC_SPECIAL_FEATURES.contains(feature) {
328-
return true;
329-
}
330-
// check that all features in a given smallvec are enabled
331-
if let Some(feat) = to_llvm_features(sess, feature) {
332-
for llvm_feature in feat {
333-
let cstr = SmallCStr::new(llvm_feature);
334-
// `LLVMRustHasFeature` is moderately expensive. On targets with many
335-
// features (e.g. x86) these calls take a non-trivial fraction of runtime
336-
// when compiling very small programs.
337-
if !unsafe { llvm::LLVMRustHasFeature(target_machine.raw(), cstr.as_ptr()) }
338-
{
339-
return false;
340-
}
319+
let mut features: FxHashSet<Symbol> = sess
320+
.target
321+
.rust_target_features()
322+
.iter()
323+
.filter(|(feature, _, _)| {
324+
// skip checking special features, as LLVM may not understand them
325+
if RUSTC_SPECIAL_FEATURES.contains(feature) {
326+
return true;
327+
}
328+
// check that all features in a given smallvec are enabled
329+
if let Some(feat) = to_llvm_features(sess, feature) {
330+
for llvm_feature in feat {
331+
let cstr = SmallCStr::new(llvm_feature);
332+
// `LLVMRustHasFeature` is moderately expensive. On targets with many
333+
// features (e.g. x86) these calls take a non-trivial fraction of runtime
334+
// when compiling very small programs.
335+
if !unsafe { llvm::LLVMRustHasFeature(target_machine.raw(), cstr.as_ptr()) } {
336+
return false;
341337
}
342-
true
343-
} else {
344-
false
345338
}
346-
})
347-
.map(|(feature, _, _)| Symbol::intern(feature)),
348-
);
339+
true
340+
} else {
341+
false
342+
}
343+
})
344+
.map(|(feature, _, _)| Symbol::intern(feature))
345+
.collect();
349346

350347
// Add enabled and remove disabled features.
351348
for (enabled, feature) in

0 commit comments

Comments
 (0)