@@ -3,7 +3,7 @@ use rustc_data_structures::graph::dominators::{self, Dominators};
3
3
use rustc_data_structures::graph::{self, GraphSuccessors, WithNumNodes, WithStartNode};
4
4
use rustc_index::bit_set::BitSet;
5
5
use rustc_index::{IndexSlice, IndexVec};
6
- use rustc_middle::mir::{self, BasicBlock, Terminator, TerminatorKind};
6
+ use rustc_middle::mir::{self, BasicBlock, TerminatorKind};
7
7
8
8
use std::cmp::Ordering;
9
9
use std::ops::{Index, IndexMut};
@@ -37,9 +37,8 @@ impl CoverageGraph {
37
37
}
38
38
let bcb_data = &bcbs[bcb];
39
39
let mut bcb_successors = Vec::new();
40
- for successor in
41
- bcb_filtered_successors(&mir_body, &bcb_data.terminator(mir_body).kind)
42
- .filter_map(|successor_bb| bb_to_bcb[successor_bb])
40
+ for successor in bcb_filtered_successors(&mir_body, bcb_data.last_bb())
41
+ .filter_map(|successor_bb| bb_to_bcb[successor_bb])
43
42
{
44
43
if !seen[successor] {
45
44
seen[successor] = true;
@@ -316,11 +315,6 @@ impl BasicCoverageBlockData {
316
315
pub fn last_bb(&self) -> BasicBlock {
317
316
*self.basic_blocks.last().unwrap()
318
317
}
319
-
320
- #[inline(always)]
321
- pub fn terminator<'a, 'tcx>(&self, mir_body: &'a mir::Body<'tcx>) -> &'a Terminator<'tcx> {
322
- &mir_body[self.last_bb()].terminator()
323
- }
324
318
}
325
319
326
320
/// Represents a successor from a branching BasicCoverageBlock (such as the arms of a `SwitchInt`)
@@ -362,26 +356,28 @@ impl std::fmt::Debug for BcbBranch {
362
356
}
363
357
}
364
358
365
- // Returns the `Terminator`s non-unwind successors.
359
+ // Returns the subset of a block's successors that are relevant to the coverage
360
+ // graph, i.e. those that do not represent unwinds or unreachable branches.
366
361
// FIXME(#78544): MIR InstrumentCoverage: Improve coverage of `#[should_panic]` tests and
367
362
// `catch_unwind()` handlers.
368
363
fn bcb_filtered_successors<'a, 'tcx>(
369
364
body: &'a mir::Body<'tcx>,
370
- term_kind: &'a TerminatorKind<'tcx>,
371
- ) -> Box<dyn Iterator<Item = BasicBlock> + 'a> {
372
- Box::new(
373
- match &term_kind {
374
- // SwitchInt successors are never unwind, and all of them should be traversed.
375
- TerminatorKind::SwitchInt { ref targets, .. } => {
376
- None.into_iter().chain(targets.all_targets().into_iter().copied())
377
- }
378
- // For all other kinds, return only the first successor, if any, and ignore unwinds.
379
- // NOTE: `chain(&[])` is required to coerce the `option::iter` (from
380
- // `next().into_iter()`) into the `mir::Successors` aliased type.
381
- _ => term_kind.successors().next().into_iter().chain((&[]).into_iter().copied()),
382
- }
383
- .filter(move |&successor| body[successor].terminator().kind != TerminatorKind::Unreachable),
384
- )
365
+ bb: BasicBlock,
366
+ ) -> impl Iterator<Item = BasicBlock> + Captures<'a> + Captures<'tcx> {
367
+ let terminator = body[bb].terminator();
368
+
369
+ let take_n_successors = match terminator.kind {
370
+ // SwitchInt successors are never unwinds, so all of them should be traversed.
371
+ TerminatorKind::SwitchInt { .. } => usize::MAX,
372
+ // For all other kinds, return only the first successor (if any), ignoring any
373
+ // unwind successors.
374
+ _ => 1,
375
+ };
376
+
377
+ terminator
378
+ .successors()
379
+ .take(take_n_successors)
380
+ .filter(move |&successor| body[successor].terminator().kind != TerminatorKind::Unreachable)
385
381
}
386
382
387
383
/// Maintains separate worklists for each loop in the BasicCoverageBlock CFG, plus one for the
@@ -558,7 +554,7 @@ fn short_circuit_preorder<'a, 'tcx, F, Iter>(
558
554
filtered_successors: F,
559
555
) -> impl Iterator<Item = BasicBlock> + Captures<'a> + Captures<'tcx>
560
556
where
561
- F: Fn(&'a mir::Body<'tcx>, &'a TerminatorKind<'tcx> ) -> Iter,
557
+ F: Fn(&'a mir::Body<'tcx>, BasicBlock ) -> Iter,
562
558
Iter: Iterator<Item = BasicBlock>,
563
559
{
564
560
let mut visited = BitSet::new_empty(body.basic_blocks.len());
@@ -570,7 +566,7 @@ where
570
566
continue;
571
567
}
572
568
573
- worklist.extend(filtered_successors(body, &body[bb].terminator().kind ));
569
+ worklist.extend(filtered_successors(body, bb ));
574
570
575
571
return Some(bb);
576
572
}
0 commit comments