Rollup merge of #52019 - michaelwoerister:cross-lto-auto-plugin, r=alexcrichton
[cross-lang-lto] Allow the linker to choose the LTO-plugin (which is useful when using LLD) This PR allows for not specifying an LTO-linker plugin but still let `rustc` invoke the linker with the correct plugin arguments. This is useful when using LLD which does not need the `-plugin` argument. Since LLD is the best linker for this scenario anyway, this change should improve ergonomics quite a bit. r? @alexcrichton
This commit is contained in:
commit
ffc453abf7
@ -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
|
||||
};
|
||||
|
@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user