Rollup merge of #118378 - cormacrelf:bugfix/linker-plugin-lto-wasm, r=petrochenkov
Perform LTO optimisations with wasm-ld + -Clinker-plugin-lto Fixes (partially) #60059. Technically, `--target wasm32-unknown-unknown -Clinker-plugin-lto` would complete without errors before, but it was not producing optimized code. At least, it may have been but it was probably not the opt-level people intended. Similarly to #118377, this could benefit from a warning about using an explicit libLTO path with LLD, which will ignore it and use its internal LLVM. Especially given we always use lld on wasm targets. I left the code open to that possibility rather than making it perfectly neat.
This commit is contained in:
commit
3e202ead60
@ -1308,6 +1308,8 @@ fn no_gc_sections(&mut self) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn optimize(&mut self) {
|
fn optimize(&mut self) {
|
||||||
|
// The -O flag is, as of late 2023, only used for merging of strings and debuginfo, and
|
||||||
|
// only differentiates -O0 and -O1. It does not apply to LTO.
|
||||||
self.cmd.arg(match self.sess.opts.optimize {
|
self.cmd.arg(match self.sess.opts.optimize {
|
||||||
OptLevel::No => "-O0",
|
OptLevel::No => "-O0",
|
||||||
OptLevel::Less => "-O1",
|
OptLevel::Less => "-O1",
|
||||||
@ -1360,7 +1362,31 @@ fn export_symbols(&mut self, _tmpdir: &Path, _crate_type: CrateType, symbols: &[
|
|||||||
fn subsystem(&mut self, _subsystem: &str) {}
|
fn subsystem(&mut self, _subsystem: &str) {}
|
||||||
|
|
||||||
fn linker_plugin_lto(&mut self) {
|
fn linker_plugin_lto(&mut self) {
|
||||||
// Do nothing for now
|
match self.sess.opts.cg.linker_plugin_lto {
|
||||||
|
LinkerPluginLto::Disabled => {
|
||||||
|
// Nothing to do
|
||||||
|
}
|
||||||
|
LinkerPluginLto::LinkerPluginAuto => {
|
||||||
|
self.push_linker_plugin_lto_args();
|
||||||
|
}
|
||||||
|
LinkerPluginLto::LinkerPlugin(_) => {
|
||||||
|
self.push_linker_plugin_lto_args();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> WasmLd<'a> {
|
||||||
|
fn push_linker_plugin_lto_args(&mut self) {
|
||||||
|
let opt_level = match self.sess.opts.optimize {
|
||||||
|
config::OptLevel::No => "O0",
|
||||||
|
config::OptLevel::Less => "O1",
|
||||||
|
config::OptLevel::Default => "O2",
|
||||||
|
config::OptLevel::Aggressive => "O3",
|
||||||
|
// wasm-ld only handles integer LTO opt levels. Use O2
|
||||||
|
config::OptLevel::Size | config::OptLevel::SizeMin => "O2",
|
||||||
|
};
|
||||||
|
self.cmd.arg(&format!("--lto-{opt_level}"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user