Get rid of PreviousDepGraph.
This commit is contained in:
parent
fa72878a61
commit
a50f1e949b
@ -2,7 +2,7 @@
|
||||
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
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_serialize::opaque::Decoder;
|
||||
use rustc_serialize::Decodable;
|
||||
@ -22,8 +22,8 @@ pub enum LoadResult<T> {
|
||||
Error { message: String },
|
||||
}
|
||||
|
||||
impl LoadResult<(PreviousDepGraph, WorkProductMap)> {
|
||||
pub fn open(self, sess: &Session) -> (PreviousDepGraph, WorkProductMap) {
|
||||
impl LoadResult<(SerializedDepGraph, WorkProductMap)> {
|
||||
pub fn open(self, sess: &Session) -> (SerializedDepGraph, WorkProductMap) {
|
||||
match self {
|
||||
LoadResult::Error { 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.
|
||||
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)
|
||||
.expect("Error reading cached dep-graph");
|
||||
|
||||
LoadResult::Ok { data: (PreviousDepGraph::new(dep_graph), prev_work_products) }
|
||||
LoadResult::Ok { data: (dep_graph, prev_work_products) }
|
||||
}
|
||||
}
|
||||
}))
|
||||
|
@ -1,6 +1,6 @@
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
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_serialize::opaque::{FileEncodeResult, FileEncoder};
|
||||
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(
|
||||
sess: &Session,
|
||||
prev_graph: PreviousDepGraph,
|
||||
prev_graph: SerializedDepGraph,
|
||||
prev_work_products: FxHashMap<WorkProductId, WorkProduct>,
|
||||
) -> Option<DepGraph> {
|
||||
if sess.opts.incremental.is_none() {
|
||||
|
@ -18,7 +18,6 @@
|
||||
pub type DepGraph = rustc_query_system::dep_graph::DepGraph<DepKind>;
|
||||
pub type TaskDeps = rustc_query_system::dep_graph::TaskDeps<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 EdgeFilter = rustc_query_system::dep_graph::debug::EdgeFilter<DepKind>;
|
||||
|
||||
|
@ -19,9 +19,8 @@
|
||||
use std::mem;
|
||||
use std::sync::atomic::Ordering::Relaxed;
|
||||
|
||||
use super::prev::PreviousDepGraph;
|
||||
use super::query::DepGraphQuery;
|
||||
use super::serialized::{GraphEncoder, SerializedDepNodeIndex};
|
||||
use super::serialized::{GraphEncoder, SerializedDepGraph, SerializedDepNodeIndex};
|
||||
use super::{DepContext, DepKind, DepNode, HasDepContext, WorkProductId};
|
||||
use crate::query::QueryContext;
|
||||
|
||||
@ -78,7 +77,7 @@ struct DepGraphData<K: DepKind> {
|
||||
|
||||
/// The dep-graph from the previous compilation session. It contains all
|
||||
/// nodes and edges as well as all fingerprints of nodes that have them.
|
||||
previous: PreviousDepGraph<K>,
|
||||
previous: SerializedDepGraph<K>,
|
||||
|
||||
colors: DepNodeColorMap,
|
||||
|
||||
@ -109,7 +108,7 @@ pub fn hash_result<HashCtxt, R>(hcx: &mut HashCtxt, result: &R) -> Option<Finger
|
||||
|
||||
impl<K: DepKind> DepGraph<K> {
|
||||
pub fn new(
|
||||
prev_graph: PreviousDepGraph<K>,
|
||||
prev_graph: SerializedDepGraph<K>,
|
||||
prev_work_products: FxHashMap<WorkProductId, WorkProduct>,
|
||||
encoder: FileEncoder,
|
||||
record_graph: bool,
|
||||
@ -857,7 +856,7 @@ struct EdgeIndex { .. }
|
||||
/// 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
|
||||
/// 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
|
||||
/// using a map) maps from `SerializedDepNodeIndex` to `DepNodeIndex`.
|
||||
///
|
||||
@ -982,7 +981,7 @@ fn intern_new_node(
|
||||
fn intern_node(
|
||||
&self,
|
||||
profiler: &SelfProfilerRef,
|
||||
prev_graph: &PreviousDepGraph<K>,
|
||||
prev_graph: &SerializedDepGraph<K>,
|
||||
key: DepNode<K>,
|
||||
edges: EdgesVec,
|
||||
fingerprint: Option<Fingerprint>,
|
||||
@ -1080,7 +1079,7 @@ fn intern_node(
|
||||
fn promote_node_and_deps_to_current(
|
||||
&self,
|
||||
profiler: &SelfProfilerRef,
|
||||
prev_graph: &PreviousDepGraph<K>,
|
||||
prev_graph: &SerializedDepGraph<K>,
|
||||
prev_index: SerializedDepNodeIndex,
|
||||
) -> DepNodeIndex {
|
||||
self.debug_assert_not_in_new_nodes(prev_graph, prev_index);
|
||||
@ -1112,7 +1111,7 @@ fn promote_node_and_deps_to_current(
|
||||
#[inline]
|
||||
fn debug_assert_not_in_new_nodes(
|
||||
&self,
|
||||
prev_graph: &PreviousDepGraph<K>,
|
||||
prev_graph: &SerializedDepGraph<K>,
|
||||
prev_index: SerializedDepNodeIndex,
|
||||
) {
|
||||
let node = &prev_graph.index_to_node(prev_index);
|
||||
|
@ -1,13 +1,11 @@
|
||||
pub mod debug;
|
||||
mod dep_node;
|
||||
mod graph;
|
||||
mod prev;
|
||||
mod query;
|
||||
mod serialized;
|
||||
|
||||
pub use dep_node::{DepNode, DepNodeParams, WorkProductId};
|
||||
pub use graph::{hash_result, DepGraph, DepNodeColor, DepNodeIndex, TaskDeps, WorkProduct};
|
||||
pub use prev::PreviousDepGraph;
|
||||
pub use query::DepGraphQuery;
|
||||
pub use serialized::{SerializedDepGraph, SerializedDepNodeIndex};
|
||||
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
@ -37,17 +37,19 @@ pub struct SerializedDepNodeIndex {
|
||||
#[derive(Debug)]
|
||||
pub struct SerializedDepGraph<K: DepKind> {
|
||||
/// 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 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
|
||||
/// DepNode. Encoded as a [start, end) pair indexing into edge_list_data,
|
||||
/// 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
|
||||
/// 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> {
|
||||
@ -57,6 +59,7 @@ fn default() -> Self {
|
||||
fingerprints: Default::default(),
|
||||
edge_list_indices: 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];
|
||||
&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>>
|
||||
@ -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 })
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user