Pass tune-cpu to LLVM
I think this is how it should work...
This commit is contained in:
parent
285fc7d704
commit
a35a93f09c
9 changed files with 80 additions and 8 deletions
|
@ -194,6 +194,18 @@ pub fn apply_target_cpu_attr(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) {
|
|||
);
|
||||
}
|
||||
|
||||
pub fn apply_tune_cpu_attr(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) {
|
||||
if let Some(tune) = llvm_util::tune_cpu(cx.tcx.sess) {
|
||||
let tune_cpu = SmallCStr::new(tune);
|
||||
llvm::AddFunctionAttrStringValue(
|
||||
llfn,
|
||||
llvm::AttributePlace::Function,
|
||||
const_cstr!("tune-cpu"),
|
||||
tune_cpu.as_c_str(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// Sets the `NonLazyBind` LLVM attribute on a given function,
|
||||
/// assuming the codegen options allow skipping the PLT.
|
||||
pub fn non_lazy_bind(sess: &Session, llfn: &'ll Value) {
|
||||
|
@ -300,6 +312,9 @@ pub fn from_fn_attrs(cx: &CodegenCx<'ll, 'tcx>, llfn: &'ll Value, instance: ty::
|
|||
// Without this, ThinLTO won't inline Rust functions into Clang generated
|
||||
// functions (because Clang annotates functions this way too).
|
||||
apply_target_cpu_attr(cx, llfn);
|
||||
// tune-cpu is only conveyed through the attribute for our purpose.
|
||||
// The target doesn't care; the subtarget reads our attribute.
|
||||
apply_tune_cpu_attr(cx, llfn);
|
||||
|
||||
let features = llvm_target_features(cx.tcx.sess)
|
||||
.map(|s| s.to_string())
|
||||
|
|
|
@ -417,7 +417,8 @@ impl MiscMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
|||
}
|
||||
|
||||
fn apply_target_cpu_attr(&self, llfn: &'ll Value) {
|
||||
attributes::apply_target_cpu_attr(self, llfn)
|
||||
attributes::apply_target_cpu_attr(self, llfn);
|
||||
attributes::apply_tune_cpu_attr(self, llfn);
|
||||
}
|
||||
|
||||
fn create_used_variable(&self) {
|
||||
|
|
|
@ -116,6 +116,9 @@ impl ExtraBackendMethods for LlvmCodegenBackend {
|
|||
fn target_cpu<'b>(&self, sess: &'b Session) -> &'b str {
|
||||
llvm_util::target_cpu(sess)
|
||||
}
|
||||
fn tune_cpu<'b>(&self, sess: &'b Session) -> Option<&'b str> {
|
||||
llvm_util::tune_cpu(sess)
|
||||
}
|
||||
}
|
||||
|
||||
impl WriteBackendMethods for LlvmCodegenBackend {
|
||||
|
|
|
@ -351,11 +351,7 @@ pub(crate) fn print(req: PrintRequest, sess: &Session) {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn target_cpu(sess: &Session) -> &str {
|
||||
let name = match sess.opts.cg.target_cpu {
|
||||
Some(ref s) => &**s,
|
||||
None => &*sess.target.target.options.cpu,
|
||||
};
|
||||
fn handle_native(name: &str) -> &str {
|
||||
if name != "native" {
|
||||
return name;
|
||||
}
|
||||
|
@ -366,3 +362,19 @@ pub fn target_cpu(sess: &Session) -> &str {
|
|||
str::from_utf8(slice::from_raw_parts(ptr as *const u8, len)).unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn target_cpu(sess: &Session) -> &str {
|
||||
let name = match sess.opts.cg.target_cpu {
|
||||
Some(ref s) => &**s,
|
||||
None => &*sess.target.target.options.cpu,
|
||||
};
|
||||
|
||||
handle_native(name)
|
||||
}
|
||||
|
||||
pub fn tune_cpu(sess: &Session) -> Option<&str> {
|
||||
match sess.opts.debugging_opts.tune_cpu {
|
||||
Some(ref s) => Some(handle_native(&**s)),
|
||||
None => None,
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue