Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion compiler/rustc_codegen_llvm/src/back/write.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions compiler/rustc_codegen_llvm/src/llvm/ffi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1708,6 +1708,10 @@ extern "C" {
PM: &PassManager<'_>,
);

pub fn LLVMGetHostCPUFeatures() -> *mut c_char;

pub fn LLVMDisposeMessage(message: *mut c_char);

// Stuff that's in llvm-wrapper/ because it's not upstream yet.

/// Opens an object file.
Expand Down
22 changes: 21 additions & 1 deletion compiler/rustc_codegen_llvm/src/llvm_util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use rustc_session::config::PrintRequest;
use rustc_session::Session;
use rustc_span::symbol::Symbol;
use rustc_target::spec::{MergeFunctions, PanicStrategy};
use std::ffi::CString;
use std::ffi::{CStr, CString};

use std::slice;
use std::str;
Expand Down Expand Up @@ -221,6 +221,26 @@ pub fn target_cpu(sess: &Session) -> &str {
handle_native(name)
}

pub fn handle_native_features(sess: &Session) -> Vec<String> {
match sess.opts.cg.target_cpu {
Some(ref s) => {
if s != "native" {
return vec![];
}

let ptr = unsafe { llvm::LLVMGetHostCPUFeatures() };
let str = unsafe { CStr::from_ptr(ptr).to_string_lossy() };

let features = str.split(",").map(|s| s.to_owned()).collect();

unsafe { llvm::LLVMDisposeMessage(ptr) };

features
}
None => vec![],
}
}

pub fn tune_cpu(sess: &Session) -> Option<&str> {
match sess.opts.debugging_opts.tune_cpu {
Some(ref s) => Some(handle_native(&**s)),
Expand Down