@@ -2,7 +2,7 @@ use rustc_data_structures::captures::Captures;
2
2
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
- use rustc_index:: { IndexSlice , IndexVec } ;
5
+ use rustc_index:: IndexVec ;
6
6
use rustc_middle:: mir:: { self , BasicBlock , Terminator , TerminatorKind } ;
7
7
8
8
use std:: cmp:: Ordering ;
@@ -81,9 +81,23 @@ impl CoverageGraph {
81
81
IndexVec < BasicBlock , Option < BasicCoverageBlock > > ,
82
82
) {
83
83
let num_basic_blocks = mir_body. basic_blocks . len ( ) ;
84
- let mut bcbs = IndexVec :: with_capacity ( num_basic_blocks) ;
84
+ let mut bcbs = IndexVec :: < BasicCoverageBlock , _ > :: with_capacity ( num_basic_blocks) ;
85
85
let mut bb_to_bcb = IndexVec :: from_elem_n ( None , num_basic_blocks) ;
86
86
87
+ let mut add_basic_coverage_block = |basic_blocks : & mut Vec < BasicBlock > | {
88
+ // Take the accumulated list of blocks, leaving the vector empty
89
+ // to be used by subsequent BCBs.
90
+ let basic_blocks = std:: mem:: take ( basic_blocks) ;
91
+
92
+ let bcb = bcbs. next_index ( ) ;
93
+ for & bb in basic_blocks. iter ( ) {
94
+ bb_to_bcb[ bb] = Some ( bcb) ;
95
+ }
96
+ let bcb_data = BasicCoverageBlockData :: from ( basic_blocks) ;
97
+ debug ! ( "adding bcb{}: {:?}" , bcb. index( ) , bcb_data) ;
98
+ bcbs. push ( bcb_data) ;
99
+ } ;
100
+
87
101
// Walk the MIR CFG using a Preorder traversal, which starts from `START_BLOCK` and follows
88
102
// each block terminator's `successors()`. Coverage spans must map to actual source code,
89
103
// so compiler generated blocks and paths can be ignored. To that end, the CFG traversal
@@ -113,38 +127,20 @@ impl CoverageGraph {
113
127
predecessors = ?& mir_body. basic_blocks. predecessors( ) [ bb] ,
114
128
"can't chain from {prev:?} to {bb:?}"
115
129
) ;
116
- Self :: add_basic_coverage_block (
117
- & mut bcbs,
118
- & mut bb_to_bcb,
119
- basic_blocks. split_off ( 0 ) ,
120
- ) ;
130
+ add_basic_coverage_block ( & mut basic_blocks) ;
121
131
}
122
132
123
133
basic_blocks. push ( bb) ;
124
134
}
125
135
126
136
if !basic_blocks. is_empty ( ) {
127
137
debug ! ( "flushing accumulated blocks into one last BCB" ) ;
128
- Self :: add_basic_coverage_block ( & mut bcbs , & mut bb_to_bcb , basic_blocks. split_off ( 0 ) ) ;
138
+ add_basic_coverage_block ( & mut basic_blocks) ;
129
139
}
130
140
131
141
( bcbs, bb_to_bcb)
132
142
}
133
143
134
- fn add_basic_coverage_block (
135
- bcbs : & mut IndexVec < BasicCoverageBlock , BasicCoverageBlockData > ,
136
- bb_to_bcb : & mut IndexSlice < BasicBlock , Option < BasicCoverageBlock > > ,
137
- basic_blocks : Vec < BasicBlock > ,
138
- ) {
139
- let bcb = bcbs. next_index ( ) ;
140
- for & bb in basic_blocks. iter ( ) {
141
- bb_to_bcb[ bb] = Some ( bcb) ;
142
- }
143
- let bcb_data = BasicCoverageBlockData :: from ( basic_blocks) ;
144
- debug ! ( "adding bcb{}: {:?}" , bcb. index( ) , bcb_data) ;
145
- bcbs. push ( bcb_data) ;
146
- }
147
-
148
144
#[ inline( always) ]
149
145
pub fn iter_enumerated (
150
146
& self ,
0 commit comments