Change:
The profile is intended not just for people working on LLVM itself, but also anyone who touches codegen but not LLVM. For example, anyone who modifies or is only changing the IR we send to LLVM, not LLVM itself. We should keep on for them but not for , but ideally we wouldn't build LLVM from source if it's unmodified. points out some things that we should fix before enabling that option by default for the profile: Originally posted by in <!-- TRIAGEBOTSTART --<!-- TRIAGEBOTASSIGNSTART --<!-- TRIAGEBOTASSIGNDATASTARTTRIAGEBOTASSIGNDATAEND --<!-- TRIAGEBOTASSIGNEND --<!-- TRIAGEBOTEND --
claim Should all 3 tasks be in one PR or is it 3 separate PR's?
I'd say it depends how challenging they are - if it's simple to fix all three in one PR that seems fine, but if it takes a more than a day to do one of the tasks, it probably makes sense to open a PR for it early.
I think I can tackle points 1 and 3 by tonight so I'll make that into one PR. I'll open a separate PR for the second point, since I think it has more work involved, if that's alright :)
release-assignment

Discussion:
# # If `change-id` does not match the version that is currently running, # `x.py` will prompt you to update it and check the related PR for more details. <del> change-id = 117435 </del> <ins> change-id = 116881 </ins> # ============================================================================= # Tweaking how LLVM is compiled

# Unless you're developing for a target where Rust CI doesn't build a compiler # toolchain or changing LLVM locally, you probably want to leave this enabled. # <del> # All tier 1 targets are currently supported; set this to `"if-available"` if # you are not sure whether you're on a tier 1 target. </del> <ins> # Set this to `"if-available"` if you are not sure whether you're on a tier 1 # target. All tier 1 targets are currently supported; </ins> # # We also currently only support this when building LLVM for the build triple. # <ins> # Set this to `"if-unchanged"` to only download if the llvm-project have not # been modified. (If there are no changes or if built from tarball source, # the logic is the same as "if-available") # </ins> # Note that many of the LLVM options are not currently supported for # downloading. Currently only the "assertions" option can be toggled. #download-ci-llvm = if rust.channel == "dev" { "if-available" } else { false }

# enable warnings during the llvm compilation enable-warnings = true # build llvm from source <del> download-ci-llvm = false </del> <ins> download-ci-llvm = "if-unchanged" </ins> [rust] # This enables `RUSTC_LOG=debug`, avoiding confusing situations

Change this file to make users of the `download-ci-llvm` configuration download a new version of LLVM from CI, even if the LLVM submodule hasn’t changed. <del> Last change is for: https://github.com/rust-lang/rust/pull/113996 </del> <ins> Last change is for: https://github.com/rust-lang/rust/pull/116881 </ins>

builder.ensure(crate::core::build_steps::llvm::Lld { target }); let src_bindir = builder.llvm_out(target).join("bin"); <del> // If updating this list, you likely want to change </del> <ins> // If updating this, you likely want to change </ins> // src/bootstrap/download-ci-llvm-stamp as well, otherwise local users // will not pick up the extra file until LLVM gets bumped. <del> for bin in &[ "llvm-config", "llvm-ar", "llvm-objdump", "llvm-profdata", "llvm-bcanalyzer", "llvm-cov", "llvm-dwp", "llvm-nm", "llvm-dwarfdump", "llvm-dis", "llvm-tblgen", ] { tarball.add_file(src_bindir.join(exe(bin, target)), "bin", 0o755); </del> <ins> // We should include all the build artifacts obtained from a source build, // so that you can use the downloadable LLVM as if you’ve just run a full source build. if src_bindir.exists() { for entry in walkdir::WalkDir::new(&src_bindir) { let entry = t!(entry); if entry.file_type().is_file() && !entry.path_is_symlink() { let name = entry.file_name().to_str().unwrap(); tarball.add_file(src_bindir.join(name), "bin", 0o755); } } </ins> } // We don't build LLD on some platforms, so only add it if it exists

} fn run(self, builder: &Builder<'_>) { <ins> // During ./x.py setup once you select the codegen profile. // The submodule will be downloaded. It does not work in the // tarball case since they don't include Git and submodules // are already included. if !builder.rust_info().is_from_tarball() { if self == Profile::Codegen { builder.update_submodule(&Path::new("src/llvm-project")); } } </ins> setup(&builder.build.config, self) } }

use std::str::FromStr; use crate::core::build_steps::compile::CODEGEN_BACKEND_PREFIX; <ins> use crate::core::build_steps::llvm; </ins> use crate::core::config::flags::{Color, Flags, Warnings}; use crate::utils::cache::{Interned, INTERNER}; use crate::utils::channel::{self, GitInfo};

config.llvm_build_config = llvm.build_config.clone().unwrap_or(Default::default()); let asserts = llvm_assertions.unwrap_or(false); <del> config.llvm_from_ci = match llvm.download_ci_llvm { Some(StringOrBool::String(s)) => { assert_eq!(s, "if-available", "unknown option `{s}` for download-ci-llvm"); crate::core::build_steps::llvm::is_ci_llvm_available(&config, asserts) } Some(StringOrBool::Bool(b)) => b, None => { config.channel == "dev" && crate::core::build_steps::llvm::is_ci_llvm_available(&config, asserts) } }; </del> <ins> config.llvm_from_ci = config.parse_download_ci_llvm(llvm.download_ci_llvm, asserts); </ins> if config.llvm_from_ci { // None of the LLVM options, except assertions, are supported

Some(commit.to_string()) } <ins> fn parse_download_ci_llvm( &self, download_ci_llvm: Option<StringOrBool>, asserts: bool, ) -> bool { match download_ci_llvm { None => self.channel == "dev" && llvm::is_ci_llvm_available(&self, asserts), Some(StringOrBool::Bool(b)) => b, Some(StringOrBool::String(s)) if s == "if-available" => { llvm::is_ci_llvm_available(&self, asserts) } Some(StringOrBool::String(s)) if s == "if-unchanged" => { // Git is needed to track modifications here, but tarball source is not available. // If not modified here or built through tarball source, we maintain consistency // with '"if available"'. if !self.rust_info.is_from_tarball() && self .last_modified_commit(&["src/llvm-project"], "download-ci-llvm", true) .is_none() { // there are some untracked changes in the the given paths. false } else { llvm::is_ci_llvm_available(&self, asserts) } } Some(StringOrBool::String(other)) => { panic!("unrecognized option for download-ci-llvm: {:?}", other) } } } /// Returns the last commit in which any of `modified_paths` were changed, /// or `None` if there are untracked changes in the working directory and `if_unchanged` is true. pub fn last_modified_commit( &self, modified_paths: &[&str], option_name: &str, if_unchanged: bool, ) -> Option<String> { // Handle running from a directory other than the top level let top_level = output(self.git().args(&["rev-parse", "--show-toplevel"])); let top_level = top_level.trim_end(); // Look for a version to compare to based on the current commit. // Only commits merged by bors will have CI artifacts. let merge_base = output( self.git() .arg("rev-list") .arg(format!("--author={}", self.stage0_metadata.config.git_merge_commit_email)) .args(&["-n1", "--first-parent", "HEAD"]), ); let commit = merge_base.trim_end(); if commit.is_empty() { println!("error: could not find commit hash for downloading components from CI"); println!("help: maybe your repository history is too shallow?"); println!("help: consider disabling `{option_name}`"); println!("help: or fetch enough history to include one upstream commit"); crate::exit!(1); } // Warn if there were changes to the compiler or standard library since the ancestor commit. let mut git = self.git(); git.args(&["diff-index", "--quiet", &commit, "--"]); for path in modified_paths { git.arg(format!("{top_level}/{path}")); } let has_changes = !t!(git.status()).success(); if has_changes { if if_unchanged { if self.verbose > 0 { println!( "warning: saw changes to one of {modified_paths:?} since {commit};  ignoring `{option_name}`" ); } return None; } println!( "warning: `{option_name}` is enabled, but there are changes to one of {modified_paths:?}" ); } Some(commit.to_string()) } </ins> } fn set<T>(field: &mut T, val: Option<T>) {

/// /// If you make any major changes (such as adding new values or changing default values), please /// ensure that the associated PR ID is added to the end of this list. <del> pub const CONFIG_CHANGE_HISTORY: &[usize] = &[115898, 116998, 117435]; </del> <ins> pub const CONFIG_CHANGE_HISTORY: &[usize] = &[115898, 116998, 117435, 116881]; </ins> /// Extra --check-cfg to add when building /// (Mode restriction, config name, config values (if any))