From 78fbcca3e10b6671ca54bd4c01cb84b3f6f13cf3 Mon Sep 17 00:00:00 2001 From: klensy Date: Tue, 8 Feb 2022 22:21:16 +0300 Subject: [PATCH 1/2] use cfg attribute instead of macro --- compiler/rustc_codegen_ssa/src/base.rs | 52 +++++++++++++------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/compiler/rustc_codegen_ssa/src/base.rs b/compiler/rustc_codegen_ssa/src/base.rs index 0b31e4b558261..010560248054e 100644 --- a/compiler/rustc_codegen_ssa/src/base.rs +++ b/compiler/rustc_codegen_ssa/src/base.rs @@ -14,6 +14,8 @@ use crate::{CachedModuleCodegen, CompiledModule, CrateInfo, MemFlags, ModuleCode use rustc_attr as attr; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::profiling::{get_resident_set_size, print_time_passes_entry}; + +#[cfg(parallel_compiler)] use rustc_data_structures::sync::{par_iter, ParallelIterator}; use rustc_hir as hir; use rustc_hir::def_id::{DefId, LOCAL_CRATE}; @@ -622,34 +624,34 @@ pub fn codegen_crate( // This likely is a temporary measure. Once we don't have to support the // non-parallel compiler anymore, we can compile CGUs end-to-end in // parallel and get rid of the complicated scheduling logic. + #[cfg(parallel_compiler)] let pre_compile_cgus = |cgu_reuse: &[CguReuse]| { - if cfg!(parallel_compiler) { - tcx.sess.time("compile_first_CGU_batch", || { - // Try to find one CGU to compile per thread. - let cgus: Vec<_> = cgu_reuse - .iter() - .enumerate() - .filter(|&(_, reuse)| reuse == &CguReuse::No) - .take(tcx.sess.threads()) - .collect(); - - // Compile the found CGUs in parallel. - let start_time = Instant::now(); - - let pre_compiled_cgus = par_iter(cgus) - .map(|(i, _)| { - let module = backend.compile_codegen_unit(tcx, codegen_units[i].name()); - (i, module) - }) - .collect(); - - (pre_compiled_cgus, start_time.elapsed()) - }) - } else { - (FxHashMap::default(), Duration::new(0, 0)) - } + tcx.sess.time("compile_first_CGU_batch", || { + // Try to find one CGU to compile per thread. + let cgus: Vec<_> = cgu_reuse + .iter() + .enumerate() + .filter(|&(_, reuse)| reuse == &CguReuse::No) + .take(tcx.sess.threads()) + .collect(); + + // Compile the found CGUs in parallel. + let start_time = Instant::now(); + + let pre_compiled_cgus = par_iter(cgus) + .map(|(i, _)| { + let module = backend.compile_codegen_unit(tcx, codegen_units[i].name()); + (i, module) + }) + .collect(); + + (pre_compiled_cgus, start_time.elapsed()) + }) }; + #[cfg(not(parallel_compiler))] + let pre_compile_cgus = |_: &[CguReuse]| (FxHashMap::default(), Duration::new(0, 0)); + let mut cgu_reuse = Vec::new(); let mut pre_compiled_cgus: Option> = None; let mut total_codegen_time = Duration::new(0, 0); From 008fc79dcd821b08a1ab64f5fba40dcc4bcd3aee Mon Sep 17 00:00:00 2001 From: klensy Date: Fri, 11 Feb 2022 23:25:14 +0300 Subject: [PATCH 2/2] Propagate `parallel_compiler` feature through rustc crates. Turned off feature gives change of builded crates: 238 -> 224. --- compiler/rustc/Cargo.toml | 1 + compiler/rustc_data_structures/Cargo.toml | 9 ++++++--- compiler/rustc_driver/Cargo.toml | 2 ++ compiler/rustc_interface/Cargo.toml | 5 +++-- compiler/rustc_middle/Cargo.toml | 7 +++++-- compiler/rustc_query_impl/Cargo.toml | 5 ++++- compiler/rustc_query_system/Cargo.toml | 5 ++++- src/bootstrap/compile.rs | 2 ++ src/bootstrap/lib.rs | 14 +++++++++----- 9 files changed, 36 insertions(+), 14 deletions(-) diff --git a/compiler/rustc/Cargo.toml b/compiler/rustc/Cargo.toml index 696c003a587ac..b642e891956cb 100644 --- a/compiler/rustc/Cargo.toml +++ b/compiler/rustc/Cargo.toml @@ -19,3 +19,4 @@ features = ['unprefixed_malloc_on_supported_platforms'] jemalloc = ['tikv-jemalloc-sys'] llvm = ['rustc_driver/llvm'] max_level_info = ['rustc_driver/max_level_info'] +rustc_use_parallel_compiler = ['rustc_driver/rustc_use_parallel_compiler'] diff --git a/compiler/rustc_data_structures/Cargo.toml b/compiler/rustc_data_structures/Cargo.toml index b82e97172614b..7cc8b5c20339a 100644 --- a/compiler/rustc_data_structures/Cargo.toml +++ b/compiler/rustc_data_structures/Cargo.toml @@ -9,7 +9,7 @@ doctest = false [dependencies] arrayvec = { version = "0.7", default-features = false } ena = "0.14" -indexmap = { version = "1.8.0", features = ["rustc-rayon"] } +indexmap = { version = "1.8.0" } tracing = "0.1" jobserver_crate = { version = "0.1.13", package = "jobserver" } rustc_serialize = { path = "../rustc_serialize" } @@ -17,8 +17,8 @@ rustc_macros = { path = "../rustc_macros" } rustc_graphviz = { path = "../rustc_graphviz" } cfg-if = "0.1.2" stable_deref_trait = "1.0.0" -rayon = { version = "0.3.2", package = "rustc-rayon" } -rayon-core = { version = "0.3.2", package = "rustc-rayon-core" } +rayon = { version = "0.3.2", package = "rustc-rayon", optional = true } +rayon-core = { version = "0.3.2", package = "rustc-rayon-core", optional = true } rustc-hash = "1.1.0" smallvec = { version = "1.6.1", features = ["const_generics", "union", "may_dangle"] } rustc_index = { path = "../rustc_index", package = "rustc_index" } @@ -36,3 +36,6 @@ winapi = { version = "0.3", features = ["fileapi", "psapi", "winerror"] } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] memmap2 = "0.2.1" + +[features] +rustc_use_parallel_compiler = ["indexmap/rustc-rayon", "rayon", "rayon-core"] diff --git a/compiler/rustc_driver/Cargo.toml b/compiler/rustc_driver/Cargo.toml index 872f946bf7d91..fd2ca5beadea3 100644 --- a/compiler/rustc_driver/Cargo.toml +++ b/compiler/rustc_driver/Cargo.toml @@ -39,3 +39,5 @@ winapi = { version = "0.3", features = ["consoleapi", "debugapi", "processenv"] [features] llvm = ['rustc_interface/llvm'] max_level_info = ['rustc_log/max_level_info'] +rustc_use_parallel_compiler = ['rustc_data_structures/rustc_use_parallel_compiler', 'rustc_interface/rustc_use_parallel_compiler', + 'rustc_middle/rustc_use_parallel_compiler'] diff --git a/compiler/rustc_interface/Cargo.toml b/compiler/rustc_interface/Cargo.toml index e31119c12921d..29d1cd0e05467 100644 --- a/compiler/rustc_interface/Cargo.toml +++ b/compiler/rustc_interface/Cargo.toml @@ -10,8 +10,8 @@ doctest = false libc = "0.2" libloading = "0.7.1" tracing = "0.1" -rustc-rayon-core = "0.3.2" -rayon = { version = "0.3.2", package = "rustc-rayon" } +rustc-rayon-core = { version = "0.3.2", optional = true } +rayon = { version = "0.3.2", package = "rustc-rayon", optional = true } smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } rustc_ast = { path = "../rustc_ast" } rustc_attr = { path = "../rustc_attr" } @@ -57,3 +57,4 @@ rustc_target = { path = "../rustc_target" } [features] llvm = ['rustc_codegen_llvm'] +rustc_use_parallel_compiler = ['rayon', 'rustc-rayon-core', 'rustc_query_impl/rustc_use_parallel_compiler'] diff --git a/compiler/rustc_middle/Cargo.toml b/compiler/rustc_middle/Cargo.toml index 9cfc5f5b444df..cd281ea5b38ae 100644 --- a/compiler/rustc_middle/Cargo.toml +++ b/compiler/rustc_middle/Cargo.toml @@ -12,8 +12,8 @@ bitflags = "1.2.1" either = "1.5.0" gsgdt = "0.1.2" tracing = "0.1" -rustc-rayon = "0.3.2" -rustc-rayon-core = "0.3.2" +rustc-rayon = { version = "0.3.2", optional = true } +rustc-rayon-core = { version = "0.3.2", optional = true } polonius-engine = "0.13.0" rustc_apfloat = { path = "../rustc_apfloat" } rustc_attr = { path = "../rustc_attr" } @@ -35,3 +35,6 @@ rustc_session = { path = "../rustc_session" } rustc_type_ir = { path = "../rustc_type_ir" } rand = "0.8.4" rand_xoshiro = "0.6.0" + +[features] +rustc_use_parallel_compiler = ["rustc-rayon", "rustc-rayon-core"] diff --git a/compiler/rustc_query_impl/Cargo.toml b/compiler/rustc_query_impl/Cargo.toml index f1899a6fb2b07..b7502c4b1e23b 100644 --- a/compiler/rustc_query_impl/Cargo.toml +++ b/compiler/rustc_query_impl/Cargo.toml @@ -8,7 +8,7 @@ doctest = false [dependencies] measureme = "10.0.0" -rustc-rayon-core = "0.3.2" +rustc-rayon-core = { version = "0.3.2", optional = true } rustc_ast = { path = "../rustc_ast" } rustc_data_structures = { path = "../rustc_data_structures" } rustc_errors = { path = "../rustc_errors" } @@ -20,3 +20,6 @@ rustc_query_system = { path = "../rustc_query_system" } rustc_serialize = { path = "../rustc_serialize" } rustc_session = { path = "../rustc_session" } rustc_span = { path = "../rustc_span" } + +[features] +rustc_use_parallel_compiler = ["rustc-rayon-core", "rustc_query_system/rustc_use_parallel_compiler"] diff --git a/compiler/rustc_query_system/Cargo.toml b/compiler/rustc_query_system/Cargo.toml index 79f791eb7545f..8a35121f90cdb 100644 --- a/compiler/rustc_query_system/Cargo.toml +++ b/compiler/rustc_query_system/Cargo.toml @@ -9,7 +9,7 @@ doctest = false [dependencies] rustc_arena = { path = "../rustc_arena" } tracing = "0.1" -rustc-rayon-core = "0.3.2" +rustc-rayon-core = { version = "0.3.2", optional = true } rustc_ast = { path = "../rustc_ast" } rustc_data_structures = { path = "../rustc_data_structures" } rustc_errors = { path = "../rustc_errors" } @@ -23,3 +23,6 @@ rustc_span = { path = "../rustc_span" } rustc_target = { path = "../rustc_target" } parking_lot = "0.11" smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } + +[features] +rustc_use_parallel_compiler = ["rustc-rayon-core"] diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index e030e0bc1cf80..00fc1f0434252 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -689,6 +689,8 @@ pub fn rustc_cargo_env(builder: &Builder<'_>, cargo: &mut Cargo, target: TargetS } if builder.config.rustc_parallel { + // keep in sync with `bootstrap/lib.rs:Build::rustc_features` + // `cfg` option for rustc, `features` option for cargo, for conditional compilation cargo.rustflag("--cfg=parallel_compiler"); cargo.rustdocflag("--cfg=parallel_compiler"); } diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index 41e2e976162de..8f076ad914d9a 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -729,12 +729,16 @@ impl Build { /// Gets the space-separated set of activated features for the compiler. fn rustc_features(&self, kind: Kind) -> String { - let mut features = String::new(); + let mut features = vec![]; if self.config.jemalloc { - features.push_str("jemalloc"); + features.push("jemalloc"); } if self.config.llvm_enabled() || kind == Kind::Check { - features.push_str(" llvm"); + features.push("llvm"); + } + // keep in sync with `bootstrap/compile.rs:rustc_cargo_env` + if self.config.rustc_parallel { + features.push("rustc_use_parallel_compiler"); } // If debug logging is on, then we want the default for tracing: @@ -743,10 +747,10 @@ impl Build { // if its unset, if debug_assertions is on, then debug_logging will also be on // as well as tracing *ignoring* this feature when debug_assertions is on if !self.config.rust_debug_logging { - features.push_str(" max_level_info"); + features.push("max_level_info"); } - features + features.join(" ") } /// Component directory that Cargo will produce output into (e.g.