From bd90137b94471eabe499b3775315bdb594ea2a95 Mon Sep 17 00:00:00 2001 From: varkor Date: Fri, 27 Jul 2018 00:06:57 +0100 Subject: [PATCH] Improve query efficiency --- src/librustc/dep_graph/dep_node.rs | 2 +- src/librustc/middle/lib_features.rs | 8 +++++--- src/librustc/middle/stability.rs | 2 +- src/librustc/ty/context.rs | 3 +-- src/librustc_metadata/decoder.rs | 6 ++---- src/librustc_metadata/encoder.rs | 2 +- 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 @@ pub fn fingerprint_needed_for_crate_hash(self) -> bool { [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 @@ fn new() -> LibFeatures { } } - pub fn iter(&self) -> Vec<(Symbol, Option)> { - self.stable.iter().map(|(f, s)| (*f, Some(*s))) + pub fn to_vec(&self) -> Vec<(Symbol, Option)> { + 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 @@ pub fn get_impl_trait(&self, /// Iterates over all the stability attributes in the given crate. pub fn get_lib_features(&self) -> Vec<(ast::Name, Option)> { - 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 @@ fn encode_crate_deps(&mut self, _: ()) -> LazySeq { fn encode_lib_features(&mut self, _: ()) -> LazySeq<(ast::Name, Option)> { 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)> { -- 2.44.0