@@ -146,7 +146,7 @@ fn default_compiler_for_checking_rustc(builder: &Builder<'_>) -> Compiler {
146
146
}
147
147
148
148
/// Checks rustc using `build_compiler` and copies the built
149
- /// .rmeta files into the sysroot of `build_copoiler `.
149
+ /// .rmeta files into the sysroot of `build_compiler `.
150
150
#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
151
151
pub struct Rustc {
152
152
/// Compiler that will check this rustc.
@@ -251,8 +251,19 @@ impl Step for Rustc {
251
251
}
252
252
}
253
253
254
+ /// Prepares a build compiler sysroot that will check a `Mode::ToolRustc` tool.
255
+ /// Also checks rustc using this compiler, to prepare .rmetas that the tool will link to.
256
+ fn prepare_compiler_for_tool_rustc ( builder : & Builder < ' _ > , target : TargetSelection ) -> Compiler {
257
+ // When we check tool stage N, we check it with compiler stage N-1
258
+ let build_compiler = builder. compiler ( builder. top_stage - 1 , builder. config . host_target ) ;
259
+ builder. ensure ( Rustc :: new ( builder, build_compiler, target) ) ;
260
+ build_compiler
261
+ }
262
+
263
+ /// Checks a single codegen backend.
254
264
#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
255
265
pub struct CodegenBackend {
266
+ pub build_compiler : Compiler ,
256
267
pub target : TargetSelection ,
257
268
pub backend : & ' static str ,
258
269
}
@@ -267,8 +278,10 @@ impl Step for CodegenBackend {
267
278
}
268
279
269
280
fn make_run ( run : RunConfig < ' _ > ) {
281
+ // FIXME: only check the backend(s) that were actually selected in run.paths
282
+ let build_compiler = prepare_compiler_for_tool_rustc ( run. builder , run. target ) ;
270
283
for & backend in & [ "cranelift" , "gcc" ] {
271
- run. builder . ensure ( CodegenBackend { target : run. target , backend } ) ;
284
+ run. builder . ensure ( CodegenBackend { build_compiler , target : run. target , backend } ) ;
272
285
}
273
286
}
274
287
@@ -279,15 +292,13 @@ impl Step for CodegenBackend {
279
292
return ;
280
293
}
281
294
282
- let compiler = builder . compiler ( builder . top_stage , builder . config . host_target ) ;
295
+ let build_compiler = self . build_compiler ;
283
296
let target = self . target ;
284
297
let backend = self . backend ;
285
298
286
- builder. ensure ( Rustc :: new ( target, builder) ) ;
287
-
288
299
let mut cargo = builder:: Cargo :: new (
289
300
builder,
290
- compiler ,
301
+ build_compiler ,
291
302
Mode :: Codegen ,
292
303
SourceType :: InTree ,
293
304
target,
@@ -297,15 +308,19 @@ impl Step for CodegenBackend {
297
308
cargo
298
309
. arg ( "--manifest-path" )
299
310
. arg ( builder. src . join ( format ! ( "compiler/rustc_codegen_{backend}/Cargo.toml" ) ) ) ;
300
- rustc_cargo_env ( builder, & mut cargo, target, compiler . stage ) ;
311
+ rustc_cargo_env ( builder, & mut cargo, target, build_compiler . stage ) ;
301
312
302
- let _guard = builder. msg_check ( backend, target, None ) ;
313
+ let _guard = builder. msg_check ( & format ! ( "rustc_codegen_{ backend}" ) , target, None ) ;
303
314
304
- let stamp = build_stamp:: codegen_backend_stamp ( builder, compiler , target, backend)
315
+ let stamp = build_stamp:: codegen_backend_stamp ( builder, build_compiler , target, backend)
305
316
. with_prefix ( "check" ) ;
306
317
307
318
run_cargo ( builder, cargo, builder. config . free_args . clone ( ) , & stamp, vec ! [ ] , true , false ) ;
308
319
}
320
+
321
+ fn metadata ( & self ) -> Option < StepMetadata > {
322
+ Some ( StepMetadata :: check ( self . backend , self . target ) . built_by ( self . build_compiler ) )
323
+ }
309
324
}
310
325
311
326
#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
0 commit comments