Skip to content

Commit

Permalink
Auto merge of #11633 - weihanglo:reduce-rustc-query-calls, r=ehuss
Browse files Browse the repository at this point in the history
Reduce target info rustc query calls
  • Loading branch information
bors committed Jan 28, 2023
2 parents 97b7073 + 1cef6d7 commit f6cf5ab
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 26 deletions.
68 changes: 42 additions & 26 deletions src/cargo/core/compiler/build_context/target_info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -168,22 +168,11 @@ impl TargetInfo {
loop {
let extra_fingerprint = kind.fingerprint_hash();

// Query rustc for supported -Csplit-debuginfo values
let support_split_debuginfo = rustc
.cached_output(
rustc.workspace_process().arg("--print=split-debuginfo"),
extra_fingerprint,
)
.unwrap_or_default()
.0
.lines()
.map(String::from)
.collect();

// Query rustc for several kinds of info from each line of output:
// 0) file-names (to determine output file prefix/suffix for given crate type)
// 1) sysroot
// 2) cfg
// 2) split-debuginfo
// 3) cfg
//
// Search `--print` to see what we query so far.
let mut process = rustc.workspace_process();
Expand Down Expand Up @@ -213,6 +202,8 @@ impl TargetInfo {
}

process.arg("--print=sysroot");
process.arg("--print=split-debuginfo");
process.arg("--print=crate-name"); // `___` as a delimiter.
process.arg("--print=cfg");

let (output, error) = rustc
Expand All @@ -228,13 +219,8 @@ impl TargetInfo {
map.insert(crate_type.clone(), out);
}

let line = match lines.next() {
Some(line) => line,
None => anyhow::bail!(
"output of --print=sysroot missing when learning about \
target-specific information from rustc\n{}",
output_err_info(&process, &output, &error)
),
let Some(line) = lines.next() else {
return error_missing_print_output("sysroot", &process, &output, &error);
};
let sysroot = PathBuf::from(line);
let sysroot_host_libdir = if cfg!(windows) {
Expand All @@ -251,6 +237,26 @@ impl TargetInfo {
});
sysroot_target_libdir.push("lib");

let support_split_debuginfo = {
// HACK: abuse `--print=crate-name` to use `___` as a delimiter.
let mut res = Vec::new();
loop {
match lines.next() {
Some(line) if line == "___" => break,
Some(line) => res.push(line.into()),
None => {
return error_missing_print_output(
"split-debuginfo",
&process,
&output,
&error,
)
}
}
}
res
};

let cfg = lines
.map(|line| Ok(Cfg::from_str(line)?))
.filter(TargetInfo::not_user_specific_cfg)
Expand Down Expand Up @@ -590,17 +596,27 @@ fn parse_crate_type(
};
let mut parts = line.trim().split("___");
let prefix = parts.next().unwrap();
let suffix = match parts.next() {
Some(part) => part,
None => anyhow::bail!(
"output of --print=file-names has changed in the compiler, cannot parse\n{}",
output_err_info(cmd, output, error)
),
let Some(suffix) = parts.next() else {
return error_missing_print_output("file-names", cmd, output, error);
};

Ok(Some((prefix.to_string(), suffix.to_string())))
}

/// Helper for creating an error message for missing output from a certain `--print` request.
fn error_missing_print_output<T>(
request: &str,
cmd: &ProcessBuilder,
stdout: &str,
stderr: &str,
) -> CargoResult<T> {
let err_info = output_err_info(cmd, stdout, stderr);
anyhow::bail!(
"output of --print={request} missing when learning about \
target-specific information from rustc\n{err_info}",
)
}

/// Helper for creating an error message when parsing rustc output fails.
fn output_err_info(cmd: &ProcessBuilder, stdout: &str, stderr: &str) -> String {
let mut result = format!("command was: {}\n", cmd);
Expand Down
40 changes: 40 additions & 0 deletions tests/testsuite/cfg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,22 @@ fn bad_cfg_discovery() {
return;
}
println!("{}", sysroot);
if mode == "no-split-debuginfo" {
return;
}
loop {
let line = lines.next().unwrap();
if line == "___" {
println!("\n{line}");
break;
} else {
// As the number split-debuginfo options varies,
// concat them into one line.
print!("{line},");
}
};
if mode != "bad-cfg" {
panic!("unexpected");
}
Expand Down Expand Up @@ -412,6 +428,28 @@ command was: `[..]compiler[..]--crate-type [..]`
[..]___[..]
[..]___[..]
",
)
.run();

p.cargo("build")
.env("RUSTC", &funky_rustc)
.env("FUNKY_MODE", "no-split-debuginfo")
.with_status(101)
.with_stderr(
"\
[ERROR] output of --print=split-debuginfo missing when learning about target-specific information from rustc
command was: `[..]compiler[..]--crate-type [..]`
--- stdout
[..]___[..]
[..]___[..]
[..]___[..]
[..]___[..]
[..]___[..]
[..]___[..]
[..]
",
)
.run();
Expand All @@ -430,6 +468,8 @@ command was: `[..]compiler[..]--crate-type [..]`
[..]___[..]
[..]___[..]
[..]
[..],[..]
___
123
Expand Down

0 comments on commit f6cf5ab

Please sign in to comment.