Skip to content

Commit 65ff414

Browse files
Allow the linker to choose the LTO-plugin (which is useful when using LLD)
1 parent a53bd20 commit 65ff414

File tree

2 files changed

+39
-26
lines changed

2 files changed

+39
-26
lines changed

src/librustc/session/config.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ pub enum Lto {
9898
#[derive(Clone, PartialEq, Hash)]
9999
pub enum CrossLangLto {
100100
LinkerPlugin(PathBuf),
101+
LinkerPluginAuto,
101102
NoLink,
102103
Disabled
103104
}
@@ -106,6 +107,7 @@ impl CrossLangLto {
106107
pub fn embed_bitcode(&self) -> bool {
107108
match *self {
108109
CrossLangLto::LinkerPlugin(_) |
110+
CrossLangLto::LinkerPluginAuto |
109111
CrossLangLto::NoLink => true,
110112
CrossLangLto::Disabled => false,
111113
}
@@ -1020,7 +1022,7 @@ macro_rules! options {
10201022
let mut bool_arg = None;
10211023
if parse_opt_bool(&mut bool_arg, v) {
10221024
*slot = if bool_arg.unwrap() {
1023-
CrossLangLto::NoLink
1025+
CrossLangLto::LinkerPluginAuto
10241026
} else {
10251027
CrossLangLto::Disabled
10261028
};

src/librustc_codegen_llvm/back/linker.rs

+36-25
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,38 @@ impl<'a> GccLinker<'a> {
182182
self.hinted_static = false;
183183
}
184184
}
185+
186+
fn push_cross_lang_lto_args(&mut self, plugin_path: Option<&OsStr>) {
187+
if let Some(plugin_path) = plugin_path {
188+
let mut arg = OsString::from("-plugin=");
189+
arg.push(plugin_path);
190+
self.linker_arg(&arg);
191+
}
192+
193+
let opt_level = match self.sess.opts.optimize {
194+
config::OptLevel::No => "O0",
195+
config::OptLevel::Less => "O1",
196+
config::OptLevel::Default => "O2",
197+
config::OptLevel::Aggressive => "O3",
198+
config::OptLevel::Size => "Os",
199+
config::OptLevel::SizeMin => "Oz",
200+
};
201+
202+
self.linker_arg(&format!("-plugin-opt={}", opt_level));
203+
self.linker_arg(&format!("-plugin-opt=mcpu={}", self.sess.target_cpu()));
204+
205+
match self.sess.opts.cg.lto {
206+
config::Lto::Thin |
207+
config::Lto::ThinLocal => {
208+
self.linker_arg(&format!("-plugin-opt=thin"));
209+
}
210+
config::Lto::Fat |
211+
config::Lto::Yes |
212+
config::Lto::No => {
213+
// default to regular LTO
214+
}
215+
}
216+
}
185217
}
186218

187219
impl<'a> Linker for GccLinker<'a> {
@@ -443,32 +475,11 @@ impl<'a> Linker for GccLinker<'a> {
443475
CrossLangLto::NoLink => {
444476
// Nothing to do
445477
}
478+
CrossLangLto::LinkerPluginAuto => {
479+
self.push_cross_lang_lto_args(None);
480+
}
446481
CrossLangLto::LinkerPlugin(ref path) => {
447-
self.linker_arg(&format!("-plugin={}", path.display()));
448-
449-
let opt_level = match self.sess.opts.optimize {
450-
config::OptLevel::No => "O0",
451-
config::OptLevel::Less => "O1",
452-
config::OptLevel::Default => "O2",
453-
config::OptLevel::Aggressive => "O3",
454-
config::OptLevel::Size => "Os",
455-
config::OptLevel::SizeMin => "Oz",
456-
};
457-
458-
self.linker_arg(&format!("-plugin-opt={}", opt_level));
459-
self.linker_arg(&format!("-plugin-opt=mcpu={}", self.sess.target_cpu()));
460-
461-
match self.sess.opts.cg.lto {
462-
config::Lto::Thin |
463-
config::Lto::ThinLocal => {
464-
self.linker_arg(&format!("-plugin-opt=thin"));
465-
}
466-
config::Lto::Fat |
467-
config::Lto::Yes |
468-
config::Lto::No => {
469-
// default to regular LTO
470-
}
471-
}
482+
self.push_cross_lang_lto_args(Some(path.as_os_str()));
472483
}
473484
}
474485
}

0 commit comments

Comments
 (0)