@@ -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 ;
@@ -336,14 +336,66 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
336
336
337
337
let early_dcx = EarlyDiagCtxt :: new ( config. opts . error_format ) ;
338
338
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
+ }
347
399
} ;
348
400
349
401
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
364
416
let mut locale_resources = Vec :: from ( config. locale_resources ) ;
365
417
locale_resources. push ( codegen_backend. locale_resource ( ) ) ;
366
418
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
-
370
419
let mut sess = rustc_session:: build_session (
371
420
early_dcx,
372
421
config. opts ,
@@ -381,7 +430,8 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
381
430
locale_resources,
382
431
config. lint_caps ,
383
432
config. file_loader ,
384
- target_override,
433
+ target_cfg,
434
+ sysroot,
385
435
util:: rustc_version_str ( ) . unwrap_or ( "unknown" ) ,
386
436
config. ice_file ,
387
437
config. using_internal_features ,
0 commit comments