@@ -16,7 +16,6 @@ use rustc_expand::proc_macro::{AttrProcMacro, BangProcMacro, ProcMacroDerive};
16
16
use rustc_hir as hir;
17
17
use rustc_hir:: def:: { CtorKind , CtorOf , DefKind , Res } ;
18
18
use rustc_hir:: def_id:: { CrateNum , DefId , DefIndex , CRATE_DEF_INDEX , LOCAL_CRATE } ;
19
- use rustc_hir:: definitions:: DefPathTable ;
20
19
use rustc_hir:: definitions:: { DefKey , DefPath , DefPathData , DefPathHash } ;
21
20
use rustc_hir:: lang_items;
22
21
use rustc_index:: vec:: { Idx , IndexVec } ;
@@ -29,7 +28,6 @@ use rustc_middle::mir::interpret::{AllocDecodingSession, AllocDecodingState};
29
28
use rustc_middle:: mir:: { self , Body , Promoted } ;
30
29
use rustc_middle:: ty:: codec:: TyDecoder ;
31
30
use rustc_middle:: ty:: { self , Ty , TyCtxt } ;
32
- use rustc_middle:: util:: common:: record_time;
33
31
use rustc_serialize:: { opaque, Decodable , Decoder } ;
34
32
use rustc_session:: Session ;
35
33
use rustc_span:: hygiene:: ExpnDataDecodeMode ;
@@ -69,12 +67,6 @@ crate struct CrateMetadata {
69
67
/// universal (`for<'tcx>`), that is paired up with whichever `TyCtxt`
70
68
/// is being used to decode those values.
71
69
root : CrateRoot < ' static > ,
72
- /// For each definition in this crate, we encode a key. When the
73
- /// crate is loaded, we read all the keys and put them in this
74
- /// hashmap, which gives the reverse mapping. This allows us to
75
- /// quickly retrace a `DefPath`, which is needed for incremental
76
- /// compilation support.
77
- def_path_table : DefPathTable ,
78
70
/// Trait impl data.
79
71
/// FIXME: Used only from queries and can use query cache,
80
72
/// so pre-decoding can probably be avoided.
@@ -91,6 +83,10 @@ crate struct CrateMetadata {
91
83
/// Do not access the value directly, as it might not have been initialized yet.
92
84
/// The field must always be initialized to `DepNodeIndex::INVALID`.
93
85
dep_node_index : AtomicCell < DepNodeIndex > ,
86
+ /// Caches decoded `DefKey`s.
87
+ def_key_cache : Lock < FxHashMap < DefIndex , DefKey > > ,
88
+ /// Caches decoded `DefPathHash`es.
89
+ def_path_hash_cache : Lock < FxHashMap < DefIndex , DefPathHash > > ,
94
90
95
91
// --- Other significant crate properties ---
96
92
/// ID of this crate, from the current compilation session's point of view.
@@ -807,7 +803,7 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
807
803
data. has_auto_impl ,
808
804
data. is_marker ,
809
805
data. specialization_kind ,
810
- self . def_path_table . def_path_hash ( item_id) ,
806
+ self . def_path_hash ( item_id) ,
811
807
)
812
808
}
813
809
EntryKind :: TraitAlias => ty:: TraitDef :: new (
@@ -817,7 +813,7 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
817
813
false ,
818
814
false ,
819
815
ty:: trait_def:: TraitSpecializationKind :: None ,
820
- self . def_path_table . def_path_hash ( item_id) ,
816
+ self . def_path_hash ( item_id) ,
821
817
) ,
822
818
_ => bug ! ( "def-index does not refer to trait or trait alias" ) ,
823
819
}
@@ -1509,12 +1505,14 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
1509
1505
1510
1506
#[ inline]
1511
1507
fn def_key ( & self , index : DefIndex ) -> DefKey {
1512
- let mut key = self . def_path_table . def_key ( index) ;
1513
- if self . is_proc_macro ( index) {
1514
- let name = self . raw_proc_macro ( index) . name ( ) ;
1515
- key. disambiguated_data . data = DefPathData :: MacroNs ( Symbol :: intern ( name) ) ;
1516
- }
1517
- key
1508
+ * self . def_key_cache . lock ( ) . entry ( index) . or_insert_with ( || {
1509
+ let mut key = self . root . tables . def_keys . get ( self , index) . unwrap ( ) . decode ( self ) ;
1510
+ if self . is_proc_macro ( index) {
1511
+ let name = self . raw_proc_macro ( index) . name ( ) ;
1512
+ key. disambiguated_data . data = DefPathData :: MacroNs ( Symbol :: intern ( name) ) ;
1513
+ }
1514
+ key
1515
+ } )
1518
1516
}
1519
1517
1520
1518
// Returns the path leading to the thing with this `id`.
@@ -1723,9 +1721,6 @@ impl CrateMetadata {
1723
1721
private_dep : bool ,
1724
1722
host_hash : Option < Svh > ,
1725
1723
) -> CrateMetadata {
1726
- let def_path_table = record_time ( & sess. perf_stats . decode_def_path_tables_time , || {
1727
- root. def_path_table . decode ( ( & blob, sess) )
1728
- } ) ;
1729
1724
let trait_impls = root
1730
1725
. impls
1731
1726
. decode ( ( & blob, sess) )
@@ -1737,7 +1732,6 @@ impl CrateMetadata {
1737
1732
CrateMetadata {
1738
1733
blob,
1739
1734
root,
1740
- def_path_table,
1741
1735
trait_impls,
1742
1736
raw_proc_macros,
1743
1737
source_map_import_info : OnceCell :: new ( ) ,
@@ -1752,6 +1746,8 @@ impl CrateMetadata {
1752
1746
host_hash,
1753
1747
extern_crate : Lock :: new ( None ) ,
1754
1748
hygiene_context : Default :: default ( ) ,
1749
+ def_key_cache : Default :: default ( ) ,
1750
+ def_path_hash_cache : Default :: default ( ) ,
1755
1751
}
1756
1752
}
1757
1753
@@ -1828,6 +1824,10 @@ impl CrateMetadata {
1828
1824
self . root . hash
1829
1825
}
1830
1826
1827
+ fn num_def_ids ( & self ) -> usize {
1828
+ self . root . tables . def_keys . size ( )
1829
+ }
1830
+
1831
1831
fn local_def_id ( & self , index : DefIndex ) -> DefId {
1832
1832
DefId { krate : self . cnum , index }
1833
1833
}
@@ -1843,10 +1843,34 @@ impl CrateMetadata {
1843
1843
1844
1844
None
1845
1845
}
1846
+ }
1847
+
1848
+ impl < ' a , ' tcx > CrateMetadataRef < ' a > {
1849
+ fn def_path_hash_unlocked (
1850
+ & self ,
1851
+ index : DefIndex ,
1852
+ def_path_hashes : & mut FxHashMap < DefIndex , DefPathHash > ,
1853
+ ) -> DefPathHash {
1854
+ * def_path_hashes. entry ( index) . or_insert_with ( || {
1855
+ self . root . tables . def_path_hashes . get ( self , index) . unwrap ( ) . decode ( self )
1856
+ } )
1857
+ }
1846
1858
1847
1859
#[ inline]
1848
1860
fn def_path_hash ( & self , index : DefIndex ) -> DefPathHash {
1849
- self . def_path_table . def_path_hash ( index)
1861
+ let mut def_path_hashes = self . def_path_hash_cache . lock ( ) ;
1862
+ self . def_path_hash_unlocked ( index, & mut def_path_hashes)
1863
+ }
1864
+
1865
+ fn all_def_path_hashes_and_def_ids ( & self ) -> Vec < ( DefPathHash , DefId ) > {
1866
+ let mut result = Vec :: new ( ) ;
1867
+ let mut def_path_hashes = self . def_path_hash_cache . lock ( ) ;
1868
+ for index in 0 ..self . num_def_ids ( ) {
1869
+ let index = DefIndex :: from_usize ( index) ;
1870
+ let def_path_hash = self . def_path_hash_unlocked ( index, & mut def_path_hashes) ;
1871
+ result. push ( ( def_path_hash, self . local_def_id ( index) ) ) ;
1872
+ }
1873
+ result
1850
1874
}
1851
1875
1852
1876
/// Get the `DepNodeIndex` corresponding this crate. The result of this
0 commit comments