about summary refs log tree commit diff
diff options
context:
space:
mode:
authorvarkor <github@varkor.com>2018-07-27 00:06:57 +0100
committervarkor <github@varkor.com>2018-08-05 15:54:49 +0100
commitbd90137b94471eabe499b3775315bdb594ea2a95 (patch)
tree438de9ba3ce3eb74be07d57b131565e2010322a5
parente5d5e6a5604dbc14090e1a5919b6eac522442f6e (diff)
downloadrust-bd90137b94471eabe499b3775315bdb594ea2a95.tar.gz
rust-bd90137b94471eabe499b3775315bdb594ea2a95.zip
Improve query efficiency
-rw-r--r--src/librustc/dep_graph/dep_node.rs2
-rw-r--r--src/librustc/middle/lib_features.rs8
-rw-r--r--src/librustc/middle/stability.rs2
-rw-r--r--src/librustc/ty/context.rs3
-rw-r--r--src/librustc_metadata/decoder.rs6
-rw-r--r--src/librustc_metadata/encoder.rs2
6 files changed, 11 insertions, 12 deletions
diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs
index 66d6a434668..b7281cf0445 100644
--- a/src/librustc/dep_graph/dep_node.rs
+++ b/src/librustc/dep_graph/dep_node.rs
@@ -615,7 +615,7 @@ define_dep_nodes!( <'tcx>
     [input] CrateName(CrateNum),
     [] ItemChildren(DefId),
     [] ExternModStmtCnum(DefId),
-    [input] GetLibFeatures,
+    [eval_always] GetLibFeatures,
     [] DefinedLibFeatures(CrateNum),
     [eval_always] GetLangItems,
     [] DefinedLangItems(CrateNum),
diff --git a/src/librustc/middle/lib_features.rs b/src/librustc/middle/lib_features.rs
index b30341103e4..47c6bfbe694 100644
--- a/src/librustc/middle/lib_features.rs
+++ b/src/librustc/middle/lib_features.rs
@@ -37,10 +37,12 @@ impl LibFeatures {
         }
     }
 
-    pub fn iter(&self) -> Vec<(Symbol, Option<Symbol>)> {
-        self.stable.iter().map(|(f, s)| (*f, Some(*s)))
+    pub fn to_vec(&self) -> Vec<(Symbol, Option<Symbol>)> {
+        let mut all_features: Vec<_> = self.stable.iter().map(|(f, s)| (*f, Some(*s)))
             .chain(self.unstable.iter().map(|f| (*f, None)))
-            .collect()
+            .collect();
+        all_features.sort_unstable_by_key(|f| f.0.as_str());
+        all_features
     }
 }
 
diff --git a/src/librustc/middle/stability.rs b/src/librustc/middle/stability.rs
index f2296c04acc..7fd788ff2ea 100644
--- a/src/librustc/middle/stability.rs
+++ b/src/librustc/middle/stability.rs
@@ -841,7 +841,7 @@ pub fn check_unused_or_stable_features<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
     // FIXME: only remove `libc` when `stdbuild` is active.
     remaining_lib_features.remove(&Symbol::intern("libc"));
 
-    for (feature, stable) in tcx.lib_features().iter() {
+    for (feature, stable) in tcx.lib_features().to_vec() {
         if let Some(since) = stable {
             if let Some(span) = remaining_lib_features.get(&feature) {
                 // Warn if the user has enabled an already-stable lib feature.
diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs
index a35bd3c012f..bb14af29a7a 100644
--- a/src/librustc/ty/context.rs
+++ b/src/librustc/ty/context.rs
@@ -2846,8 +2846,7 @@ pub fn provide(providers: &mut ty::query::Providers) {
     };
     providers.get_lib_features = |tcx, id| {
         assert_eq!(id, LOCAL_CRATE);
-        // FIXME(#42293): see comment below.
-        tcx.dep_graph.with_ignore(|| Lrc::new(middle::lib_features::collect(tcx)))
+        Lrc::new(middle::lib_features::collect(tcx))
     };
     providers.get_lang_items = |tcx, id| {
         assert_eq!(id, LOCAL_CRATE);
diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs
index 032f8bdd069..45a61ec3308 100644
--- a/src/librustc_metadata/decoder.rs
+++ b/src/librustc_metadata/decoder.rs
@@ -647,12 +647,10 @@ impl<'a, 'tcx> CrateMetadata {
 
     /// Iterates over all the stability attributes in the given crate.
     pub fn get_lib_features(&self) -> Vec<(ast::Name, Option<ast::Name>)> {
-        let mut features: Vec<_> = self.root
+        self.root
             .lib_features
             .decode(self)
-            .collect();
-        features.sort_unstable_by_key(|f| f.0.as_str());
-        features
+            .collect()
     }
 
     /// Iterates over the language items in the given crate.
diff --git a/src/librustc_metadata/encoder.rs b/src/librustc_metadata/encoder.rs
index 9bb5a849bc7..96d6c5b75f4 100644
--- a/src/librustc_metadata/encoder.rs
+++ b/src/librustc_metadata/encoder.rs
@@ -1466,7 +1466,7 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
     fn encode_lib_features(&mut self, _: ()) -> LazySeq<(ast::Name, Option<ast::Name>)> {
         let tcx = self.tcx;
         let lib_features = tcx.lib_features();
-        self.lazy_seq(lib_features.iter())
+        self.lazy_seq(lib_features.to_vec())
     }
 
     fn encode_lang_items(&mut self, _: ()) -> LazySeq<(DefIndex, usize)> {