|
8 | 8 | // option. This file may not be copied, modified, or distributed
|
9 | 9 | // except according to those terms.
|
10 | 10 |
|
11 |
| -use rustc::dep_graph::DepGraph; |
| 11 | +use rustc::dep_graph::{DepGraph, DepKind}; |
12 | 12 | use rustc::hir::def_id::DefId;
|
13 | 13 | use rustc::hir::svh::Svh;
|
14 | 14 | use rustc::ich::Fingerprint;
|
@@ -170,6 +170,77 @@ fn encode_dep_graph(tcx: TyCtxt,
|
170 | 170 |
|
171 | 171 | // Encode the graph data.
|
172 | 172 | let serialized_graph = tcx.dep_graph.serialize();
|
| 173 | + |
| 174 | + if tcx.sess.opts.debugging_opts.incremental_info { |
| 175 | + #[derive(Clone)] |
| 176 | + struct Stat { |
| 177 | + kind: DepKind, |
| 178 | + node_counter: u64, |
| 179 | + edge_counter: u64, |
| 180 | + } |
| 181 | + |
| 182 | + let total_node_count = serialized_graph.nodes.len(); |
| 183 | + let total_edge_count = serialized_graph.edge_list_data.len(); |
| 184 | + |
| 185 | + let mut counts: FxHashMap<_, Stat> = FxHashMap(); |
| 186 | + |
| 187 | + for (i, &(node, _)) in serialized_graph.nodes.iter_enumerated() { |
| 188 | + let stat = counts.entry(node.kind).or_insert(Stat { |
| 189 | + kind: node.kind, |
| 190 | + node_counter: 0, |
| 191 | + edge_counter: 0, |
| 192 | + }); |
| 193 | + |
| 194 | + stat.node_counter += 1; |
| 195 | + let (edge_start, edge_end) = serialized_graph.edge_list_indices[i]; |
| 196 | + stat.edge_counter += (edge_end - edge_start) as u64; |
| 197 | + } |
| 198 | + |
| 199 | + let mut counts: Vec<_> = counts.values().cloned().collect(); |
| 200 | + counts.sort_by_key(|s| -(s.node_counter as i64)); |
| 201 | + |
| 202 | + let percentage_of_all_nodes: Vec<f64> = counts.iter().map(|s| { |
| 203 | + (100.0 * (s.node_counter as f64)) / (total_node_count as f64) |
| 204 | + }).collect(); |
| 205 | + |
| 206 | + let average_edges_per_kind: Vec<f64> = counts.iter().map(|s| { |
| 207 | + (s.edge_counter as f64) / (s.node_counter as f64) |
| 208 | + }).collect(); |
| 209 | + |
| 210 | + println!("[incremental]"); |
| 211 | + println!("[incremental] DepGraph Statistics"); |
| 212 | + |
| 213 | + const SEPARATOR: &str = "[incremental] --------------------------------\ |
| 214 | + ----------------------------------------------\ |
| 215 | + ------------"; |
| 216 | + |
| 217 | + println!("{}", SEPARATOR); |
| 218 | + println!("[incremental]"); |
| 219 | + println!("[incremental] Total Node Count: {}", total_node_count); |
| 220 | + println!("[incremental] Total Edge Count: {}", total_edge_count); |
| 221 | + println!("[incremental]"); |
| 222 | + println!("[incremental] {:<36}| {:<17}| {:<12}| {:<17}|", |
| 223 | + "Node Kind", |
| 224 | + "Node Frequency", |
| 225 | + "Node Count", |
| 226 | + "Avg. Edge Count"); |
| 227 | + println!("[incremental] -------------------------------------\ |
| 228 | + |------------------\ |
| 229 | + |-------------\ |
| 230 | + |------------------|"); |
| 231 | + |
| 232 | + for (i, stat) in counts.iter().enumerate() { |
| 233 | + println!("[incremental] {:<36}|{:>16.1}% |{:>12} |{:>17.1} |", |
| 234 | + format!("{:?}", stat.kind), |
| 235 | + percentage_of_all_nodes[i], |
| 236 | + stat.node_counter, |
| 237 | + average_edges_per_kind[i]); |
| 238 | + } |
| 239 | + |
| 240 | + println!("{}", SEPARATOR); |
| 241 | + println!("[incremental]"); |
| 242 | + } |
| 243 | + |
173 | 244 | serialized_graph.encode(encoder)?;
|
174 | 245 |
|
175 | 246 | Ok(())
|
|
0 commit comments