Rollup merge of #72146 - Mark-Simulacrum:separate-std-asserts, r=alexcrichton

Provide separate option for std debug asserts

On local one-off benchmarking of libcore metadata-only, debug asserts in std are a significant hit (15s to 20s). Provide an option for compiler developers to disable them. A build with a nightly compiler is around 10s, for reference.
This commit is contained in:
Dylan DPC 2020-05-15 01:57:17 +02:00 committed by GitHub
commit 24cd42781f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 1 deletions

View File

@ -314,6 +314,10 @@
# library. # library.
#debug-assertions = false #debug-assertions = false
# Whether or not debug assertions are enabled for the standard library.
# Overrides the `debug-assertions` option, if defined.
#debug-assertions-std = false
# Debuginfo level for most of Rust code, corresponds to the `-C debuginfo=N` option of `rustc`. # Debuginfo level for most of Rust code, corresponds to the `-C debuginfo=N` option of `rustc`.
# `0` - no debug info # `0` - no debug info
# `1` - line tables only # `1` - line tables only

View File

@ -915,7 +915,14 @@ impl<'a> Builder<'a> {
.env("RUSTC", self.out.join("bootstrap/debug/rustc")) .env("RUSTC", self.out.join("bootstrap/debug/rustc"))
.env("RUSTC_REAL", self.rustc(compiler)) .env("RUSTC_REAL", self.rustc(compiler))
.env("RUSTC_STAGE", stage.to_string()) .env("RUSTC_STAGE", stage.to_string())
.env("RUSTC_DEBUG_ASSERTIONS", self.config.rust_debug_assertions.to_string()) .env(
"RUSTC_DEBUG_ASSERTIONS",
if mode == Mode::Std {
self.config.rust_debug_assertions_std.to_string()
} else {
self.config.rust_debug_assertions.to_string()
},
)
.env("RUSTC_SYSROOT", &sysroot) .env("RUSTC_SYSROOT", &sysroot)
.env("RUSTC_LIBDIR", &libdir) .env("RUSTC_LIBDIR", &libdir)
.env("RUSTDOC", self.out.join("bootstrap/debug/rustdoc")) .env("RUSTDOC", self.out.join("bootstrap/debug/rustdoc"))

View File

@ -97,6 +97,7 @@ pub struct Config {
pub rust_codegen_units: Option<u32>, pub rust_codegen_units: Option<u32>,
pub rust_codegen_units_std: Option<u32>, pub rust_codegen_units_std: Option<u32>,
pub rust_debug_assertions: bool, pub rust_debug_assertions: bool,
pub rust_debug_assertions_std: bool,
pub rust_debuginfo_level_rustc: u32, pub rust_debuginfo_level_rustc: u32,
pub rust_debuginfo_level_std: u32, pub rust_debuginfo_level_std: u32,
pub rust_debuginfo_level_tools: u32, pub rust_debuginfo_level_tools: u32,
@ -314,6 +315,7 @@ struct Rust {
codegen_units: Option<u32>, codegen_units: Option<u32>,
codegen_units_std: Option<u32>, codegen_units_std: Option<u32>,
debug_assertions: Option<bool>, debug_assertions: Option<bool>,
debug_assertions_std: Option<bool>,
debuginfo_level: Option<u32>, debuginfo_level: Option<u32>,
debuginfo_level_rustc: Option<u32>, debuginfo_level_rustc: Option<u32>,
debuginfo_level_std: Option<u32>, debuginfo_level_std: Option<u32>,
@ -518,6 +520,7 @@ impl Config {
let mut llvm_assertions = None; let mut llvm_assertions = None;
let mut debug = None; let mut debug = None;
let mut debug_assertions = None; let mut debug_assertions = None;
let mut debug_assertions_std = None;
let mut debuginfo_level = None; let mut debuginfo_level = None;
let mut debuginfo_level_rustc = None; let mut debuginfo_level_rustc = None;
let mut debuginfo_level_std = None; let mut debuginfo_level_std = None;
@ -560,6 +563,7 @@ impl Config {
if let Some(ref rust) = toml.rust { if let Some(ref rust) = toml.rust {
debug = rust.debug; debug = rust.debug;
debug_assertions = rust.debug_assertions; debug_assertions = rust.debug_assertions;
debug_assertions_std = rust.debug_assertions_std;
debuginfo_level = rust.debuginfo_level; debuginfo_level = rust.debuginfo_level;
debuginfo_level_rustc = rust.debuginfo_level_rustc; debuginfo_level_rustc = rust.debuginfo_level_rustc;
debuginfo_level_std = rust.debuginfo_level_std; debuginfo_level_std = rust.debuginfo_level_std;
@ -658,6 +662,8 @@ impl Config {
let default = debug == Some(true); let default = debug == Some(true);
config.rust_debug_assertions = debug_assertions.unwrap_or(default); config.rust_debug_assertions = debug_assertions.unwrap_or(default);
config.rust_debug_assertions_std =
debug_assertions_std.unwrap_or(config.rust_debug_assertions);
let with_defaults = |debuginfo_level_specific: Option<u32>| { let with_defaults = |debuginfo_level_specific: Option<u32>| {
debuginfo_level_specific.or(debuginfo_level).unwrap_or(if debug == Some(true) { debuginfo_level_specific.or(debuginfo_level).unwrap_or(if debug == Some(true) {