Skip to content

Commit a10edc9

Browse files
committed
Respect --sysroot for rustc -vV and -Cpasses=list
This is necessary when the specified codegen backend is in a custom sysroot.
1 parent 67951d9 commit a10edc9

File tree

1 file changed

+20
-14
lines changed
  • compiler/rustc_driver_impl/src

1 file changed

+20
-14
lines changed

compiler/rustc_driver_impl/src/lib.rs

+20-14
Original file line numberDiff line numberDiff line change
@@ -916,13 +916,7 @@ pub fn version_at_macro_invocation(
916916
safe_println!("host: {}", config::host_tuple());
917917
safe_println!("release: {release}");
918918

919-
let debug_flags = matches.opt_strs("Z");
920-
let backend_name = debug_flags.iter().find_map(|x| x.strip_prefix("codegen-backend="));
921-
let opts = config::Options::default();
922-
let sysroot = filesearch::materialize_sysroot(opts.maybe_sysroot.clone());
923-
let target = config::build_target_config(early_dcx, &opts, &sysroot);
924-
925-
get_codegen_backend(early_dcx, &sysroot, backend_name, &target).print_version();
919+
get_backend_from_raw_matches(early_dcx, matches).print_version();
926920
}
927921
}
928922

@@ -1125,19 +1119,31 @@ pub fn describe_flag_categories(early_dcx: &EarlyDiagCtxt, matches: &Matches) ->
11251119
}
11261120

11271121
if cg_flags.iter().any(|x| *x == "passes=list") {
1128-
let backend_name = debug_flags.iter().find_map(|x| x.strip_prefix("codegen-backend="));
1129-
1130-
let opts = config::Options::default();
1131-
let sysroot = filesearch::materialize_sysroot(opts.maybe_sysroot.clone());
1132-
let target = config::build_target_config(early_dcx, &opts, &sysroot);
1133-
1134-
get_codegen_backend(early_dcx, &sysroot, backend_name, &target).print_passes();
1122+
get_backend_from_raw_matches(early_dcx, matches).print_passes();
11351123
return true;
11361124
}
11371125

11381126
false
11391127
}
11401128

1129+
/// Get the codegen backend based on the raw [`Matches`].
1130+
///
1131+
/// `rustc -vV` and `rustc -Cpasses=list` need to get the codegen backend before we have parsed all
1132+
/// arguments and creates a [`Session`]. This function reads `-Zcodegen-backend` and `--sysroot`
1133+
/// without validating any other arguments and loads the codegen backend based on these arguments.
1134+
fn get_backend_from_raw_matches(
1135+
early_dcx: &EarlyDiagCtxt,
1136+
matches: &Matches,
1137+
) -> Box<dyn CodegenBackend> {
1138+
let debug_flags = matches.opt_strs("Z");
1139+
let backend_name = debug_flags.iter().find_map(|x| x.strip_prefix("codegen-backend="));
1140+
let opts = config::Options::default();
1141+
let sysroot = filesearch::materialize_sysroot(matches.opt_str("sysroot").map(PathBuf::from));
1142+
let target = config::build_target_config(early_dcx, &opts, &sysroot);
1143+
1144+
get_codegen_backend(early_dcx, &sysroot, backend_name, &target)
1145+
}
1146+
11411147
fn describe_debug_flags() {
11421148
safe_println!("\nAvailable options:\n");
11431149
print_flag_list("-Z", config::Z_OPTIONS);

0 commit comments

Comments
 (0)