@@ -16,7 +16,7 @@ use rustc_parse::maybe_new_parser_from_source_str;
16
16
use rustc_query_impl:: QueryCtxt ;
17
17
use rustc_query_system:: query:: print_query_stack;
18
18
use rustc_session:: config:: { self , Cfg , CheckCfg , ExpectedValues , Input , OutFileName } ;
19
- use rustc_session:: filesearch:: sysroot_candidates;
19
+ use rustc_session:: filesearch:: { self , sysroot_candidates} ;
20
20
use rustc_session:: parse:: ParseSess ;
21
21
use rustc_session:: { lint, CompilerIO , EarlyDiagCtxt , Session } ;
22
22
use rustc_span:: source_map:: FileLoader ;
@@ -339,16 +339,53 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
339
339
340
340
let early_dcx = EarlyDiagCtxt :: new ( config. opts . error_format ) ;
341
341
342
- let codegen_backend = if let Some ( make_codegen_backend) = config. make_codegen_backend {
343
- make_codegen_backend ( & config. opts )
344
- } else {
345
- util:: get_codegen_backend (
346
- & early_dcx,
347
- & config. opts . maybe_sysroot ,
348
- config. opts . unstable_opts . codegen_backend . as_deref ( ) ,
349
- )
342
+ let sysroot = filesearch:: materialize_sysroot ( config. opts . maybe_sysroot . clone ( ) ) ;
343
+
344
+ let ( codegen_backend, target_override) = 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
+ ( backend, target_override)
372
+ }
373
+ Some ( make_codegen_backend) => {
374
+ // N.B. `make_codegen_backend` takes precedence over `target.default_codegen_backend`,
375
+ // which is ignored in this case.
376
+ let backend = make_codegen_backend ( & config. opts ) ;
377
+
378
+ // target_override is documented to be called before init(), so this is okay
379
+ let target_override = backend. target_override ( & config. opts ) ;
380
+
381
+ ( backend, target_override)
382
+ }
350
383
} ;
351
384
385
+ // Re-build target with the (potential) override
386
+ let target_cfg =
387
+ config:: build_target_config ( & early_dcx, & config. opts , target_override, & sysroot) ;
388
+
352
389
let temps_dir = config. opts . unstable_opts . temps_dir . as_deref ( ) . map ( PathBuf :: from) ;
353
390
354
391
let bundle = match rustc_errors:: fluent_bundle (
@@ -367,9 +404,6 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
367
404
let mut locale_resources = Vec :: from ( config. locale_resources ) ;
368
405
locale_resources. push ( codegen_backend. locale_resource ( ) ) ;
369
406
370
- // target_override is documented to be called before init(), so this is okay
371
- let target_override = codegen_backend. target_override ( & config. opts ) ;
372
-
373
407
let mut sess = rustc_session:: build_session (
374
408
early_dcx,
375
409
config. opts ,
@@ -384,7 +418,8 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
384
418
locale_resources,
385
419
config. lint_caps ,
386
420
config. file_loader ,
387
- target_override,
421
+ target_cfg,
422
+ sysroot,
388
423
util:: rustc_version_str ( ) . unwrap_or ( "unknown" ) ,
389
424
config. ice_file ,
390
425
config. using_internal_features ,
0 commit comments