From 932d2516988e10e3bdb5e4db4db4af5958ce651a Mon Sep 17 00:00:00 2001 From: achernyak Date: Fri, 28 Apr 2017 10:59:57 -0500 Subject: [PATCH 1/6] query for def_span --- src/librustc/middle/cstore.rs | 2 -- src/librustc/ty/maps.rs | 9 ++++++++- src/librustc/ty/mod.rs | 19 +++++++++++-------- src/librustc_metadata/cstore_impl.rs | 6 +----- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/librustc/middle/cstore.rs b/src/librustc/middle/cstore.rs index 03583192567..0b43e65ddbf 100644 --- a/src/librustc/middle/cstore.rs +++ b/src/librustc/middle/cstore.rs @@ -181,7 +181,6 @@ pub trait CrateStore { fn crate_data_as_rc_any(&self, krate: CrateNum) -> Rc; // item info - fn def_span(&self, sess: &Session, def: DefId) -> Span; fn stability(&self, def: DefId) -> Option; fn deprecation(&self, def: DefId) -> Option; fn visibility(&self, def: DefId) -> ty::Visibility; @@ -312,7 +311,6 @@ impl CrateStore for DummyCrateStore { fn crate_data_as_rc_any(&self, krate: CrateNum) -> Rc { bug!("crate_data_as_rc_any") } // item info - fn def_span(&self, sess: &Session, def: DefId) -> Span { bug!("def_span") } fn stability(&self, def: DefId) -> Option { bug!("stability") } fn deprecation(&self, def: DefId) -> Option { bug!("deprecation") } fn visibility(&self, def: DefId) -> ty::Visibility { bug!("visibility") } diff --git a/src/librustc/ty/maps.rs b/src/librustc/ty/maps.rs index 096d69aa376..f2659e88afb 100644 --- a/src/librustc/ty/maps.rs +++ b/src/librustc/ty/maps.rs @@ -271,6 +271,12 @@ impl<'tcx> QueryDescription for queries::describe_def<'tcx> { } } +impl<'tcx> QueryDescription for queries::def_span<'tcx> { + fn describe(_: TyCtxt, _: DefId) -> String { + bug!("def_span") + } +} + macro_rules! define_maps { (<$tcx:tt> $($(#[$attr:meta])* @@ -547,7 +553,8 @@ define_maps! { <'tcx> pub def_symbol_name: SymbolName(DefId) -> ty::SymbolName, pub symbol_name: symbol_name_dep_node(ty::Instance<'tcx>) -> ty::SymbolName, - pub describe_def: meta_data_node(DefId) -> Option + pub describe_def: meta_data_node(DefId) -> Option, + pub def_span: meta_data_node(DefId) -> Span } fn coherent_trait_dep_node((_, def_id): (CrateNum, DefId)) -> DepNode { diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index 238791fb6ed..2c3871cec8d 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -2265,14 +2265,6 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { } } - pub fn def_span(self, def_id: DefId) -> Span { - if let Some(id) = self.hir.as_local_node_id(def_id) { - self.hir.span(id) - } else { - self.sess.cstore.def_span(&self.sess, def_id) - } - } - pub fn vis_is_accessible_from(self, vis: Visibility, block: NodeId) -> bool { vis.is_accessible_from(self.hir.local_def_id(self.hir.get_module_parent(block)), self) } @@ -2675,12 +2667,23 @@ fn associated_item_def_ids<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, Rc::new(vec) } +fn def_span<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> Span { + match tcx.hir.span_if_local(def_id) { + Some(span) => span, + None => { + let node_id = tcx.sess.cstore.item_body(tcx, def_id).id().node_id; + tcx.hir.span(node_id) + }, + } +} + pub fn provide(providers: &mut ty::maps::Providers) { *providers = ty::maps::Providers { associated_item, associated_item_def_ids, adt_sized_constraint, adt_dtorck_constraint, + def_span, ..*providers }; } diff --git a/src/librustc_metadata/cstore_impl.rs b/src/librustc_metadata/cstore_impl.rs index 839caca2ee9..b060f97ab9a 100644 --- a/src/librustc_metadata/cstore_impl.rs +++ b/src/librustc_metadata/cstore_impl.rs @@ -114,6 +114,7 @@ provide! { <'tcx> tcx, def_id, cdata inherent_impls => { Rc::new(cdata.get_inherent_implementations_for_type(def_id.index)) } is_foreign_item => { cdata.is_foreign_item(def_id.index) } describe_def => { cdata.get_def(def_id.index) } + def_span => { cdata.get_span(def_id.index, &tcx.sess) } } impl CrateStore for cstore::CStore { @@ -121,11 +122,6 @@ impl CrateStore for cstore::CStore { self.get_crate_data(krate) } - fn def_span(&self, sess: &Session, def: DefId) -> Span { - self.dep_graph.read(DepNode::MetaData(def)); - self.get_crate_data(def.krate).get_span(def.index, sess) - } - fn stability(&self, def: DefId) -> Option { self.dep_graph.read(DepNode::MetaData(def)); self.get_crate_data(def.krate).get_stability(def.index) From 93ac5dff2acca41eb5df2276432f97576c613cd0 Mon Sep 17 00:00:00 2001 From: achernyak Date: Fri, 28 Apr 2017 16:29:05 -0500 Subject: [PATCH 2/6] review updateds --- src/librustc/ty/maps.rs | 8 ++------ src/librustc/ty/mod.rs | 8 +------- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/src/librustc/ty/maps.rs b/src/librustc/ty/maps.rs index f2659e88afb..51fc0aa895c 100644 --- a/src/librustc/ty/maps.rs +++ b/src/librustc/ty/maps.rs @@ -553,8 +553,8 @@ define_maps! { <'tcx> pub def_symbol_name: SymbolName(DefId) -> ty::SymbolName, pub symbol_name: symbol_name_dep_node(ty::Instance<'tcx>) -> ty::SymbolName, - pub describe_def: meta_data_node(DefId) -> Option, - pub def_span: meta_data_node(DefId) -> Span + pub describe_def: MetaData(DefId) -> Option, + pub def_span: MetaData(DefId) -> Span } fn coherent_trait_dep_node((_, def_id): (CrateNum, DefId)) -> DepNode { @@ -585,8 +585,4 @@ fn typeck_item_bodies_dep_node(_: CrateNum) -> DepNode { fn const_eval_dep_node((def_id, _): (DefId, &Substs)) -> DepNode { DepNode::ConstEval(def_id) -} - -fn meta_data_node(def_id: DefId) -> DepNode { - DepNode::MetaData(def_id) } \ No newline at end of file diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index 2c3871cec8d..11bc5ce9187 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -2668,13 +2668,7 @@ fn associated_item_def_ids<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, } fn def_span<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> Span { - match tcx.hir.span_if_local(def_id) { - Some(span) => span, - None => { - let node_id = tcx.sess.cstore.item_body(tcx, def_id).id().node_id; - tcx.hir.span(node_id) - }, - } + tcx.hir.span_if_local(def_id).unwrap() } pub fn provide(providers: &mut ty::maps::Providers) { From ba90718bb44fe7e2a5edbcc3e5503ee1f7feebd5 Mon Sep 17 00:00:00 2001 From: achernyak Date: Fri, 28 Apr 2017 22:42:05 -0500 Subject: [PATCH 3/6] found the stack overflow culprit --- src/librustc/ty/maps.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/librustc/ty/maps.rs b/src/librustc/ty/maps.rs index 51fc0aa895c..c39417b67d4 100644 --- a/src/librustc/ty/maps.rs +++ b/src/librustc/ty/maps.rs @@ -346,8 +346,8 @@ macro_rules! define_maps { } // FIXME(eddyb) Get more valid Span's on queries. - if span == DUMMY_SP { - span = key.default_span(tcx); + if span == DUMMY_SP && stringify!($name) != "def_span" { + span = key.default_span(tcx) } let _task = tcx.dep_graph.in_task(Self::to_dep_node(&key)); From ad1959e8e426279f68c1dd73a67356638c9ee295 Mon Sep 17 00:00:00 2001 From: achernyak Date: Sat, 29 Apr 2017 09:56:01 -0500 Subject: [PATCH 4/6] added dep nodes and comment --- src/librustc/dep_graph/dep_node.rs | 6 ++++++ src/librustc/ty/maps.rs | 15 ++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs index 31e6a3106a4..acf9baf9677 100644 --- a/src/librustc/dep_graph/dep_node.rs +++ b/src/librustc/dep_graph/dep_node.rs @@ -148,6 +148,10 @@ pub enum DepNode { // For proj. cache, we just keep a list of all def-ids, since it is // not a hotspot. ProjectionCache { def_ids: Vec }, + + // Depnodes for MetaData + DescribeDef(D), + DefSpan(D), } impl DepNode { @@ -253,6 +257,8 @@ impl DepNode { let def_ids: Option> = def_ids.iter().map(op).collect(); def_ids.map(|d| ProjectionCache { def_ids: d }) } + DescribeDef(ref d) => op(d).map(MetaData), + DefSpan(ref d) => op(d).map(MetaData), } } } diff --git a/src/librustc/ty/maps.rs b/src/librustc/ty/maps.rs index 13c167de0fd..233066f266a 100644 --- a/src/librustc/ty/maps.rs +++ b/src/librustc/ty/maps.rs @@ -365,6 +365,8 @@ macro_rules! define_maps { } // FIXME(eddyb) Get more valid Span's on queries. + // def_span guard is necesary to prevent a recursive loop, + // default_span calls def_span query internally. if span == DUMMY_SP && stringify!($name) != "def_span" { span = key.default_span(tcx) } @@ -574,9 +576,8 @@ define_maps! { <'tcx> [] def_symbol_name: SymbolName(DefId) -> ty::SymbolName, [] symbol_name: symbol_name_dep_node(ty::Instance<'tcx>) -> ty::SymbolName, - - [] describe_def: MetaData(DefId) -> Option, - [] def_span: MetaData(DefId) -> Span + [] describe_def: describe_def(DefId) -> Option, + [] def_span: def_span(DefId) -> Span } fn coherent_trait_dep_node((_, def_id): (CrateNum, DefId)) -> DepNode { @@ -608,3 +609,11 @@ fn typeck_item_bodies_dep_node(_: CrateNum) -> DepNode { fn const_eval_dep_node((def_id, _): (DefId, &Substs)) -> DepNode { DepNode::ConstEval(def_id) } + +fn describe_def(def_id: DefId) -> DepNode { + DepNode::DescribeDef(def_id) +} + +fn def_span(def_id: DefId) -> DepNode { + DepNode::DefSpan(def_id) +} From 00d02cf9100f53d399cd9271f7c678be7d40ed55 Mon Sep 17 00:00:00 2001 From: achernyak Date: Sat, 29 Apr 2017 11:04:55 -0500 Subject: [PATCH 5/6] chaned dep nodes impl --- src/librustc/dep_graph/dep_node.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs index acf9baf9677..674185cf4e6 100644 --- a/src/librustc/dep_graph/dep_node.rs +++ b/src/librustc/dep_graph/dep_node.rs @@ -257,8 +257,8 @@ impl DepNode { let def_ids: Option> = def_ids.iter().map(op).collect(); def_ids.map(|d| ProjectionCache { def_ids: d }) } - DescribeDef(ref d) => op(d).map(MetaData), - DefSpan(ref d) => op(d).map(MetaData), + DescribeDef(ref d) => op(d).map(DescribeDef), + DefSpan(ref d) => op(d).map(DefSpan), } } } From d3b7af0e263627a2aa42952aced8439dbfad84d3 Mon Sep 17 00:00:00 2001 From: achernyak Date: Sat, 29 Apr 2017 13:11:01 -0500 Subject: [PATCH 6/6] removed custom functions and comment --- src/librustc/dep_graph/dep_node.rs | 1 - src/librustc/ty/maps.rs | 14 +++----------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs index 674185cf4e6..d05ede07c3f 100644 --- a/src/librustc/dep_graph/dep_node.rs +++ b/src/librustc/dep_graph/dep_node.rs @@ -149,7 +149,6 @@ pub enum DepNode { // not a hotspot. ProjectionCache { def_ids: Vec }, - // Depnodes for MetaData DescribeDef(D), DefSpan(D), } diff --git a/src/librustc/ty/maps.rs b/src/librustc/ty/maps.rs index 233066f266a..76398294aca 100644 --- a/src/librustc/ty/maps.rs +++ b/src/librustc/ty/maps.rs @@ -576,8 +576,8 @@ define_maps! { <'tcx> [] def_symbol_name: SymbolName(DefId) -> ty::SymbolName, [] symbol_name: symbol_name_dep_node(ty::Instance<'tcx>) -> ty::SymbolName, - [] describe_def: describe_def(DefId) -> Option, - [] def_span: def_span(DefId) -> Span + [] describe_def: DescribeDef(DefId) -> Option, + [] def_span: DefSpan(DefId) -> Span } fn coherent_trait_dep_node((_, def_id): (CrateNum, DefId)) -> DepNode { @@ -608,12 +608,4 @@ fn typeck_item_bodies_dep_node(_: CrateNum) -> DepNode { fn const_eval_dep_node((def_id, _): (DefId, &Substs)) -> DepNode { DepNode::ConstEval(def_id) -} - -fn describe_def(def_id: DefId) -> DepNode { - DepNode::DescribeDef(def_id) -} - -fn def_span(def_id: DefId) -> DepNode { - DepNode::DefSpan(def_id) -} +} \ No newline at end of file