@@ -2,10 +2,27 @@ use crate::ty::query::config::QueryAccessors;
2
2
use crate :: ty:: query:: plumbing:: QueryState ;
3
3
use crate :: ty:: query:: queries;
4
4
use crate :: ty:: TyCtxt ;
5
+ use rustc_hir:: def_id:: { DefId , LOCAL_CRATE } ;
5
6
6
7
use std:: any:: type_name;
7
8
use std:: mem;
8
9
10
+ trait KeyStats {
11
+ fn key_stats ( & self , stats : & mut QueryStats ) ;
12
+ }
13
+
14
+ impl < T > KeyStats for T {
15
+ default fn key_stats ( & self , _: & mut QueryStats ) { }
16
+ }
17
+
18
+ impl KeyStats for DefId {
19
+ fn key_stats ( & self , stats : & mut QueryStats ) {
20
+ if self . krate == LOCAL_CRATE {
21
+ stats. local_def_id_keys = Some ( stats. local_def_id_keys . unwrap_or ( 0 ) + 1 ) ;
22
+ }
23
+ }
24
+ }
25
+
9
26
#[ derive( Clone ) ]
10
27
struct QueryStats {
11
28
name : & ' static str ,
@@ -15,13 +32,14 @@ struct QueryStats {
15
32
value_size : usize ,
16
33
value_type : & ' static str ,
17
34
entry_count : usize ,
35
+ local_def_id_keys : Option < usize > ,
18
36
}
19
37
20
38
fn stats < ' tcx , Q : QueryAccessors < ' tcx > > (
21
39
name : & ' static str ,
22
40
map : & QueryState < ' tcx , Q > ,
23
41
) -> QueryStats {
24
- QueryStats {
42
+ let mut stats = QueryStats {
25
43
name,
26
44
#[ cfg( debug_assertions) ]
27
45
cache_hits : map. cache_hits ,
@@ -32,7 +50,14 @@ fn stats<'tcx, Q: QueryAccessors<'tcx>>(
32
50
value_size : mem:: size_of :: < Q :: Value > ( ) ,
33
51
value_type : type_name :: < Q :: Value > ( ) ,
34
52
entry_count : map. iter_results ( |results| results. count ( ) ) ,
35
- }
53
+ local_def_id_keys : None ,
54
+ } ;
55
+ map. iter_results ( |results| {
56
+ for ( key, _, _) in results {
57
+ key. key_stats ( & mut stats)
58
+ }
59
+ } ) ;
60
+ stats
36
61
}
37
62
38
63
pub fn print_stats ( tcx : TyCtxt < ' _ > ) {
@@ -78,6 +103,14 @@ pub fn print_stats(tcx: TyCtxt<'_>) {
78
103
for q in query_value_count. iter ( ) . rev ( ) {
79
104
println ! ( " {} - {}" , q. name, q. entry_count) ;
80
105
}
106
+
107
+ let mut def_id_density: Vec < _ > =
108
+ queries. iter ( ) . filter ( |q| q. local_def_id_keys . is_some ( ) ) . collect ( ) ;
109
+ def_id_density. sort_by_key ( |q| q. local_def_id_keys . unwrap ( ) ) ;
110
+ println ! ( "\n Local DefId density:" ) ;
111
+ for q in def_id_density. iter ( ) . rev ( ) {
112
+ println ! ( " {} - {}" , q. name, q. local_def_id_keys. unwrap( ) ) ;
113
+ }
81
114
}
82
115
83
116
macro_rules! print_stats {
0 commit comments