Importing rustc-1.53.0
Bug: 194400612
Change-Id: Id2f38eeabc8325fff960e46b89b1cc7216f5227c
diff --git a/compiler/rustc_query_system/src/dep_graph/query.rs b/compiler/rustc_query_system/src/dep_graph/query.rs
index cc25d08..27b3b5e 100644
--- a/compiler/rustc_query_system/src/dep_graph/query.rs
+++ b/compiler/rustc_query_system/src/dep_graph/query.rs
@@ -1,38 +1,43 @@
use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::graph::implementation::{Direction, Graph, NodeIndex, INCOMING};
+use rustc_index::vec::IndexVec;
-use super::{DepKind, DepNode};
+use super::{DepKind, DepNode, DepNodeIndex};
pub struct DepGraphQuery<K> {
pub graph: Graph<DepNode<K>, ()>,
pub indices: FxHashMap<DepNode<K>, NodeIndex>,
+ pub dep_index_to_index: IndexVec<DepNodeIndex, Option<NodeIndex>>,
}
impl<K: DepKind> DepGraphQuery<K> {
- pub fn new(
- nodes: &[DepNode<K>],
- edge_list_indices: &[(usize, usize)],
- edge_list_data: &[usize],
- ) -> DepGraphQuery<K> {
- let mut graph = Graph::with_capacity(nodes.len(), edge_list_data.len());
- let mut indices = FxHashMap::default();
- for node in nodes {
- indices.insert(*node, graph.add_node(*node));
- }
+ pub fn new(prev_node_count: usize) -> DepGraphQuery<K> {
+ let node_count = prev_node_count + prev_node_count / 4;
+ let edge_count = 6 * node_count;
- for (source, &(start, end)) in edge_list_indices.iter().enumerate() {
- for &target in &edge_list_data[start..end] {
- let source = indices[&nodes[source]];
- let target = indices[&nodes[target]];
- graph.add_edge(source, target, ());
- }
- }
+ let graph = Graph::with_capacity(node_count, edge_count);
+ let indices = FxHashMap::default();
+ let dep_index_to_index = IndexVec::new();
- DepGraphQuery { graph, indices }
+ DepGraphQuery { graph, indices, dep_index_to_index }
}
- pub fn contains_node(&self, node: &DepNode<K>) -> bool {
- self.indices.contains_key(&node)
+ pub fn push(&mut self, index: DepNodeIndex, node: DepNode<K>, edges: &[DepNodeIndex]) {
+ let source = self.graph.add_node(node);
+ if index.index() >= self.dep_index_to_index.len() {
+ self.dep_index_to_index.resize(index.index() + 1, None);
+ }
+ self.dep_index_to_index[index] = Some(source);
+ self.indices.insert(node, source);
+
+ for &target in edges.iter() {
+ let target = self.dep_index_to_index[target];
+ // We may miss the edges that are pushed while the `DepGraphQuery` is being accessed.
+ // Skip them to issues.
+ if let Some(target) = target {
+ self.graph.add_edge(source, target, ());
+ }
+ }
}
pub fn nodes(&self) -> Vec<&DepNode<K>> {