micro-level optimizations for bootstrap

Overall optimizations for bootstrap on conditions, assertions,
trait implementations, etc.

Signed-off-by: onur-ozkan <work@onurozkan.dev>
This commit is contained in:
onur-ozkan 2023-09-14 21:03:30 +03:00
parent 12b1784b0b
commit 9971008b8d
9 changed files with 60 additions and 77 deletions

View File

@ -523,7 +523,7 @@ pub fn paths(mut self, paths: &[&str]) -> Self {
.iter() .iter()
.map(|p| { .map(|p| {
// assert only if `p` isn't submodule // assert only if `p` isn't submodule
if !submodules_paths.iter().find(|sm_p| p.contains(*sm_p)).is_some() { if submodules_paths.iter().find(|sm_p| p.contains(*sm_p)).is_none() {
assert!( assert!(
self.builder.src.join(p).exists(), self.builder.src.join(p).exists(),
"`should_run.paths` should correspond to real on-disk paths - use `alias` if there is no relevant path: {}", "`should_run.paths` should correspond to real on-disk paths - use `alias` if there is no relevant path: {}",

View File

@ -876,11 +876,9 @@ fn run(self, builder: &Builder<'_>) {
cargo.rustflag("-Clto=off"); cargo.rustflag("-Clto=off");
} }
} }
} else { } else if builder.config.rust_lto == RustcLto::Off {
if builder.config.rust_lto == RustcLto::Off {
cargo.rustflag("-Clto=off"); cargo.rustflag("-Clto=off");
} }
}
for krate in &*self.crates { for krate in &*self.crates {
cargo.arg("-p").arg(krate); cargo.arg("-p").arg(krate);

View File

@ -322,33 +322,23 @@ pub struct RustfmtMetadata {
pub version: String, pub version: String,
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug, Default)]
pub enum RustfmtState { pub enum RustfmtState {
SystemToolchain(PathBuf), SystemToolchain(PathBuf),
Downloaded(PathBuf), Downloaded(PathBuf),
Unavailable, Unavailable,
#[default]
LazyEvaluated, LazyEvaluated,
} }
impl Default for RustfmtState { #[derive(Debug, Default, Clone, Copy, PartialEq)]
fn default() -> Self {
RustfmtState::LazyEvaluated
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum LlvmLibunwind { pub enum LlvmLibunwind {
#[default]
No, No,
InTree, InTree,
System, System,
} }
impl Default for LlvmLibunwind {
fn default() -> Self {
Self::No
}
}
impl FromStr for LlvmLibunwind { impl FromStr for LlvmLibunwind {
type Err = String; type Err = String;
@ -362,19 +352,14 @@ fn from_str(value: &str) -> Result<Self, Self::Err> {
} }
} }
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] #[derive(Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum SplitDebuginfo { pub enum SplitDebuginfo {
Packed, Packed,
Unpacked, Unpacked,
#[default]
Off, Off,
} }
impl Default for SplitDebuginfo {
fn default() -> Self {
SplitDebuginfo::Off
}
}
impl std::str::FromStr for SplitDebuginfo { impl std::str::FromStr for SplitDebuginfo {
type Err = (); type Err = ();
@ -1529,7 +1514,7 @@ fn get_table(option: &str) -> Result<TomlConfig, toml::de::Error> {
let asserts = llvm_assertions.unwrap_or(false); let asserts = llvm_assertions.unwrap_or(false);
config.llvm_from_ci = match llvm.download_ci_llvm { config.llvm_from_ci = match llvm.download_ci_llvm {
Some(StringOrBool::String(s)) => { Some(StringOrBool::String(s)) => {
assert!(s == "if-available", "unknown option `{s}` for download-ci-llvm"); assert_eq!(s, "if-available", "unknown option `{s}` for download-ci-llvm");
crate::llvm::is_ci_llvm_available(&config, asserts) crate::llvm::is_ci_llvm_available(&config, asserts)
} }
Some(StringOrBool::Bool(b)) => b, Some(StringOrBool::Bool(b)) => b,

View File

@ -136,7 +136,7 @@ fn override_toml() {
"setting string value without quotes" "setting string value without quotes"
); );
assert_eq!(config.gdb, Some("bar".into()), "setting string value with quotes"); assert_eq!(config.gdb, Some("bar".into()), "setting string value with quotes");
assert_eq!(config.deny_warnings, false, "setting boolean value"); assert!(!config.deny_warnings, "setting boolean value");
assert_eq!( assert_eq!(
config.tools, config.tools,
Some(["cargo".to_string()].into_iter().collect()), Some(["cargo".to_string()].into_iter().collect()),
@ -181,13 +181,13 @@ fn get_toml(file: &Path) -> TomlConfig {
#[test] #[test]
fn rust_optimize() { fn rust_optimize() {
assert_eq!(parse("").rust_optimize.is_release(), true); assert!(parse("").rust_optimize.is_release());
assert_eq!(parse("rust.optimize = false").rust_optimize.is_release(), false); assert!(!parse("rust.optimize = false").rust_optimize.is_release());
assert_eq!(parse("rust.optimize = true").rust_optimize.is_release(), true); assert!(parse("rust.optimize = true").rust_optimize.is_release());
assert_eq!(parse("rust.optimize = 0").rust_optimize.is_release(), false); assert!(!parse("rust.optimize = 0").rust_optimize.is_release());
assert_eq!(parse("rust.optimize = 1").rust_optimize.is_release(), true); assert!(parse("rust.optimize = 1").rust_optimize.is_release());
assert!(parse("rust.optimize = \"s\"").rust_optimize.is_release());
assert_eq!(parse("rust.optimize = 1").rust_optimize.get_opt_level(), Some("1".to_string())); assert_eq!(parse("rust.optimize = 1").rust_optimize.get_opt_level(), Some("1".to_string()));
assert_eq!(parse("rust.optimize = \"s\"").rust_optimize.is_release(), true);
assert_eq!(parse("rust.optimize = \"s\"").rust_optimize.get_opt_level(), Some("s".to_string())); assert_eq!(parse("rust.optimize = \"s\"").rust_optimize.get_opt_level(), Some("s".to_string()));
} }

View File

@ -441,7 +441,7 @@ pub(crate) fn download_ci_rustc(&self, commit: &str) {
} }
pub(crate) fn download_beta_toolchain(&self) { pub(crate) fn download_beta_toolchain(&self) {
self.verbose(&format!("downloading stage0 beta artifacts")); self.verbose("downloading stage0 beta artifacts");
let date = &self.stage0_metadata.compiler.date; let date = &self.stage0_metadata.compiler.date;
let version = &self.stage0_metadata.compiler.version; let version = &self.stage0_metadata.compiler.version;

View File

@ -116,7 +116,7 @@ pub unsafe fn setup(_build: &mut crate::Build) {}
/// Extra --check-cfg to add when building /// Extra --check-cfg to add when building
/// (Mode restriction, config name, config values (if any)) /// (Mode restriction, config name, config values (if any))
const EXTRA_CHECK_CFGS: &[(Option<Mode>, &'static str, Option<&[&'static str]>)] = &[ const EXTRA_CHECK_CFGS: &[(Option<Mode>, &str, Option<&[&'static str]>)] = &[
(None, "bootstrap", None), (None, "bootstrap", None),
(Some(Mode::Rustc), "parallel_compiler", None), (Some(Mode::Rustc), "parallel_compiler", None),
(Some(Mode::ToolRustc), "parallel_compiler", None), (Some(Mode::ToolRustc), "parallel_compiler", None),
@ -1757,11 +1757,12 @@ fn ninja(&self) -> bool {
// //
// In these cases we automatically enable Ninja if we find it in the // In these cases we automatically enable Ninja if we find it in the
// environment. // environment.
if !self.config.ninja_in_file && self.config.build.contains("msvc") { if !self.config.ninja_in_file
if cmd_finder.maybe_have("ninja").is_some() { && self.config.build.contains("msvc")
&& cmd_finder.maybe_have("ninja").is_some()
{
return true; return true;
} }
}
self.config.ninja_in_file self.config.ninja_in_file
} }

View File

@ -148,7 +148,7 @@ pub(crate) fn detect_llvm_sha(config: &Config, is_git: bool) -> String {
"".to_owned() "".to_owned()
}; };
if &llvm_sha == "" { if llvm_sha.is_empty() {
eprintln!("error: could not find commit hash for downloading LLVM"); eprintln!("error: could not find commit hash for downloading LLVM");
eprintln!("help: maybe your repository history is too shallow?"); eprintln!("help: maybe your repository history is too shallow?");
eprintln!("help: consider disabling `download-ci-llvm`"); eprintln!("help: consider disabling `download-ci-llvm`");
@ -201,11 +201,11 @@ pub(crate) fn is_ci_llvm_available(config: &Config, asserts: bool) -> bool {
("x86_64-unknown-netbsd", false), ("x86_64-unknown-netbsd", false),
]; ];
if !supported_platforms.contains(&(&*config.build.triple, asserts)) { if !supported_platforms.contains(&(&*config.build.triple, asserts))
if asserts == true || !supported_platforms.contains(&(&*config.build.triple, true)) { && (asserts || !supported_platforms.contains(&(&*config.build.triple, true)))
{
return false; return false;
} }
}
if is_ci_llvm_modified(config) { if is_ci_llvm_modified(config) {
eprintln!("Detected LLVM as non-available: running in CI and modified LLVM in this change"); eprintln!("Detected LLVM as non-available: running in CI and modified LLVM in this change");
@ -490,11 +490,11 @@ fn run(self, builder: &Builder<'_>) -> LlvmResult {
let mut cmd = Command::new(&res.llvm_config); let mut cmd = Command::new(&res.llvm_config);
let version = output(cmd.arg("--version")); let version = output(cmd.arg("--version"));
let major = version.split('.').next().unwrap(); let major = version.split('.').next().unwrap();
let lib_name = match &llvm_version_suffix {
match &llvm_version_suffix {
Some(version_suffix) => format!("libLLVM-{major}{version_suffix}.{extension}"), Some(version_suffix) => format!("libLLVM-{major}{version_suffix}.{extension}"),
None => format!("libLLVM-{major}.{extension}"), None => format!("libLLVM-{major}.{extension}"),
}; }
lib_name
}; };
// When building LLVM with LLVM_LINK_LLVM_DYLIB for macOS, an unversioned // When building LLVM with LLVM_LINK_LLVM_DYLIB for macOS, an unversioned
@ -749,15 +749,17 @@ fn configure_cmake(
// For distribution we want the LLVM tools to be *statically* linked to libstdc++. // For distribution we want the LLVM tools to be *statically* linked to libstdc++.
// We also do this if the user explicitly requested static libstdc++. // We also do this if the user explicitly requested static libstdc++.
if builder.config.llvm_static_stdcpp { if builder.config.llvm_static_stdcpp
if !target.contains("msvc") && !target.contains("netbsd") && !target.contains("solaris") { && !target.contains("msvc")
&& !target.contains("netbsd")
&& !target.contains("solaris")
{
if target.contains("apple") || target.contains("windows") { if target.contains("apple") || target.contains("windows") {
ldflags.push_all("-static-libstdc++"); ldflags.push_all("-static-libstdc++");
} else { } else {
ldflags.push_all("-Wl,-Bsymbolic -static-libstdc++"); ldflags.push_all("-Wl,-Bsymbolic -static-libstdc++");
} }
} }
}
cfg.define("CMAKE_SHARED_LINKER_FLAGS", &ldflags.shared); cfg.define("CMAKE_SHARED_LINKER_FLAGS", &ldflags.shared);
cfg.define("CMAKE_MODULE_LINKER_FLAGS", &ldflags.module); cfg.define("CMAKE_MODULE_LINKER_FLAGS", &ldflags.module);

View File

@ -92,9 +92,9 @@ pub fn check(build: &mut Build) {
.unwrap_or(true) .unwrap_or(true)
}) })
.any(|build_llvm_ourselves| build_llvm_ourselves); .any(|build_llvm_ourselves| build_llvm_ourselves);
let need_cmake = building_llvm || build.config.any_sanitizers_enabled(); let need_cmake = building_llvm || build.config.any_sanitizers_enabled();
if need_cmake { if need_cmake && cmd_finder.maybe_have("cmake").is_none() {
if cmd_finder.maybe_have("cmake").is_none() {
eprintln!( eprintln!(
" "
Couldn't find required command: cmake Couldn't find required command: cmake
@ -106,7 +106,6 @@ pub fn check(build: &mut Build) {
); );
crate::exit!(1); crate::exit!(1);
} }
}
build.config.python = build build.config.python = build
.config .config
@ -199,11 +198,11 @@ pub fn check(build: &mut Build) {
.entry(*target) .entry(*target)
.or_insert_with(|| Target::from_triple(&target.triple)); .or_insert_with(|| Target::from_triple(&target.triple));
if target.contains("-none-") || target.contains("nvptx") { if (target.contains("-none-") || target.contains("nvptx"))
if build.no_std(*target) == Some(false) { && build.no_std(*target) == Some(false)
{
panic!("All the *-none-* and nvptx* targets are no-std targets") panic!("All the *-none-* and nvptx* targets are no-std targets")
} }
}
// Make sure musl-root is valid // Make sure musl-root is valid
if target.contains("musl") && !target.contains("unikraft") { if target.contains("musl") && !target.contains("unikraft") {

View File

@ -1139,8 +1139,7 @@ fn run(self, builder: &Builder<'_>) {
.map(|filename| builder.src.join("src/etc/completions").join(filename)); .map(|filename| builder.src.join("src/etc/completions").join(filename));
if builder.config.cmd.bless() { if builder.config.cmd.bless() {
builder.ensure(crate::run::GenerateCompletions); builder.ensure(crate::run::GenerateCompletions);
} else { } else if crate::flags::get_completion(shells::Bash, &bash).is_some()
if crate::flags::get_completion(shells::Bash, &bash).is_some()
|| crate::flags::get_completion(shells::Fish, &fish).is_some() || crate::flags::get_completion(shells::Fish, &fish).is_some()
|| crate::flags::get_completion(shells::PowerShell, &powershell).is_some() || crate::flags::get_completion(shells::PowerShell, &powershell).is_some()
{ {
@ -1150,7 +1149,6 @@ fn run(self, builder: &Builder<'_>) {
crate::exit!(1); crate::exit!(1);
} }
} }
}
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> { fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
run.path("src/tools/tidy") run.path("src/tools/tidy")
@ -1372,7 +1370,7 @@ fn run(self, builder: &Builder<'_>) {
let run = |target| { let run = |target| {
builder.ensure(Compiletest { builder.ensure(Compiletest {
compiler: self.compiler, compiler: self.compiler,
target: target, target,
mode: "mir-opt", mode: "mir-opt",
suite: "mir-opt", suite: "mir-opt",
path: "tests/mir-opt", path: "tests/mir-opt",