about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNicholas Nethercote <n.nethercote@gmail.com>2025-02-25 15:25:54 +1100
committerNicholas Nethercote <n.nethercote@gmail.com>2025-03-05 09:49:17 +1100
commit157137a64aeba7fb6e6571bcc046c97d63d368a7 (patch)
tree4c786f189a2f70c80e2522aa62fe00d70a15f39d
parentee5bae8a12f87e994e0ad19ecc3e387aa69b8ec1 (diff)
downloadrust-157137a64aeba7fb6e6571bcc046c97d63d368a7.tar.gz
rust-157137a64aeba7fb6e6571bcc046c97d63d368a7.zip
Change signature of `target_features_cfg`.
Currently it is called twice, once with `allow_unstable` set to true and
once with it set to false. This results in some duplicated work. Most
notably, for the LLVM backend, `LLVMRustHasFeature` is called twice for
every feature, and it's moderately slow. For very short running
compilations on platforms with many features (e.g. a `check` build of
hello-world on x86) this is a significant fraction of runtime.

This commit changes `target_features_cfg` so it is only called once, and
it now returns a pair of feature sets. This halves the number of
`LLVMRustHasFeature` calls.
-rw-r--r--src/lib.rs13
1 files changed, 6 insertions, 7 deletions
diff --git a/src/lib.rs b/src/lib.rs
index a3f43744875..06939beb374 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -176,13 +176,9 @@ impl CodegenBackend for CraneliftCodegenBackend {
         }
     }
 
-    fn target_features_cfg(
-        &self,
-        sess: &Session,
-        _allow_unstable: bool,
-    ) -> Vec<rustc_span::Symbol> {
+    fn target_features_cfg(&self, sess: &Session) -> (Vec<Symbol>, Vec<Symbol>) {
         // FIXME return the actually used target features. this is necessary for #[cfg(target_feature)]
-        if sess.target.arch == "x86_64" && sess.target.os != "none" {
+        let target_features = if sess.target.arch == "x86_64" && sess.target.os != "none" {
             // x86_64 mandates SSE2 support and rustc requires the x87 feature to be enabled
             vec![sym::fsxr, sym::sse, sym::sse2, Symbol::intern("x87")]
         } else if sess.target.arch == "aarch64" {
@@ -196,7 +192,10 @@ impl CodegenBackend for CraneliftCodegenBackend {
             }
         } else {
             vec![]
-        }
+        };
+        // FIXME do `unstable_target_features` properly
+        let unstable_target_features = target_features.clone();
+        (target_features, unstable_target_features)
     }
 
     fn print_version(&self) {