Skip to content

Commit

Permalink
rustbuild: Compile rustc with ThinLTO
Browse files Browse the repository at this point in the history
This commit enables ThinLTO for the compiler as well as multiple codegen units.
This is intended to get the benefits of parallel codegen while also avoiding
any major loss of perf. Finally this commit is also intended as further testing
for rust-lang#45320 and shaking out bugs.
  • Loading branch information
alexcrichton committed Oct 20, 2017
1 parent 95272a0 commit 1af1c2d
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 6 deletions.
3 changes: 3 additions & 0 deletions src/bootstrap/bin/rustc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,9 @@ fn main() {
if let Ok(s) = env::var("RUSTC_CODEGEN_UNITS") {
cmd.arg("-C").arg(format!("codegen-units={}", s));
}
if stage != "0" && env::var("RUSTC_THINLTO").is_ok() {
cmd.arg("-Ccodegen-units=16").arg("-Zthinlto");
}

// Emit save-analysis info.
if env::var("RUSTC_SAVE_ANALYSIS") == Ok("api".to_string()) {
Expand Down
14 changes: 12 additions & 2 deletions src/bootstrap/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -471,8 +471,6 @@ impl<'a> Builder<'a> {
.env("RUSTC", self.out.join("bootstrap/debug/rustc"))
.env("RUSTC_REAL", self.rustc(compiler))
.env("RUSTC_STAGE", stage.to_string())
.env("RUSTC_CODEGEN_UNITS",
self.config.rust_codegen_units.to_string())
.env("RUSTC_DEBUG_ASSERTIONS",
self.config.rust_debug_assertions.to_string())
.env("RUSTC_SYSROOT", self.sysroot(compiler))
Expand All @@ -486,6 +484,10 @@ impl<'a> Builder<'a> {
})
.env("TEST_MIRI", self.config.test_miri.to_string());

if let Some(n) = self.config.rust_codegen_units {
cargo.env("RUSTC_CODEGEN_UNITS", n.to_string());
}

if let Some(host_linker) = self.build.linker(compiler.host) {
cargo.env("RUSTC_HOST_LINKER", host_linker);
}
Expand Down Expand Up @@ -618,6 +620,14 @@ impl<'a> Builder<'a> {
// FIXME: cargo bench does not accept `--release`
if self.config.rust_optimize && cmd != "bench" {
cargo.arg("--release");

if mode != Mode::Libstd &&
self.config.rust_codegen_units.is_none() &&
self.build.is_rust_llvm(compiler.host)

{
cargo.env("RUSTC_THINLTO", "1");
}
}
if self.config.locked_deps {
cargo.arg("--locked");
Expand Down
7 changes: 3 additions & 4 deletions src/bootstrap/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ pub struct Config {

// rust codegen options
pub rust_optimize: bool,
pub rust_codegen_units: u32,
pub rust_codegen_units: Option<u32>,
pub rust_debug_assertions: bool,
pub rust_debuginfo: bool,
pub rust_debuginfo_lines: bool,
Expand Down Expand Up @@ -307,7 +307,6 @@ impl Config {
config.submodules = true;
config.docs = true;
config.rust_rpath = true;
config.rust_codegen_units = 1;
config.channel = "dev".to_string();
config.codegen_tests = true;
config.ignore_git = false;
Expand Down Expand Up @@ -470,8 +469,8 @@ impl Config {
config.musl_root = rust.musl_root.clone().map(PathBuf::from);

match rust.codegen_units {
Some(0) => config.rust_codegen_units = num_cpus::get() as u32,
Some(n) => config.rust_codegen_units = n,
Some(0) => config.rust_codegen_units = Some(num_cpus::get() as u32),
Some(n) => config.rust_codegen_units = Some(n),
None => {}
}
}
Expand Down

0 comments on commit 1af1c2d

Please sign in to comment.