Skip to content

Commit eeccb4c

Browse files
authored
Rollup merge of #158516 - kn1g78:codegen-backend-dedupe, r=Kobzol,jieyouxu
Deduplicate codegen backends in bootstrap config Deduplicate `rust.codegen-backends` and `target.<triple>.codegen-backends` during bootstrap config parsing while preserving first occurrence order. This avoids carrying redundant backend entries into later bootstrap planning. test: ```powershell $env:CARGO_NET_OFFLINE='false'; $env:CARGO_TARGET_DIR='target-codex-test'; $cargo = Join-Path $env:USERPROFILE '.cargo\bin\cargo.exe'; & $cargo test --manifest-path src/bootstrap/Cargo.toml deduplicates_codegen_backends ``` result: ```text running 1 test test core::config::tests::deduplicates_codegen_backends ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 255 filtered out; finished in 0.00s ```
2 parents 933b5e7 + 1d4010f commit eeccb4c

2 files changed

Lines changed: 30 additions & 10 deletions

File tree

src/bootstrap/src/core/config/tests.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use serde::Deserialize;
1111

1212
use super::flags::Flags;
1313
use super::toml::change_id::ChangeIdWrapper;
14+
use super::toml::rust::parse_codegen_backends;
1415
use super::{Config, RUSTC_IF_UNCHANGED_ALLOWED_PATHS};
1516
use crate::ChangeId;
1617
use crate::core::build_steps::clippy::{LintConfig, get_clippy_rules_in_order};
@@ -206,6 +207,15 @@ fn rust_optimize() {
206207
assert_eq!(parse("rust.optimize = \"s\"").rust_optimize.get_opt_level(), Some("s".to_string()));
207208
}
208209

210+
#[test]
211+
#[should_panic(expected = "Duplicate value 'llvm' for 'rust.codegen-backends'")]
212+
fn rejects_duplicate_codegen_backends() {
213+
parse_codegen_backends(
214+
vec!["llvm", "llvm", "cranelift"].into_iter().map(str::to_owned).collect(),
215+
"rust",
216+
);
217+
}
218+
209219
#[test]
210220
#[should_panic]
211221
fn invalid_rust_optimize() {

src/bootstrap/src/core/config/toml/rust.rs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -422,23 +422,33 @@ pub(crate) fn parse_codegen_backends(
422422
Please, use '{stripped}' instead."
423423
)
424424
}
425-
if !BUILTIN_CODEGEN_BACKENDS.contains(&backend.as_str()) {
425+
let backend = match backend.as_str() {
426+
"llvm" => CodegenBackendKind::Llvm,
427+
"cranelift" => CodegenBackendKind::Cranelift,
428+
"gcc" => CodegenBackendKind::Gcc,
429+
backend => CodegenBackendKind::Custom(backend.to_string()),
430+
};
431+
432+
if found_backends.contains(&backend) {
433+
panic!(
434+
"Duplicate value '{}' for '{section}.codegen-backends'. \
435+
Each codegen backend should only be specified once.",
436+
backend.name()
437+
);
438+
}
439+
440+
if !BUILTIN_CODEGEN_BACKENDS.contains(&backend.name()) {
426441
if CiEnv::is_rust_lang_managed_ci_job() {
427-
eprintln!("Unknown codegen backend {backend}");
442+
eprintln!("Unknown codegen backend {}", backend.name());
428443
exit!(1);
429444
}
430445

431446
println!(
432-
"HELP: '{backend}' for '{section}.codegen-backends' might fail. \
433-
List of known codegen backends: {BUILTIN_CODEGEN_BACKENDS:?}"
447+
"HELP: '{}' for '{section}.codegen-backends' might fail. \
448+
List of known codegen backends: {BUILTIN_CODEGEN_BACKENDS:?}",
449+
backend.name()
434450
);
435451
}
436-
let backend = match backend.as_str() {
437-
"llvm" => CodegenBackendKind::Llvm,
438-
"cranelift" => CodegenBackendKind::Cranelift,
439-
"gcc" => CodegenBackendKind::Gcc,
440-
backend => CodegenBackendKind::Custom(backend.to_string()),
441-
};
442452
found_backends.push(backend);
443453
}
444454
if found_backends.is_empty() {

0 commit comments

Comments
 (0)