Skip to content

Commit 9ec370d

Browse files
committed
bless both 32bit and 64bit variants of mir-opt when available
1 parent 1c26f1b commit 9ec370d

File tree

1 file changed

+70
-8
lines changed

1 file changed

+70
-8
lines changed

src/bootstrap/test.rs

Lines changed: 70 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,22 @@ use crate::{envify, CLang, DocTests, GitRepo, Mode};
3030

3131
const ADB_TEST_DIR: &str = "/data/local/tmp/work";
3232

33+
// mir-opt tests have different variants depending on whether a target is 32bit or 64bit, and
34+
// blessing them requires blessing with each target. To aid developers, when blessing the mir-opt
35+
// test suite the corresponding target of the opposite pointer size is also blessed.
36+
//
37+
// This array serves as the known mappings between 32bit and 64bit targets. If you're developing on
38+
// a target where a target with the opposite pointer size exists, feel free to add it here.
39+
const MIR_OPT_BLESS_TARGET_MAPPING: &[(&str, &str)] = &[
40+
// (32bit, 64bit)
41+
("i686-unknown-linux-gnu", "x86_64-unknown-linux-gnu"),
42+
("i686-unknown-linux-musl", "x86_64-unknown-linux-musl"),
43+
("i686-pc-windows-msvc", "x86_64-pc-windows-msvc"),
44+
("i686-pc-windows-gnu", "x86_64-pc-windows-gnu"),
45+
("i686-apple-darwin", "x86_64-apple-darwin"),
46+
("i686-apple-darwin", "aarch64-apple-darwin"),
47+
];
48+
3349
fn try_run(builder: &Builder<'_>, cmd: &mut Command) -> bool {
3450
if !builder.fail_fast {
3551
if !builder.try_run(cmd) {
@@ -1319,14 +1335,60 @@ impl Step for MirOpt {
13191335
}
13201336

13211337
fn run(self, builder: &Builder<'_>) {
1322-
builder.ensure(Compiletest {
1323-
compiler: self.compiler,
1324-
target: self.target,
1325-
mode: "mir-opt",
1326-
suite: "mir-opt",
1327-
path: "tests/mir-opt",
1328-
compare_mode: None,
1329-
});
1338+
let run = |target| {
1339+
builder.ensure(Compiletest {
1340+
compiler: self.compiler,
1341+
target: target,
1342+
mode: "mir-opt",
1343+
suite: "mir-opt",
1344+
path: "tests/mir-opt",
1345+
compare_mode: None,
1346+
})
1347+
};
1348+
1349+
// We use custom logic to bless the mir-opt suite: mir-opt tests have multiple variants
1350+
// (32bit vs 64bit), and all of them needs to be blessed. When blessing, we try best-effort
1351+
// to also bless the other variants, to aid developers.
1352+
if builder.config.cmd.bless() {
1353+
let targets = MIR_OPT_BLESS_TARGET_MAPPING
1354+
.iter()
1355+
.filter(|(target_32bit, target_64bit)| {
1356+
*target_32bit == &*self.target.triple || *target_64bit == &*self.target.triple
1357+
})
1358+
.next()
1359+
.map(|(target_32bit, target_64bit)| {
1360+
let target_32bit = TargetSelection::from_user(target_32bit);
1361+
let target_64bit = TargetSelection::from_user(target_64bit);
1362+
1363+
// Running compiletest requires a C compiler to be available, but it might not
1364+
// have been detected by bootstrap if the target we're testing wasn't in the
1365+
// --target flags.
1366+
if !builder.cc.borrow().contains_key(&target_32bit) {
1367+
crate::cc_detect::find_target(builder, target_32bit);
1368+
}
1369+
if !builder.cc.borrow().contains_key(&target_64bit) {
1370+
crate::cc_detect::find_target(builder, target_64bit);
1371+
}
1372+
1373+
vec![target_32bit, target_64bit]
1374+
})
1375+
.unwrap_or_else(|| {
1376+
eprintln!(
1377+
"\
1378+
Note that not all variants of mir-opt tests are going to be blessed, as no mapping between
1379+
a 32bit and a 64bit target was found for {target}.
1380+
You can add that mapping by changing MIR_OPT_BLESS_TARGET_MAPPING in src/bootstrap/test.rs",
1381+
target = self.target,
1382+
);
1383+
vec![self.target]
1384+
});
1385+
1386+
for target in targets {
1387+
run(target);
1388+
}
1389+
} else {
1390+
run(self.target);
1391+
}
13301392
}
13311393
}
13321394

0 commit comments

Comments
 (0)