@@ -16,7 +16,7 @@ use rustc_parse::maybe_new_parser_from_source_str;
1616use rustc_query_impl:: QueryCtxt ;
1717use rustc_query_system:: query:: print_query_stack;
1818use rustc_session:: config:: { self , Cfg , CheckCfg , ExpectedValues , Input , OutFileName } ;
19- use rustc_session:: filesearch:: sysroot_candidates;
19+ use rustc_session:: filesearch:: { self , sysroot_candidates} ;
2020use rustc_session:: parse:: ParseSess ;
2121use rustc_session:: { lint, CompilerIO , EarlyDiagCtxt , Session } ;
2222use rustc_span:: source_map:: FileLoader ;
@@ -336,14 +336,66 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
336336
337337 let early_dcx = EarlyDiagCtxt :: new ( config. opts . error_format ) ;
338338
339- let codegen_backend = if let Some ( make_codegen_backend) = config. make_codegen_backend {
340- make_codegen_backend ( & config. opts )
341- } else {
342- util:: get_codegen_backend (
343- & early_dcx,
344- & config. opts . maybe_sysroot ,
345- config. opts . unstable_opts . codegen_backend . as_deref ( ) ,
346- )
339+ let sysroot = match & config. opts . maybe_sysroot {
340+ Some ( sysroot) => sysroot. clone ( ) ,
341+ None => filesearch:: get_or_default_sysroot ( ) . expect ( "Failed finding sysroot" ) ,
342+ } ;
343+
344+ let ( codegen_backend, target_cfg) = match config. make_codegen_backend {
345+ None => {
346+ // Build a target without override, so that it can override the backend if needed
347+ let target =
348+ config:: build_target_config ( & early_dcx, & config. opts , None , & sysroot) ;
349+
350+ let backend = util:: get_codegen_backend (
351+ & early_dcx,
352+ & sysroot,
353+ config. opts . unstable_opts . codegen_backend . as_deref ( ) ,
354+ & target,
355+ ) ;
356+
357+ // target_override is documented to be called before init(), so this is okay
358+ let target_override = backend. target_override ( & config. opts ) ;
359+
360+ // Assert that we don't use target's override of the backend and
361+ // backend's override of the target at the same time
362+ if config. opts . unstable_opts . codegen_backend . is_none ( )
363+ && target. default_codegen_backend . is_some ( )
364+ && target_override. is_some ( )
365+ {
366+ rustc_middle:: bug!(
367+ "Codegen backend requested target override even though the target requested the backend"
368+ ) ;
369+ }
370+
371+ // Re-build target with the (potential) override
372+ let target = config:: build_target_config (
373+ & early_dcx,
374+ & config. opts ,
375+ target_override,
376+ & sysroot,
377+ ) ;
378+
379+ ( backend, target)
380+ }
381+ Some ( make_codegen_backend) => {
382+ // N.B. `make_codegen_backend` takes precedence over `target.default_codegen_backend`,
383+ // which is ignored in this case.
384+
385+ let backend = make_codegen_backend ( & config. opts ) ;
386+
387+ // target_override is documented to be called before init(), so this is okay
388+ let target_override = backend. target_override ( & config. opts ) ;
389+
390+ let target = config:: build_target_config (
391+ & early_dcx,
392+ & config. opts ,
393+ target_override,
394+ & sysroot,
395+ ) ;
396+
397+ ( backend, target)
398+ }
347399 } ;
348400
349401 let temps_dir = config. opts . unstable_opts . temps_dir . as_deref ( ) . map ( PathBuf :: from) ;
@@ -364,9 +416,6 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
364416 let mut locale_resources = Vec :: from ( config. locale_resources ) ;
365417 locale_resources. push ( codegen_backend. locale_resource ( ) ) ;
366418
367- // target_override is documented to be called before init(), so this is okay
368- let target_override = codegen_backend. target_override ( & config. opts ) ;
369-
370419 let mut sess = rustc_session:: build_session (
371420 early_dcx,
372421 config. opts ,
@@ -381,7 +430,8 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
381430 locale_resources,
382431 config. lint_caps ,
383432 config. file_loader ,
384- target_override,
433+ target_cfg,
434+ sysroot,
385435 util:: rustc_version_str ( ) . unwrap_or ( "unknown" ) ,
386436 config. ice_file ,
387437 config. using_internal_features ,
0 commit comments