diff --git a/src/librustc/middle/cstore.rs b/src/librustc/middle/cstore.rs index 3cb827cdf6c3..50920ca7f7ea 100644 --- a/src/librustc/middle/cstore.rs +++ b/src/librustc/middle/cstore.rs @@ -250,8 +250,6 @@ pub trait CrateStore { fn item_body<'a, 'tcx>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, def: DefId) -> &'tcx hir::Body; - fn is_item_mir_available(&self, def: DefId) -> bool; - // This is basically a 1-based range of ints, which is a little // silly - I may fix that. fn crates(&self) -> Vec; @@ -399,10 +397,6 @@ impl CrateStore for DummyCrateStore { bug!("item_body") } - fn is_item_mir_available(&self, def: DefId) -> bool { - bug!("is_item_mir_available") - } - // This is basically a 1-based range of ints, which is a little // silly - I may fix that. fn crates(&self) -> Vec { vec![] } diff --git a/src/librustc/ty/maps.rs b/src/librustc/ty/maps.rs index 57a69c5fa0bb..3f18a480dd67 100644 --- a/src/librustc/ty/maps.rs +++ b/src/librustc/ty/maps.rs @@ -305,6 +305,13 @@ impl<'tcx> QueryDescription for queries::const_is_rvalue_promotable_to_static<'t } } +impl<'tcx> QueryDescription for queries::is_item_mir_available<'tcx> { + fn describe(tcx: TyCtxt, def_id: DefId) -> String { + format!("checking if item is mir available: `{}`", + tcx.item_path_str(def_id)) + } +} + macro_rules! define_maps { (<$tcx:tt> $($(#[$attr:meta])* @@ -595,6 +602,7 @@ define_maps! { <'tcx> [] item_body_nested_bodies: metadata_dep_node(DefId) -> Rc>, [] const_is_rvalue_promotable_to_static: metadata_dep_node(DefId) -> bool, + [] is_item_mir_available: metadata_dep_node(DefId) -> bool, } 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 8be3e4be7c8b..7d43e0d0659c 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -2332,7 +2332,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { return None; } - if !did.is_local() && !self.sess.cstore.is_item_mir_available(did) { + if !did.is_local() && !self.is_item_mir_available(did) { return None; } diff --git a/src/librustc_metadata/cstore_impl.rs b/src/librustc_metadata/cstore_impl.rs index a492e2afa4c7..f5a8accea280 100644 --- a/src/librustc_metadata/cstore_impl.rs +++ b/src/librustc_metadata/cstore_impl.rs @@ -126,6 +126,10 @@ provide! { <'tcx> tcx, def_id, cdata cdata.entry(def_id.index).ast.expect("const item missing `ast`") .decode(cdata).rvalue_promotable_to_static } + is_item_mir_available => { + !cdata.is_proc_macro(def_id.index) && + cdata.maybe_entry(def_id.index).and_then(|item| item.decode(cdata).mir).is_some() + } } impl CrateStore for cstore::CStore { @@ -443,11 +447,6 @@ impl CrateStore for cstore::CStore { self.get_crate_data(def_id.krate).item_body(tcx, def_id.index) } - fn is_item_mir_available(&self, def: DefId) -> bool { - self.dep_graph.read(DepNode::MetaData(def)); - self.get_crate_data(def.krate).is_item_mir_available(def.index) - } - fn crates(&self) -> Vec { let mut result = vec![]; diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs index 2317c156b419..933166b05245 100644 --- a/src/librustc_metadata/decoder.rs +++ b/src/librustc_metadata/decoder.rs @@ -441,11 +441,11 @@ impl<'tcx> EntryKind<'tcx> { } impl<'a, 'tcx> CrateMetadata { - fn is_proc_macro(&self, id: DefIndex) -> bool { + pub fn is_proc_macro(&self, id: DefIndex) -> bool { self.proc_macros.is_some() && id != CRATE_DEF_INDEX } - fn maybe_entry(&self, item_id: DefIndex) -> Option>> { + pub fn maybe_entry(&self, item_id: DefIndex) -> Option>> { assert!(!self.is_proc_macro(item_id)); self.root.index.lookup(self.blob.raw_bytes(), item_id) } @@ -772,11 +772,6 @@ impl<'a, 'tcx> CrateMetadata { tcx.alloc_tables(ast.tables.decode((self, tcx))) } - pub fn is_item_mir_available(&self, id: DefIndex) -> bool { - !self.is_proc_macro(id) && - self.maybe_entry(id).and_then(|item| item.decode(self).mir).is_some() - } - pub fn maybe_get_item_mir(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, id: DefIndex) diff --git a/src/librustc_trans/collector.rs b/src/librustc_trans/collector.rs index 77155a474aed..786001161573 100644 --- a/src/librustc_trans/collector.rs +++ b/src/librustc_trans/collector.rs @@ -659,7 +659,7 @@ fn should_trans_locally<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, instance: &Instan // in this crate false } else { - if !tcx.sess.cstore.is_item_mir_available(def_id) { + if !tcx.is_item_mir_available(def_id) { bug!("Cannot create local trans-item for {:?}", def_id) } true