Skip to content

Commit a82dc1d

Browse files
committed
Reimplement the dep_graph.
1 parent 15a17ee commit a82dc1d

File tree

13 files changed

+593
-1056
lines changed

13 files changed

+593
-1056
lines changed

compiler/rustc_incremental/src/persist/dirty_clean.rs

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,14 @@
1414
//! the required condition is not met.
1515
1616
use rustc_ast::{self as ast, Attribute, NestedMetaItem};
17-
use rustc_data_structures::fingerprint::Fingerprint;
1817
use rustc_data_structures::fx::FxHashSet;
1918
use rustc_hir as hir;
2019
use rustc_hir::def_id::{DefId, LocalDefId};
2120
use rustc_hir::intravisit;
2221
use rustc_hir::itemlikevisit::ItemLikeVisitor;
2322
use rustc_hir::Node as HirNode;
2423
use rustc_hir::{ImplItemKind, ItemKind as HirItem, TraitItemKind};
25-
use rustc_middle::dep_graph::{label_strs, DepNode, DepNodeExt};
24+
use rustc_middle::dep_graph::{label_strs, DepNode, DepNodeColor, DepNodeExt};
2625
use rustc_middle::hir::map::Map;
2726
use rustc_middle::ty::TyCtxt;
2827
use rustc_span::symbol::{sym, Symbol};
@@ -391,39 +390,18 @@ impl DirtyCleanVisitor<'tcx> {
391390
fn assert_dirty(&self, item_span: Span, dep_node: DepNode) {
392391
debug!("assert_dirty({:?})", dep_node);
393392

394-
let current_fingerprint = self.get_fingerprint(&dep_node);
395-
let prev_fingerprint = self.tcx.dep_graph.prev_fingerprint_of(&dep_node);
396-
397-
if current_fingerprint == prev_fingerprint {
393+
if self.tcx.dep_graph.node_color(&dep_node) == Some(DepNodeColor::Green) {
398394
let dep_node_str = self.dep_node_str(&dep_node);
399395
self.tcx
400396
.sess
401397
.span_err(item_span, &format!("`{}` should be dirty but is not", dep_node_str));
402398
}
403399
}
404400

405-
fn get_fingerprint(&self, dep_node: &DepNode) -> Option<Fingerprint> {
406-
if self.tcx.dep_graph.dep_node_exists(dep_node) {
407-
let dep_node_index = self.tcx.dep_graph.dep_node_index_of(dep_node);
408-
Some(self.tcx.dep_graph.fingerprint_of(dep_node_index))
409-
} else {
410-
None
411-
}
412-
}
413-
414401
fn assert_clean(&self, item_span: Span, dep_node: DepNode) {
415402
debug!("assert_clean({:?})", dep_node);
416403

417-
let current_fingerprint = self.get_fingerprint(&dep_node);
418-
let prev_fingerprint = self.tcx.dep_graph.prev_fingerprint_of(&dep_node);
419-
420-
// if the node wasn't previously evaluated and now is (or vice versa),
421-
// then the node isn't actually clean or dirty.
422-
if (current_fingerprint == None) ^ (prev_fingerprint == None) {
423-
return;
424-
}
425-
426-
if current_fingerprint != prev_fingerprint {
404+
if self.tcx.dep_graph.node_color(&dep_node) == Some(DepNodeColor::Red) {
427405
let dep_node_str = self.dep_node_str(&dep_node);
428406
self.tcx
429407
.sess

compiler/rustc_incremental/src/persist/load.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
use rustc_data_structures::fx::FxHashMap;
44
use rustc_hir::definitions::Definitions;
5-
use rustc_middle::dep_graph::{PreviousDepGraph, SerializedDepGraph, WorkProduct, WorkProductId};
5+
use rustc_middle::dep_graph::{SerializedDepGraph, WorkProduct, WorkProductId};
66
use rustc_middle::ty::query::OnDiskCache;
77
use rustc_serialize::opaque::Decoder;
88
use rustc_serialize::Decodable as RustcDecodable;
@@ -22,8 +22,8 @@ pub enum LoadResult<T> {
2222
Error { message: String },
2323
}
2424

25-
impl LoadResult<(PreviousDepGraph, WorkProductMap)> {
26-
pub fn open(self, sess: &Session) -> (PreviousDepGraph, WorkProductMap) {
25+
impl LoadResult<(SerializedDepGraph, WorkProductMap)> {
26+
pub fn open(self, sess: &Session) -> (SerializedDepGraph, WorkProductMap) {
2727
match self {
2828
LoadResult::Error { message } => {
2929
sess.warn(&message);
@@ -84,7 +84,7 @@ impl<T> MaybeAsync<T> {
8484
}
8585
}
8686

87-
pub type DepGraphFuture = MaybeAsync<LoadResult<(PreviousDepGraph, WorkProductMap)>>;
87+
pub type DepGraphFuture = MaybeAsync<LoadResult<(SerializedDepGraph, WorkProductMap)>>;
8888

8989
/// Launch a thread and load the dependency graph in the background.
9090
pub fn load_dep_graph(sess: &Session) -> DepGraphFuture {
@@ -185,7 +185,7 @@ pub fn load_dep_graph(sess: &Session) -> DepGraphFuture {
185185
let dep_graph = SerializedDepGraph::decode(&mut decoder)
186186
.expect("Error reading cached dep-graph");
187187

188-
LoadResult::Ok { data: (PreviousDepGraph::new(dep_graph), prev_work_products) }
188+
LoadResult::Ok { data: (dep_graph, prev_work_products) }
189189
}
190190
}
191191
}))

compiler/rustc_middle/src/dep_graph/dep_node.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ use rustc_hir::HirId;
6464
use rustc_span::symbol::Symbol;
6565
use std::hash::Hash;
6666

67-
pub use rustc_query_system::dep_graph::{DepContext, DepNodeParams};
67+
pub use rustc_query_system::dep_graph::{DepContext, DepNodeColor, DepNodeParams};
6868

6969
/// This struct stores metadata about each DepKind.
7070
///

compiler/rustc_middle/src/dep_graph/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ pub use dep_node::{label_strs, DepKind, DepNode, DepNodeExt};
1818
pub type DepGraph = rustc_query_system::dep_graph::DepGraph<DepKind>;
1919
pub type TaskDeps = rustc_query_system::dep_graph::TaskDeps<DepKind>;
2020
pub type DepGraphQuery = rustc_query_system::dep_graph::DepGraphQuery<DepKind>;
21-
pub type PreviousDepGraph = rustc_query_system::dep_graph::PreviousDepGraph<DepKind>;
2221
pub type SerializedDepGraph = rustc_query_system::dep_graph::SerializedDepGraph<DepKind>;
2322

2423
impl rustc_query_system::dep_graph::DepKind for DepKind {

compiler/rustc_middle/src/ty/query/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, LocalDefId};
4343
use rustc_hir::lang_items::{LangItem, LanguageItems};
4444
use rustc_hir::{Crate, ItemLocalId, TraitCandidate};
4545
use rustc_index::{bit_set::FiniteBitSet, vec::IndexVec};
46+
use rustc_query_system::dep_graph::{DepNodeIndex, SerializedDepNodeIndex};
4647
use rustc_serialize::opaque;
4748
use rustc_session::config::{EntryFnType, OptLevel, OutputFilenames, SymbolManglingVersion};
4849
use rustc_session::utils::NativeLibKind;
@@ -237,6 +238,7 @@ macro_rules! define_callbacks {
237238
tcx: TyCtxt<'tcx>,
238239
encoder: &mut on_disk_cache::CacheEncoder<'a, 'tcx, opaque::FileEncoder>,
239240
query_result_index: &mut on_disk_cache::EncodedQueryResultIndex,
241+
remap: &IndexVec<DepNodeIndex, Option<SerializedDepNodeIndex>>,
240242
) -> opaque::FileEncodeResult;
241243

242244
fn exec_cache_promotions(&'tcx self, tcx: TyCtxt<'tcx>);

compiler/rustc_middle/src/ty/query/on_disk_cache.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use rustc_errors::Diagnostic;
1313
use rustc_hir::def_id::{CrateNum, DefId, DefIndex, LocalDefId, LOCAL_CRATE};
1414
use rustc_hir::definitions::DefPathHash;
1515
use rustc_hir::definitions::Definitions;
16-
use rustc_index::vec::{Idx, IndexVec};
16+
use rustc_index::vec::IndexVec;
1717
use rustc_query_system::dep_graph::DepContext;
1818
use rustc_query_system::query::QueryContext;
1919
use rustc_serialize::{
@@ -303,13 +303,15 @@ impl<'sess> OnDiskCache<'sess> {
303303
latest_foreign_def_path_hashes,
304304
};
305305

306+
let remap = tcx.dep_graph.compression_map();
307+
306308
// Encode query results.
307309
let mut query_result_index = EncodedQueryResultIndex::new();
308310

309311
tcx.sess.time("encode_query_results", || -> FileEncodeResult {
310312
let enc = &mut encoder;
311313
let qri = &mut query_result_index;
312-
tcx.queries.encode_query_results(tcx, enc, qri)
314+
tcx.queries.encode_query_results(tcx, enc, qri, &remap)
313315
})?;
314316

315317
// Encode diagnostics.
@@ -318,11 +320,11 @@ impl<'sess> OnDiskCache<'sess> {
318320
.borrow()
319321
.iter()
320322
.map(
321-
|(dep_node_index, diagnostics)| -> Result<_, <FileEncoder as Encoder>::Error> {
323+
|(&dep_node_index, diagnostics)| -> Result<_, <FileEncoder as Encoder>::Error> {
322324
let pos = AbsoluteBytePos::new(encoder.position());
323325
// Let's make sure we get the expected type here.
324326
let diagnostics: &EncodedDiagnostics = diagnostics;
325-
let dep_node_index = SerializedDepNodeIndex::new(dep_node_index.index());
327+
let dep_node_index = remap[dep_node_index].unwrap();
326328
encoder.encode_tagged(dep_node_index, diagnostics)?;
327329

328330
Ok((dep_node_index, pos))
@@ -1220,6 +1222,7 @@ pub fn encode_query_results<'a, 'tcx, CTX, Q>(
12201222
tcx: CTX,
12211223
encoder: &mut CacheEncoder<'a, 'tcx, FileEncoder>,
12221224
query_result_index: &mut EncodedQueryResultIndex,
1225+
remap: &IndexVec<DepNodeIndex, Option<SerializedDepNodeIndex>>,
12231226
) -> FileEncodeResult
12241227
where
12251228
CTX: QueryContext + 'tcx,
@@ -1236,7 +1239,7 @@ where
12361239
cache.iter_results(|results| {
12371240
for (key, value, dep_node) in results {
12381241
if Q::cache_on_disk(tcx, &key, Some(value)) {
1239-
let dep_node = SerializedDepNodeIndex::new(dep_node.index());
1242+
let dep_node = remap[dep_node].unwrap();
12401243

12411244
// Record position of the cache entry.
12421245
query_result_index

compiler/rustc_query_impl/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use rustc_middle::ich::StableHashingContext;
2626
use rustc_middle::ty::query::{query_keys, query_storage, query_stored, query_values};
2727
use rustc_middle::ty::query::{Providers, QueryEngine};
2828
use rustc_middle::ty::{self, TyCtxt};
29+
use rustc_query_system::dep_graph::{DepNodeColor, DepNodeIndex, SerializedDepNodeIndex};
2930
use rustc_serialize::opaque;
3031
use rustc_span::{Span, DUMMY_SP};
3132

compiler/rustc_query_impl/src/plumbing.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use rustc_query_system::query::{QueryContext, QueryDescription, QueryJobId, Quer
1313
use rustc_data_structures::sync::Lock;
1414
use rustc_data_structures::thin_vec::ThinVec;
1515
use rustc_errors::Diagnostic;
16+
use rustc_index::vec::IndexVec;
1617
use rustc_serialize::opaque;
1718
use rustc_span::def_id::{DefId, LocalDefId};
1819

@@ -177,14 +178,16 @@ impl<'tcx> QueryCtxt<'tcx> {
177178
self,
178179
encoder: &mut on_disk_cache::CacheEncoder<'a, 'tcx, opaque::FileEncoder>,
179180
query_result_index: &mut on_disk_cache::EncodedQueryResultIndex,
181+
remap: &IndexVec<DepNodeIndex, Option<SerializedDepNodeIndex>>,
180182
) -> opaque::FileEncodeResult {
181183
macro_rules! encode_queries {
182184
($($query:ident,)*) => {
183185
$(
184186
on_disk_cache::encode_query_results::<_, super::queries::$query<'_>>(
185187
self,
186188
encoder,
187-
query_result_index
189+
query_result_index,
190+
remap,
188191
)?;
189192
)*
190193
}
@@ -478,10 +481,10 @@ macro_rules! define_queries {
478481
return
479482
}
480483

481-
debug_assert!(tcx.dep_graph
482-
.node_color(dep_node)
483-
.map(|c| c.is_green())
484-
.unwrap_or(false));
484+
debug_assert_eq!(
485+
tcx.dep_graph.node_color(dep_node),
486+
Some(DepNodeColor::Green),
487+
);
485488

486489
let key = recover(*tcx, dep_node).unwrap_or_else(|| panic!("Failed to recover key for {:?} with hash {}", dep_node, dep_node.hash));
487490
if queries::$name::cache_on_disk(tcx, &key, None) {
@@ -562,9 +565,10 @@ macro_rules! define_queries_struct {
562565
tcx: TyCtxt<'tcx>,
563566
encoder: &mut on_disk_cache::CacheEncoder<'a, 'tcx, opaque::FileEncoder>,
564567
query_result_index: &mut on_disk_cache::EncodedQueryResultIndex,
568+
remap: &IndexVec<DepNodeIndex, Option<SerializedDepNodeIndex>>,
565569
) -> opaque::FileEncodeResult {
566570
let tcx = QueryCtxt { tcx, queries: self };
567-
tcx.encode_query_results(encoder, query_result_index)
571+
tcx.encode_query_results(encoder, query_result_index, remap)
568572
}
569573

570574
fn exec_cache_promotions(&'tcx self, tcx: TyCtxt<'tcx>) {

0 commit comments

Comments
 (0)