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_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) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
|
@ -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() {
|
||||||
|
@ -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>;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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};
|
||||||
|
|
||||||
|
@ -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)]
|
#[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 })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user