Auto merge of #120006 - cjgillot:no-hir-owner, r=wesleywiser
Get rid of the hir_owner query. This query was meant as a firewall between `hir_owner_nodes` which is supposed to change often, and the queries that only depend on the item signature. That firewall was inefficient, leaking the contents of the HIR body through `HirId`s. `hir_owner` incurs a significant cost, as we need to hash HIR twice in multiple modes. This PR proposes to remove it, and simplify the hashing scheme. For the future, `def_kind`, `def_span`... are much more efficient for incremental decoupling, and should be preferred.
This commit is contained in:
commit
d3c9082a44
30 changed files with 581 additions and 716 deletions
|
@ -1,10 +1,8 @@
|
|||
use crate::ich;
|
||||
|
||||
use rustc_ast as ast;
|
||||
use rustc_data_structures::sorted_map::SortedMap;
|
||||
use rustc_data_structures::stable_hasher::{HashStable, HashingControls, StableHasher};
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_hir::definitions::DefPathHash;
|
||||
use rustc_session::cstore::Untracked;
|
||||
|
@ -23,7 +21,6 @@ pub struct StableHashingContext<'a> {
|
|||
// The value of `-Z incremental-ignore-spans`.
|
||||
// This field should only be used by `unstable_opts_incremental_ignore_span`
|
||||
incremental_ignore_spans: bool,
|
||||
pub(super) body_resolver: BodyResolver<'a>,
|
||||
// Very often, we are hashing something that does not need the
|
||||
// `CachingSourceMapView`, so we initialize it lazily.
|
||||
raw_source_map: &'a SourceMap,
|
||||
|
@ -31,26 +28,12 @@ pub struct StableHashingContext<'a> {
|
|||
hashing_controls: HashingControls,
|
||||
}
|
||||
|
||||
/// The `BodyResolver` allows mapping a `BodyId` to the corresponding `hir::Body`.
|
||||
/// We could also just store a plain reference to the `hir::Crate` but we want
|
||||
/// to avoid that the crate is used to get untracked access to all of the HIR.
|
||||
#[derive(Clone, Copy)]
|
||||
pub(super) enum BodyResolver<'tcx> {
|
||||
Forbidden,
|
||||
Ignore,
|
||||
Traverse {
|
||||
owner: hir::OwnerId,
|
||||
bodies: &'tcx SortedMap<hir::ItemLocalId, &'tcx hir::Body<'tcx>>,
|
||||
},
|
||||
}
|
||||
|
||||
impl<'a> StableHashingContext<'a> {
|
||||
#[inline]
|
||||
pub fn new(sess: &'a Session, untracked: &'a Untracked) -> Self {
|
||||
let hash_spans_initial = !sess.opts.unstable_opts.incremental_ignore_spans;
|
||||
|
||||
StableHashingContext {
|
||||
body_resolver: BodyResolver::Forbidden,
|
||||
untracked,
|
||||
incremental_ignore_spans: sess.opts.unstable_opts.incremental_ignore_spans,
|
||||
caching_source_map: None,
|
||||
|
@ -59,24 +42,6 @@ impl<'a> StableHashingContext<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn without_hir_bodies(&mut self, f: impl FnOnce(&mut StableHashingContext<'_>)) {
|
||||
f(&mut StableHashingContext { body_resolver: BodyResolver::Ignore, ..self.clone() });
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn with_hir_bodies(
|
||||
&mut self,
|
||||
owner: hir::OwnerId,
|
||||
bodies: &SortedMap<hir::ItemLocalId, &hir::Body<'_>>,
|
||||
f: impl FnOnce(&mut StableHashingContext<'_>),
|
||||
) {
|
||||
f(&mut StableHashingContext {
|
||||
body_resolver: BodyResolver::Traverse { owner, bodies },
|
||||
..self.clone()
|
||||
});
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn while_hashing_spans<F: FnOnce(&mut Self)>(&mut self, hash_spans: bool, f: F) {
|
||||
let prev_hash_spans = self.hashing_controls.hash_spans;
|
||||
|
|
|
@ -1,22 +0,0 @@
|
|||
//! This module contains `HashStable` implementations for various HIR data
|
||||
//! types in no particular order.
|
||||
|
||||
use crate::ich::hcx::BodyResolver;
|
||||
use crate::ich::StableHashingContext;
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
use rustc_hir as hir;
|
||||
|
||||
impl<'ctx> rustc_hir::HashStableContext for StableHashingContext<'ctx> {
|
||||
#[inline]
|
||||
fn hash_body_id(&mut self, id: hir::BodyId, hasher: &mut StableHasher) {
|
||||
let hcx = self;
|
||||
match hcx.body_resolver {
|
||||
BodyResolver::Forbidden => panic!("Hashing HIR bodies is forbidden."),
|
||||
BodyResolver::Ignore => {}
|
||||
BodyResolver::Traverse { owner, bodies } => {
|
||||
assert_eq!(id.hir_id.owner, owner);
|
||||
bodies[&id.hir_id.local_id].hash_stable(hcx, hasher);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -57,6 +57,8 @@ impl<'ctx> rustc_ast::HashStableContext for StableHashingContext<'ctx> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'ctx> rustc_hir::HashStableContext for StableHashingContext<'ctx> {}
|
||||
|
||||
impl<'a> HashStable<StableHashingContext<'a>> for SourceFile {
|
||||
fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
|
||||
let SourceFile {
|
||||
|
|
|
@ -4,7 +4,6 @@ pub use self::hcx::StableHashingContext;
|
|||
use rustc_span::symbol::{sym, Symbol};
|
||||
|
||||
mod hcx;
|
||||
mod impls_hir;
|
||||
mod impls_syntax;
|
||||
|
||||
pub const IGNORED_ATTRIBUTES: &[Symbol] = &[
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue