]> git.lizzy.rs Git - rust.git/commitdiff
Make target-cpu=native detect individual features
authorAndrew Sun <me@andrewsun.com>
Wed, 6 Jan 2021 08:23:54 +0000 (03:23 -0500)
committerAndrew Sun <me@andrewsun.com>
Wed, 6 Jan 2021 08:23:54 +0000 (03:23 -0500)
compiler/rustc_codegen_llvm/src/back/write.rs
compiler/rustc_codegen_llvm/src/lib.rs
compiler/rustc_codegen_llvm/src/llvm_util.rs

index 230e11f274eaebecd52c30dc8ce93231a6a1f1ef..68f319ade1e79b808f14ec6cb0166a3f68f7f7dd 100644 (file)
@@ -164,7 +164,8 @@ pub fn target_machine_factory(
 
     let code_model = to_llvm_code_model(sess.code_model());
 
-    let features = attributes::llvm_target_features(sess).collect::<Vec<_>>();
+    let mut features = llvm_util::handle_native_features(sess);
+    features.extend(attributes::llvm_target_features(sess).map(|s| s.to_owned()));
     let mut singlethread = sess.target.singlethread;
 
     // On the wasm target once the `atomics` feature is enabled that means that
index 92ac770aca554ed338b9c4b5056933884da0e8b1..502f3b44af1aaf0c336c87d482fe60ac8681fe02 100644 (file)
@@ -12,6 +12,7 @@
 #![feature(in_band_lifetimes)]
 #![feature(nll)]
 #![feature(or_patterns)]
+#![feature(stdsimd)]
 #![recursion_limit = "256"]
 
 use back::write::{create_informational_target_machine, create_target_machine};
index a3139ce5a345543984b8f89520139fbf6d4a75ff..2da06e6babe71bf7b1898e291ade71a75e4b1b0c 100644 (file)
@@ -10,6 +10,7 @@
 use rustc_target::spec::{MergeFunctions, PanicStrategy};
 use std::ffi::CString;
 
+use std::detect;
 use std::slice;
 use std::str;
 use std::sync::atomic::{AtomicBool, Ordering};
@@ -221,6 +222,25 @@ pub fn target_cpu(sess: &Session) -> &str {
     handle_native(name)
 }
 
+pub fn handle_native_features(sess: &Session) -> Vec<String> {
+    const LLVM_NOT_RECOGNIZED: &[&str] = &["tsc"];
+
+    match sess.opts.cg.target_cpu {
+        Some(ref s) => {
+            if s != "native" {
+                return vec![];
+            }
+
+            detect::features()
+                .map(|(feature, support)| (to_llvm_feature(sess, feature), support))
+                .filter(|(feature, _)| !LLVM_NOT_RECOGNIZED.contains(feature))
+                .map(|(feature, support)| (if support { "+" } else { "-" }).to_owned() + feature)
+                .collect()
+        }
+        None => vec![],
+    }
+}
+
 pub fn tune_cpu(sess: &Session) -> Option<&str> {
     match sess.opts.debugging_opts.tune_cpu {
         Some(ref s) => Some(handle_native(&**s)),