@@ -49,6 +49,7 @@ pub struct OnDiskCache<'sess> {
49
49
50
50
prev_cnums : Vec < ( u32 , String , CrateDisambiguator ) > ,
51
51
cnum_map : RefCell < Option < IndexVec < CrateNum , Option < CrateNum > > > > ,
52
+ prev_def_path_tables : Vec < DefPathTable > ,
52
53
53
54
_prev_filemap_starts : BTreeMap < BytePos , StableFilemapId > ,
54
55
codemap : & ' sess CodeMap ,
@@ -73,9 +74,12 @@ impl<'sess> OnDiskCache<'sess> {
73
74
debug_assert ! ( sess. opts. incremental. is_some( ) ) ;
74
75
75
76
let mut decoder = opaque:: Decoder :: new ( & data[ ..] , start_pos) ;
77
+
78
+
79
+ // Decode the header
76
80
let header = Header :: decode ( & mut decoder) . unwrap ( ) ;
77
81
78
- let prev_diagnostics = {
82
+ let ( prev_diagnostics, prev_def_path_tables ) = {
79
83
let mut decoder = CacheDecoder {
80
84
tcx : None ,
81
85
opaque : decoder,
@@ -85,21 +89,28 @@ impl<'sess> OnDiskCache<'sess> {
85
89
prev_def_path_tables : & Vec :: new ( ) ,
86
90
} ;
87
91
92
+ // Decode Diagnostics
88
93
let prev_diagnostics: FxHashMap < _ , _ > = {
89
94
let diagnostics = EncodedPrevDiagnostics :: decode ( & mut decoder)
90
95
. expect ( "Error while trying to decode prev. diagnostics \
91
96
from incr. comp. cache.") ;
92
97
diagnostics. into_iter ( ) . collect ( )
93
98
} ;
94
99
95
- prev_diagnostics
100
+ // Decode DefPathTables
101
+ let prev_def_path_tables: Vec < DefPathTable > =
102
+ Decodable :: decode ( & mut decoder)
103
+ . expect ( "Error while trying to decode cached DefPathTables" ) ;
104
+
105
+ ( prev_diagnostics, prev_def_path_tables)
96
106
} ;
97
107
98
108
OnDiskCache {
99
109
prev_diagnostics,
100
110
_prev_filemap_starts : header. prev_filemap_starts ,
101
111
prev_cnums : header. prev_cnums ,
102
112
cnum_map : RefCell :: new ( None ) ,
113
+ prev_def_path_tables,
103
114
codemap : sess. codemap ( ) ,
104
115
current_diagnostics : RefCell :: new ( FxHashMap ( ) ) ,
105
116
}
@@ -111,6 +122,7 @@ impl<'sess> OnDiskCache<'sess> {
111
122
_prev_filemap_starts : BTreeMap :: new ( ) ,
112
123
prev_cnums : vec ! [ ] ,
113
124
cnum_map : RefCell :: new ( None ) ,
125
+ prev_def_path_tables : Vec :: new ( ) ,
114
126
codemap,
115
127
current_diagnostics : RefCell :: new ( FxHashMap ( ) ) ,
116
128
}
@@ -166,6 +178,22 @@ impl<'sess> OnDiskCache<'sess> {
166
178
167
179
diagnostics. encode ( & mut encoder) ?;
168
180
181
+
182
+ // Encode all DefPathTables
183
+ let upstream_def_path_tables = tcx. all_crate_nums ( LOCAL_CRATE )
184
+ . iter ( )
185
+ . map ( |& cnum| ( cnum, cstore. def_path_table ( cnum) ) )
186
+ . collect :: < FxHashMap < _ , _ > > ( ) ;
187
+ let def_path_tables: Vec < & DefPathTable > = sorted_cnums. into_iter ( ) . map ( |cnum| {
188
+ if cnum == LOCAL_CRATE {
189
+ tcx. hir . definitions ( ) . def_path_table ( )
190
+ } else {
191
+ & * upstream_def_path_tables[ & cnum]
192
+ }
193
+ } ) . collect ( ) ;
194
+
195
+ def_path_tables. encode ( & mut encoder) ?;
196
+
169
197
return Ok ( ( ) ) ;
170
198
171
199
fn sorted_cnums_including_local_crate ( cstore : & CrateStore ) -> Vec < CrateNum > {
0 commit comments