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
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};
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)),