diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index f831b006642bb..c349def865af6 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -98,6 +98,7 @@ pub enum Lto { #[derive(Clone, PartialEq, Hash)] pub enum CrossLangLto { LinkerPlugin(PathBuf), + LinkerPluginAuto, NoLink, Disabled } @@ -106,6 +107,7 @@ impl CrossLangLto { pub fn embed_bitcode(&self) -> bool { match *self { CrossLangLto::LinkerPlugin(_) | + CrossLangLto::LinkerPluginAuto | CrossLangLto::NoLink => true, CrossLangLto::Disabled => false, } @@ -1020,7 +1022,7 @@ macro_rules! options { let mut bool_arg = None; if parse_opt_bool(&mut bool_arg, v) { *slot = if bool_arg.unwrap() { - CrossLangLto::NoLink + CrossLangLto::LinkerPluginAuto } else { CrossLangLto::Disabled }; diff --git a/src/librustc_codegen_llvm/back/linker.rs b/src/librustc_codegen_llvm/back/linker.rs index dd1983bdc1723..fffde30d5f60c 100644 --- a/src/librustc_codegen_llvm/back/linker.rs +++ b/src/librustc_codegen_llvm/back/linker.rs @@ -182,6 +182,38 @@ impl<'a> GccLinker<'a> { self.hinted_static = false; } } + + fn push_cross_lang_lto_args(&mut self, plugin_path: Option<&OsStr>) { + if let Some(plugin_path) = plugin_path { + let mut arg = OsString::from("-plugin="); + arg.push(plugin_path); + self.linker_arg(&arg); + } + + let opt_level = match self.sess.opts.optimize { + config::OptLevel::No => "O0", + config::OptLevel::Less => "O1", + config::OptLevel::Default => "O2", + config::OptLevel::Aggressive => "O3", + config::OptLevel::Size => "Os", + config::OptLevel::SizeMin => "Oz", + }; + + self.linker_arg(&format!("-plugin-opt={}", opt_level)); + self.linker_arg(&format!("-plugin-opt=mcpu={}", self.sess.target_cpu())); + + match self.sess.opts.cg.lto { + config::Lto::Thin | + config::Lto::ThinLocal => { + self.linker_arg(&format!("-plugin-opt=thin")); + } + config::Lto::Fat | + config::Lto::Yes | + config::Lto::No => { + // default to regular LTO + } + } + } } impl<'a> Linker for GccLinker<'a> { @@ -443,32 +475,11 @@ impl<'a> Linker for GccLinker<'a> { CrossLangLto::NoLink => { // Nothing to do } + CrossLangLto::LinkerPluginAuto => { + self.push_cross_lang_lto_args(None); + } CrossLangLto::LinkerPlugin(ref path) => { - self.linker_arg(&format!("-plugin={}", path.display())); - - let opt_level = match self.sess.opts.optimize { - config::OptLevel::No => "O0", - config::OptLevel::Less => "O1", - config::OptLevel::Default => "O2", - config::OptLevel::Aggressive => "O3", - config::OptLevel::Size => "Os", - config::OptLevel::SizeMin => "Oz", - }; - - self.linker_arg(&format!("-plugin-opt={}", opt_level)); - self.linker_arg(&format!("-plugin-opt=mcpu={}", self.sess.target_cpu())); - - match self.sess.opts.cg.lto { - config::Lto::Thin | - config::Lto::ThinLocal => { - self.linker_arg(&format!("-plugin-opt=thin")); - } - config::Lto::Fat | - config::Lto::Yes | - config::Lto::No => { - // default to regular LTO - } - } + self.push_cross_lang_lto_args(Some(path.as_os_str())); } } }