Get rid of PreviousDepGraph.

This commit is contained in:
Camille GILLOT 2021-05-22 11:46:54 +02:00
parent fa72878a61
commit a50f1e949b
7 changed files with 49 additions and 79 deletions

View File

@ -2,7 +2,7 @@
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_hir::definitions::DefPathTable; use rustc_hir::definitions::DefPathTable;
use rustc_middle::dep_graph::{PreviousDepGraph, SerializedDepGraph, WorkProduct, WorkProductId}; use rustc_middle::dep_graph::{SerializedDepGraph, WorkProduct, WorkProductId};
use rustc_middle::ty::query::OnDiskCache; use rustc_middle::ty::query::OnDiskCache;
use rustc_serialize::opaque::Decoder; use rustc_serialize::opaque::Decoder;
use rustc_serialize::Decodable; use rustc_serialize::Decodable;
@ -22,8 +22,8 @@ pub enum LoadResult<T> {
Error { message: String }, Error { message: String },
} }
impl LoadResult<(PreviousDepGraph, WorkProductMap)> { impl LoadResult<(SerializedDepGraph, WorkProductMap)> {
pub fn open(self, sess: &Session) -> (PreviousDepGraph, WorkProductMap) { pub fn open(self, sess: &Session) -> (SerializedDepGraph, WorkProductMap) {
match self { match self {
LoadResult::Error { message } => { LoadResult::Error { message } => {
sess.warn(&message); sess.warn(&message);
@ -84,7 +84,7 @@ pub fn open(self) -> std::thread::Result<T> {
} }
} }
pub type DepGraphFuture = MaybeAsync<LoadResult<(PreviousDepGraph, WorkProductMap)>>; pub type DepGraphFuture = MaybeAsync<LoadResult<(SerializedDepGraph, WorkProductMap)>>;
/// Launch a thread and load the dependency graph in the background. /// Launch a thread and load the dependency graph in the background.
pub fn load_dep_graph(sess: &Session) -> DepGraphFuture { pub fn load_dep_graph(sess: &Session) -> DepGraphFuture {
@ -185,7 +185,7 @@ pub fn load_dep_graph(sess: &Session) -> DepGraphFuture {
let dep_graph = SerializedDepGraph::decode(&mut decoder) let dep_graph = SerializedDepGraph::decode(&mut decoder)
.expect("Error reading cached dep-graph"); .expect("Error reading cached dep-graph");
LoadResult::Ok { data: (PreviousDepGraph::new(dep_graph), prev_work_products) } LoadResult::Ok { data: (dep_graph, prev_work_products) }
} }
} }
})) }))

View File

@ -1,6 +1,6 @@
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::sync::join; use rustc_data_structures::sync::join;
use rustc_middle::dep_graph::{DepGraph, PreviousDepGraph, WorkProduct, WorkProductId}; use rustc_middle::dep_graph::{DepGraph, SerializedDepGraph, WorkProduct, WorkProductId};
use rustc_middle::ty::TyCtxt; use rustc_middle::ty::TyCtxt;
use rustc_serialize::opaque::{FileEncodeResult, FileEncoder}; use rustc_serialize::opaque::{FileEncodeResult, FileEncoder};
use rustc_serialize::Encodable as RustcEncodable; use rustc_serialize::Encodable as RustcEncodable;
@ -186,7 +186,7 @@ fn encode_query_cache(tcx: TyCtxt<'_>, encoder: &mut FileEncoder) -> FileEncodeR
pub fn build_dep_graph( pub fn build_dep_graph(
sess: &Session, sess: &Session,
prev_graph: PreviousDepGraph, prev_graph: SerializedDepGraph,
prev_work_products: FxHashMap<WorkProductId, WorkProduct>, prev_work_products: FxHashMap<WorkProductId, WorkProduct>,
) -> Option<DepGraph> { ) -> Option<DepGraph> {
if sess.opts.incremental.is_none() { if sess.opts.incremental.is_none() {

View File

@ -18,7 +18,6 @@
pub type DepGraph = rustc_query_system::dep_graph::DepGraph<DepKind>; pub type DepGraph = rustc_query_system::dep_graph::DepGraph<DepKind>;
pub type TaskDeps = rustc_query_system::dep_graph::TaskDeps<DepKind>; pub type TaskDeps = rustc_query_system::dep_graph::TaskDeps<DepKind>;
pub type DepGraphQuery = rustc_query_system::dep_graph::DepGraphQuery<DepKind>; pub type DepGraphQuery = rustc_query_system::dep_graph::DepGraphQuery<DepKind>;
pub type PreviousDepGraph = rustc_query_system::dep_graph::PreviousDepGraph<DepKind>;
pub type SerializedDepGraph = rustc_query_system::dep_graph::SerializedDepGraph<DepKind>; pub type SerializedDepGraph = rustc_query_system::dep_graph::SerializedDepGraph<DepKind>;
pub type EdgeFilter = rustc_query_system::dep_graph::debug::EdgeFilter<DepKind>; pub type EdgeFilter = rustc_query_system::dep_graph::debug::EdgeFilter<DepKind>;

View File

@ -19,9 +19,8 @@
use std::mem; use std::mem;
use std::sync::atomic::Ordering::Relaxed; use std::sync::atomic::Ordering::Relaxed;
use super::prev::PreviousDepGraph;
use super::query::DepGraphQuery; use super::query::DepGraphQuery;
use super::serialized::{GraphEncoder, SerializedDepNodeIndex}; use super::serialized::{GraphEncoder, SerializedDepGraph, SerializedDepNodeIndex};
use super::{DepContext, DepKind, DepNode, HasDepContext, WorkProductId}; use super::{DepContext, DepKind, DepNode, HasDepContext, WorkProductId};
use crate::query::QueryContext; use crate::query::QueryContext;
@ -78,7 +77,7 @@ struct DepGraphData<K: DepKind> {
/// The dep-graph from the previous compilation session. It contains all /// The dep-graph from the previous compilation session. It contains all
/// nodes and edges as well as all fingerprints of nodes that have them. /// nodes and edges as well as all fingerprints of nodes that have them.
previous: PreviousDepGraph<K>, previous: SerializedDepGraph<K>,
colors: DepNodeColorMap, colors: DepNodeColorMap,
@ -109,7 +108,7 @@ pub fn hash_result<HashCtxt, R>(hcx: &mut HashCtxt, result: &R) -> Option<Finger
impl<K: DepKind> DepGraph<K> { impl<K: DepKind> DepGraph<K> {
pub fn new( pub fn new(
prev_graph: PreviousDepGraph<K>, prev_graph: SerializedDepGraph<K>,
prev_work_products: FxHashMap<WorkProductId, WorkProduct>, prev_work_products: FxHashMap<WorkProductId, WorkProduct>,
encoder: FileEncoder, encoder: FileEncoder,
record_graph: bool, record_graph: bool,
@ -857,7 +856,7 @@ struct EdgeIndex { .. }
/// For this reason, we avoid storing `DepNode`s more than once as map /// For this reason, we avoid storing `DepNode`s more than once as map
/// keys. The `new_node_to_index` map only contains nodes not in the previous /// keys. The `new_node_to_index` map only contains nodes not in the previous
/// graph, and we map nodes in the previous graph to indices via a two-step /// graph, and we map nodes in the previous graph to indices via a two-step
/// mapping. `PreviousDepGraph` maps from `DepNode` to `SerializedDepNodeIndex`, /// mapping. `SerializedDepGraph` maps from `DepNode` to `SerializedDepNodeIndex`,
/// and the `prev_index_to_index` vector (which is more compact and faster than /// and the `prev_index_to_index` vector (which is more compact and faster than
/// using a map) maps from `SerializedDepNodeIndex` to `DepNodeIndex`. /// using a map) maps from `SerializedDepNodeIndex` to `DepNodeIndex`.
/// ///
@ -982,7 +981,7 @@ fn intern_new_node(
fn intern_node( fn intern_node(
&self, &self,
profiler: &SelfProfilerRef, profiler: &SelfProfilerRef,
prev_graph: &PreviousDepGraph<K>, prev_graph: &SerializedDepGraph<K>,
key: DepNode<K>, key: DepNode<K>,
edges: EdgesVec, edges: EdgesVec,
fingerprint: Option<Fingerprint>, fingerprint: Option<Fingerprint>,
@ -1080,7 +1079,7 @@ fn intern_node(
fn promote_node_and_deps_to_current( fn promote_node_and_deps_to_current(
&self, &self,
profiler: &SelfProfilerRef, profiler: &SelfProfilerRef,
prev_graph: &PreviousDepGraph<K>, prev_graph: &SerializedDepGraph<K>,
prev_index: SerializedDepNodeIndex, prev_index: SerializedDepNodeIndex,
) -> DepNodeIndex { ) -> DepNodeIndex {
self.debug_assert_not_in_new_nodes(prev_graph, prev_index); self.debug_assert_not_in_new_nodes(prev_graph, prev_index);
@ -1112,7 +1111,7 @@ fn promote_node_and_deps_to_current(
#[inline] #[inline]
fn debug_assert_not_in_new_nodes( fn debug_assert_not_in_new_nodes(
&self, &self,
prev_graph: &PreviousDepGraph<K>, prev_graph: &SerializedDepGraph<K>,
prev_index: SerializedDepNodeIndex, prev_index: SerializedDepNodeIndex,
) { ) {
let node = &prev_graph.index_to_node(prev_index); let node = &prev_graph.index_to_node(prev_index);

View File

@ -1,13 +1,11 @@
pub mod debug; pub mod debug;
mod dep_node; mod dep_node;
mod graph; mod graph;
mod prev;
mod query; mod query;
mod serialized; mod serialized;
pub use dep_node::{DepNode, DepNodeParams, WorkProductId}; pub use dep_node::{DepNode, DepNodeParams, WorkProductId};
pub use graph::{hash_result, DepGraph, DepNodeColor, DepNodeIndex, TaskDeps, WorkProduct}; pub use graph::{hash_result, DepGraph, DepNodeColor, DepNodeIndex, TaskDeps, WorkProduct};
pub use prev::PreviousDepGraph;
pub use query::DepGraphQuery; pub use query::DepGraphQuery;
pub use serialized::{SerializedDepGraph, SerializedDepNodeIndex}; pub use serialized::{SerializedDepGraph, SerializedDepNodeIndex};

View File

@ -1,56 +0,0 @@
use super::serialized::{SerializedDepGraph, SerializedDepNodeIndex};
use super::{DepKind, DepNode};
use rustc_data_structures::fingerprint::Fingerprint;
use rustc_data_structures::fx::FxHashMap;
#[derive(Debug)]
pub struct PreviousDepGraph<K: DepKind> {
data: SerializedDepGraph<K>,
index: FxHashMap<DepNode<K>, SerializedDepNodeIndex>,
}
impl<K: DepKind> Default for PreviousDepGraph<K> {
fn default() -> Self {
PreviousDepGraph { data: Default::default(), index: Default::default() }
}
}
impl<K: DepKind> PreviousDepGraph<K> {
pub fn new(data: SerializedDepGraph<K>) -> PreviousDepGraph<K> {
let index: FxHashMap<_, _> =
data.nodes.iter_enumerated().map(|(idx, &dep_node)| (dep_node, idx)).collect();
PreviousDepGraph { data, index }
}
#[inline]
pub fn edge_targets_from(
&self,
dep_node_index: SerializedDepNodeIndex,
) -> &[SerializedDepNodeIndex] {
self.data.edge_targets_from(dep_node_index)
}
#[inline]
pub fn index_to_node(&self, dep_node_index: SerializedDepNodeIndex) -> DepNode<K> {
self.data.nodes[dep_node_index]
}
#[inline]
pub fn node_to_index_opt(&self, dep_node: &DepNode<K>) -> Option<SerializedDepNodeIndex> {
self.index.get(dep_node).cloned()
}
#[inline]
pub fn fingerprint_of(&self, dep_node: &DepNode<K>) -> Option<Fingerprint> {
self.index.get(dep_node).map(|&node_index| self.data.fingerprints[node_index])
}
#[inline]
pub fn fingerprint_by_index(&self, dep_node_index: SerializedDepNodeIndex) -> Fingerprint {
self.data.fingerprints[dep_node_index]
}
pub fn node_count(&self) -> usize {
self.index.len()
}
}

View File

@ -37,17 +37,19 @@ pub struct SerializedDepNodeIndex {
#[derive(Debug)] #[derive(Debug)]
pub struct SerializedDepGraph<K: DepKind> { pub struct SerializedDepGraph<K: DepKind> {
/// The set of all DepNodes in the graph /// The set of all DepNodes in the graph
pub nodes: IndexVec<SerializedDepNodeIndex, DepNode<K>>, nodes: IndexVec<SerializedDepNodeIndex, DepNode<K>>,
/// The set of all Fingerprints in the graph. Each Fingerprint corresponds to /// The set of all Fingerprints in the graph. Each Fingerprint corresponds to
/// the DepNode at the same index in the nodes vector. /// the DepNode at the same index in the nodes vector.
pub fingerprints: IndexVec<SerializedDepNodeIndex, Fingerprint>, fingerprints: IndexVec<SerializedDepNodeIndex, Fingerprint>,
/// For each DepNode, stores the list of edges originating from that /// For each DepNode, stores the list of edges originating from that
/// DepNode. Encoded as a [start, end) pair indexing into edge_list_data, /// DepNode. Encoded as a [start, end) pair indexing into edge_list_data,
/// which holds the actual DepNodeIndices of the target nodes. /// which holds the actual DepNodeIndices of the target nodes.
pub edge_list_indices: IndexVec<SerializedDepNodeIndex, (u32, u32)>, edge_list_indices: IndexVec<SerializedDepNodeIndex, (u32, u32)>,
/// A flattened list of all edge targets in the graph. Edge sources are /// A flattened list of all edge targets in the graph. Edge sources are
/// implicit in edge_list_indices. /// implicit in edge_list_indices.
pub edge_list_data: Vec<SerializedDepNodeIndex>, edge_list_data: Vec<SerializedDepNodeIndex>,
/// Reciprocal map to `nodes`.
index: FxHashMap<DepNode<K>, SerializedDepNodeIndex>,
} }
impl<K: DepKind> Default for SerializedDepGraph<K> { impl<K: DepKind> Default for SerializedDepGraph<K> {
@ -57,6 +59,7 @@ fn default() -> Self {
fingerprints: Default::default(), fingerprints: Default::default(),
edge_list_indices: Default::default(), edge_list_indices: Default::default(),
edge_list_data: Default::default(), edge_list_data: Default::default(),
index: Default::default(),
} }
} }
} }
@ -67,6 +70,30 @@ pub fn edge_targets_from(&self, source: SerializedDepNodeIndex) -> &[SerializedD
let targets = self.edge_list_indices[source]; let targets = self.edge_list_indices[source];
&self.edge_list_data[targets.0 as usize..targets.1 as usize] &self.edge_list_data[targets.0 as usize..targets.1 as usize]
} }
#[inline]
pub fn index_to_node(&self, dep_node_index: SerializedDepNodeIndex) -> DepNode<K> {
self.nodes[dep_node_index]
}
#[inline]
pub fn node_to_index_opt(&self, dep_node: &DepNode<K>) -> Option<SerializedDepNodeIndex> {
self.index.get(dep_node).cloned()
}
#[inline]
pub fn fingerprint_of(&self, dep_node: &DepNode<K>) -> Option<Fingerprint> {
self.index.get(dep_node).map(|&node_index| self.fingerprints[node_index])
}
#[inline]
pub fn fingerprint_by_index(&self, dep_node_index: SerializedDepNodeIndex) -> Fingerprint {
self.fingerprints[dep_node_index]
}
pub fn node_count(&self) -> usize {
self.index.len()
}
} }
impl<'a, K: DepKind + Decodable<opaque::Decoder<'a>>> Decodable<opaque::Decoder<'a>> impl<'a, K: DepKind + Decodable<opaque::Decoder<'a>>> Decodable<opaque::Decoder<'a>>
@ -121,7 +148,10 @@ fn decode(d: &mut opaque::Decoder<'a>) -> Result<SerializedDepGraph<K>, String>
})?; })?;
} }
Ok(SerializedDepGraph { nodes, fingerprints, edge_list_indices, edge_list_data }) let index: FxHashMap<_, _> =
nodes.iter_enumerated().map(|(idx, &dep_node)| (dep_node, idx)).collect();
Ok(SerializedDepGraph { nodes, fingerprints, edge_list_indices, edge_list_data, index })
} }
} }