Rollup merge of #119619 - onur-ozkan:panic-abort-mir-opt, r=oli-obk

mir-opt and custom target fixes

From https://github.com/rust-lang/rust/issues/115642#issuecomment-1879589022

> > Could you please test the last two commits from https://github.com/onur-ozkan/rust/commits/panic-abort-mir-opt when you have the time? The first commit should resolve the error of using the nightly flag with a stable compiler, and the second one should resolve the custom target issue.

> I tested with the two commits and the errors of using nightly flag and custom target specs were not seen.
Testing was completed for the test suites like ui, run-pass-valgrind, coverage, mir-opt, codegen, assembly, incremental.

Fixes #115642
This commit is contained in:
Matthias Krüger 2024-01-09 05:33:22 +01:00 committed by GitHub
commit 985b2ce70d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 14 deletions

View file

@ -483,6 +483,7 @@ impl TargetCfgs {
let mut targets: HashMap<String, TargetCfg> = serde_json::from_str(&rustc_output(
config,
&["--print=all-target-specs-json", "-Zunstable-options"],
Default::default(),
))
.unwrap();
@ -495,16 +496,33 @@ impl TargetCfgs {
let mut all_families = HashSet::new();
let mut all_pointer_widths = HashSet::new();
// Handle custom target specs, which are not included in `--print=all-target-specs-json`.
if config.target.ends_with(".json") {
targets.insert(
config.target.clone(),
serde_json::from_str(&rustc_output(
config,
&["--print=target-spec-json", "-Zunstable-options", "--target", &config.target],
))
.unwrap(),
);
// If current target is not included in the `--print=all-target-specs-json` output,
// we check whether it is a custom target from the user or a synthetic target from bootstrap.
if !targets.contains_key(&config.target) {
let mut envs: HashMap<String, String> = HashMap::new();
if let Ok(t) = std::env::var("RUST_TARGET_PATH") {
envs.insert("RUST_TARGET_PATH".into(), t);
}
// This returns false only when the target is neither a synthetic target
// nor a custom target from the user, indicating it is most likely invalid.
if config.target.ends_with(".json") || !envs.is_empty() {
targets.insert(
config.target.clone(),
serde_json::from_str(&rustc_output(
config,
&[
"--print=target-spec-json",
"-Zunstable-options",
"--target",
&config.target,
],
envs,
))
.unwrap(),
);
}
}
for (target, cfg) in targets.iter() {
@ -549,7 +567,9 @@ impl TargetCfgs {
// code below extracts them from `--print=cfg`: make sure to only override fields that can
// actually be changed with `-C` flags.
for config in
rustc_output(config, &["--print=cfg", "--target", &config.target]).trim().lines()
rustc_output(config, &["--print=cfg", "--target", &config.target], Default::default())
.trim()
.lines()
{
let (name, value) = config
.split_once("=\"")
@ -628,11 +648,12 @@ pub enum Endian {
Big,
}
fn rustc_output(config: &Config, args: &[&str]) -> String {
fn rustc_output(config: &Config, args: &[&str], envs: HashMap<String, String>) -> String {
let mut command = Command::new(&config.rustc_path);
add_dylib_path(&mut command, iter::once(&config.compile_lib_path));
command.args(&config.target_rustcflags).args(args);
command.env("RUSTC_BOOTSTRAP", "1");
command.envs(envs);
let output = match command.output() {
Ok(output) => output,