diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs index 3156f17e0c4c5..fe82477dfc43f 100644 --- a/src/librustc/dep_graph/dep_node.rs +++ b/src/librustc/dep_graph/dep_node.rs @@ -480,6 +480,7 @@ define_dep_nodes!( <'tcx> // table in the tcx (or elsewhere) maps to one of these // nodes. [] AssociatedItems(DefId), + [] HirQuery(CrateNum), [] TypeOfItem(DefId), [] GenericsOfItem(DefId), [] PredicatesOfItem(DefId), diff --git a/src/librustc/hir/map/mod.rs b/src/librustc/hir/map/mod.rs index 5bcbeeefa5030..6e323c7b08e51 100644 --- a/src/librustc/hir/map/mod.rs +++ b/src/librustc/hir/map/mod.rs @@ -133,7 +133,7 @@ impl<'hir> Entry<'hir> { /// Stores a crate and any number of inlined items from other crates. pub struct Forest { - krate: Crate, + pub(crate) krate: Crate, pub dep_graph: DepGraph, } diff --git a/src/librustc/ich/impls_hir.rs b/src/librustc/ich/impls_hir.rs index 8ff60e5f56225..d76de6cb33f20 100644 --- a/src/librustc/ich/impls_hir.rs +++ b/src/librustc/ich/impls_hir.rs @@ -11,6 +11,14 @@ use std::mem; use syntax::ast; use syntax::attr; +impl<'a> HashStable> for hir::map::Map<'_> { + #[inline] + fn hash_stable(&self, + _hcx: &mut StableHashingContext<'a>, + _hasher: &mut StableHasher) { + } +} + impl<'a> HashStable> for DefId { #[inline] fn hash_stable(&self, diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs index 6c377941dad19..cf5eef4179cee 100644 --- a/src/librustc/ty/context.rs +++ b/src/librustc/ty/context.rs @@ -957,7 +957,7 @@ pub struct GlobalCtxt<'tcx> { /// Export map produced by name resolution. export_map: FxHashMap>>, - hir_map: hir_map::Map<'tcx>, + pub hir_map: hir_map::Map<'tcx>, /// A map from DefPathHash -> DefId. Includes DefIds from the local crate /// as well as all upstream crates. Only populated in incremental mode. @@ -1028,7 +1028,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { #[inline(always)] pub fn hir(self) -> &'a hir_map::Map<'gcx> { - &self.hir_map + self.hir_query(LOCAL_CRATE) } pub fn alloc_generics(self, generics: ty::Generics) -> &'gcx ty::Generics { @@ -1334,7 +1334,8 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { #[inline] pub fn def_path_hash(self, def_id: DefId) -> hir_map::DefPathHash { if def_id.is_local() { - self.hir().definitions().def_path_hash(def_id.index) + // FIXME: This is used when executing the hir query, can't use hir() here + self.hir_map.definitions().def_path_hash(def_id.index) } else { self.cstore.def_path_hash(def_id) } @@ -1373,11 +1374,11 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { #[inline(always)] pub fn create_stable_hashing_context(self) -> StableHashingContext<'a> { + // FIXME: This is used when executing the hir query, can't use hir() here let krate = self.gcx.hir_map.forest.untracked_krate(); - StableHashingContext::new(self.sess, krate, - self.hir().definitions(), + self.hir_map.definitions(), self.cstore) } diff --git a/src/librustc/ty/query/config.rs b/src/librustc/ty/query/config.rs index 3464464aa229c..3283064521a96 100644 --- a/src/librustc/ty/query/config.rs +++ b/src/librustc/ty/query/config.rs @@ -602,6 +602,12 @@ impl<'tcx> QueryDescription<'tcx> for queries::crate_disambiguator<'tcx> { } } +impl<'tcx> QueryDescription<'tcx> for queries::hir_query<'tcx> { + fn describe(_tcx: TyCtxt<'_, '_, '_>, _: CrateNum) -> Cow<'static, str> { + "hir_query".into() + } +} + impl<'tcx> QueryDescription<'tcx> for queries::crate_hash<'tcx> { fn describe(_tcx: TyCtxt<'_, '_, '_>, _: CrateNum) -> Cow<'static, str> { "looking up the hash a crate".into() diff --git a/src/librustc/ty/query/mod.rs b/src/librustc/ty/query/mod.rs index 99dd3569491bc..60a32c8b8d99a 100644 --- a/src/librustc/ty/query/mod.rs +++ b/src/librustc/ty/query/mod.rs @@ -97,6 +97,9 @@ pub use self::on_disk_cache::OnDiskCache; // as they will raise an fatal error on query cycles instead. define_queries! { <'tcx> Other { + /// Records the type of every item. + [] fn hir_query: HirQuery(CrateNum) -> &'tcx hir::map::Map<'tcx>, + /// Records the type of every item. [] fn type_of: TypeOfItem(DefId) -> Ty<'tcx>, diff --git a/src/librustc/ty/query/plumbing.rs b/src/librustc/ty/query/plumbing.rs index fd51f4f86a0af..8132eaad6a64c 100644 --- a/src/librustc/ty/query/plumbing.rs +++ b/src/librustc/ty/query/plumbing.rs @@ -1263,6 +1263,7 @@ pub fn force_from_dep_node<'a, 'gcx, 'lcx>(tcx: TyCtxt<'a, 'gcx, 'lcx>, DepKind::MirKeys => { force!(mir_keys, LOCAL_CRATE); } DepKind::CrateVariances => { force!(crate_variances, LOCAL_CRATE); } DepKind::AssociatedItems => { force!(associated_item, def_id!()); } + DepKind::HirQuery => { force!(hir_query, LOCAL_CRATE); } DepKind::TypeOfItem => { force!(type_of, def_id!()); } DepKind::GenericsOfItem => { force!(generics_of, def_id!()); } DepKind::PredicatesOfItem => { force!(predicates_of, def_id!()); } diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index e0e173901ef38..8198f6833a853 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -63,6 +63,7 @@ pub fn collect_item_types<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) { pub fn provide(providers: &mut Providers) { *providers = Providers { + hir_query, type_of, generics_of, predicates_of, @@ -1111,6 +1112,11 @@ fn report_assoc_ty_on_inherent_impl<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, span: ); } +fn hir_query<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, _: hir::def_id::CrateNum +) -> &'tcx hir::map::Map<'tcx> { + &tcx.hir_map +} + fn type_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> Ty<'tcx> { use rustc::hir::*;