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