Try out caching the stable hash of Ty within itself
This commit is contained in:
@@ -24,6 +24,7 @@ use crate::ty::{
|
|||||||
RegionKind, ReprOptions, TraitObjectVisitor, Ty, TyKind, TyS, TyVar, TyVid, TypeAndMut, UintTy,
|
RegionKind, ReprOptions, TraitObjectVisitor, Ty, TyKind, TyS, TyVar, TyVid, TypeAndMut, UintTy,
|
||||||
};
|
};
|
||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
|
use rustc_data_structures::fingerprint::Fingerprint;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_data_structures::intern::Interned;
|
use rustc_data_structures::intern::Interned;
|
||||||
use rustc_data_structures::memmap::Mmap;
|
use rustc_data_structures::memmap::Mmap;
|
||||||
@@ -58,6 +59,7 @@ use rustc_span::{Span, DUMMY_SP};
|
|||||||
use rustc_target::abi::{Layout, TargetDataLayout, VariantIdx};
|
use rustc_target::abi::{Layout, TargetDataLayout, VariantIdx};
|
||||||
use rustc_target::spec::abi;
|
use rustc_target::spec::abi;
|
||||||
|
|
||||||
|
use rustc_type_ir::TypeFlags;
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use std::any::Any;
|
use std::any::Any;
|
||||||
use std::borrow::Borrow;
|
use std::borrow::Borrow;
|
||||||
@@ -140,16 +142,40 @@ impl<'tcx> CtxtInterners<'tcx> {
|
|||||||
/// Interns a type.
|
/// Interns a type.
|
||||||
#[allow(rustc::usage_of_ty_tykind)]
|
#[allow(rustc::usage_of_ty_tykind)]
|
||||||
#[inline(never)]
|
#[inline(never)]
|
||||||
fn intern_ty(&self, kind: TyKind<'tcx>) -> Ty<'tcx> {
|
fn intern_ty(
|
||||||
|
&self,
|
||||||
|
kind: TyKind<'tcx>,
|
||||||
|
sess: &Session,
|
||||||
|
resolutions: &ty::ResolverOutputs,
|
||||||
|
) -> Ty<'tcx> {
|
||||||
Ty(Interned::new_unchecked(
|
Ty(Interned::new_unchecked(
|
||||||
self.type_
|
self.type_
|
||||||
.intern(kind, |kind| {
|
.intern(kind, |kind| {
|
||||||
let flags = super::flags::FlagComputation::for_kind(&kind);
|
let flags = super::flags::FlagComputation::for_kind(&kind);
|
||||||
|
|
||||||
|
let stable_hash = if flags.flags.intersects(TypeFlags::HAS_RE_INFER) {
|
||||||
|
Fingerprint::ZERO
|
||||||
|
} else {
|
||||||
|
let mut hasher = StableHasher::new();
|
||||||
|
let mut hcx = StableHashingContext::new(
|
||||||
|
sess,
|
||||||
|
&resolutions.definitions,
|
||||||
|
&*resolutions.cstore,
|
||||||
|
);
|
||||||
|
|
||||||
|
hcx.while_hashing_spans(false, |hcx| {
|
||||||
|
hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| {
|
||||||
|
kind.hash_stable(hcx, &mut hasher);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
hasher.finish()
|
||||||
|
};
|
||||||
|
|
||||||
let ty_struct = TyS {
|
let ty_struct = TyS {
|
||||||
kind,
|
kind,
|
||||||
flags: flags.flags,
|
flags: flags.flags,
|
||||||
outer_exclusive_binder: flags.outer_exclusive_binder,
|
outer_exclusive_binder: flags.outer_exclusive_binder,
|
||||||
|
stable_hash,
|
||||||
};
|
};
|
||||||
|
|
||||||
InternedInSet(self.arena.alloc(ty_struct))
|
InternedInSet(self.arena.alloc(ty_struct))
|
||||||
@@ -887,8 +913,12 @@ pub enum UserType<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> CommonTypes<'tcx> {
|
impl<'tcx> CommonTypes<'tcx> {
|
||||||
fn new(interners: &CtxtInterners<'tcx>) -> CommonTypes<'tcx> {
|
fn new(
|
||||||
let mk = |ty| interners.intern_ty(ty);
|
interners: &CtxtInterners<'tcx>,
|
||||||
|
sess: &Session,
|
||||||
|
resolutions: &ty::ResolverOutputs,
|
||||||
|
) -> CommonTypes<'tcx> {
|
||||||
|
let mk = |ty| interners.intern_ty(ty, sess, resolutions);
|
||||||
|
|
||||||
CommonTypes {
|
CommonTypes {
|
||||||
unit: mk(Tuple(List::empty())),
|
unit: mk(Tuple(List::empty())),
|
||||||
@@ -1162,7 +1192,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||||||
s.fatal(&err);
|
s.fatal(&err);
|
||||||
});
|
});
|
||||||
let interners = CtxtInterners::new(arena);
|
let interners = CtxtInterners::new(arena);
|
||||||
let common_types = CommonTypes::new(&interners);
|
let common_types = CommonTypes::new(&interners, s, &resolutions);
|
||||||
let common_lifetimes = CommonLifetimes::new(&interners);
|
let common_lifetimes = CommonLifetimes::new(&interners);
|
||||||
let common_consts = CommonConsts::new(&interners, &common_types);
|
let common_consts = CommonConsts::new(&interners, &common_types);
|
||||||
|
|
||||||
@@ -2276,7 +2306,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||||||
#[allow(rustc::usage_of_ty_tykind)]
|
#[allow(rustc::usage_of_ty_tykind)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn mk_ty(self, st: TyKind<'tcx>) -> Ty<'tcx> {
|
pub fn mk_ty(self, st: TyKind<'tcx>) -> Ty<'tcx> {
|
||||||
self.interners.intern_ty(st)
|
self.interners.intern_ty(st, self.sess, &self.gcx.untracked_resolutions)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ pub use self::Variance::*;
|
|||||||
pub use adt::*;
|
pub use adt::*;
|
||||||
pub use assoc::*;
|
pub use assoc::*;
|
||||||
pub use generics::*;
|
pub use generics::*;
|
||||||
|
use rustc_data_structures::fingerprint::Fingerprint;
|
||||||
pub use vtable::*;
|
pub use vtable::*;
|
||||||
|
|
||||||
use crate::metadata::ModChild;
|
use crate::metadata::ModChild;
|
||||||
@@ -424,11 +425,15 @@ crate struct TyS<'tcx> {
|
|||||||
/// De Bruijn indices within the type are contained within `0..D`
|
/// De Bruijn indices within the type are contained within `0..D`
|
||||||
/// (exclusive).
|
/// (exclusive).
|
||||||
outer_exclusive_binder: ty::DebruijnIndex,
|
outer_exclusive_binder: ty::DebruijnIndex,
|
||||||
|
|
||||||
|
/// The stable hash of the type. This way hashing of types will not have to work
|
||||||
|
/// on the address of the type anymore, but can instead just read this field
|
||||||
|
stable_hash: Fingerprint,
|
||||||
}
|
}
|
||||||
|
|
||||||
// `TyS` is used a lot. Make sure it doesn't unintentionally get bigger.
|
// `TyS` is used a lot. Make sure it doesn't unintentionally get bigger.
|
||||||
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
|
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
|
||||||
static_assert_size!(TyS<'_>, 40);
|
static_assert_size!(TyS<'_>, 56);
|
||||||
|
|
||||||
/// Use this rather than `TyS`, whenever possible.
|
/// Use this rather than `TyS`, whenever possible.
|
||||||
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
@@ -442,21 +447,25 @@ static BOOL_TYS: TyS<'static> = TyS {
|
|||||||
kind: ty::Bool,
|
kind: ty::Bool,
|
||||||
flags: TypeFlags::empty(),
|
flags: TypeFlags::empty(),
|
||||||
outer_exclusive_binder: DebruijnIndex::from_usize(0),
|
outer_exclusive_binder: DebruijnIndex::from_usize(0),
|
||||||
|
stable_hash: Fingerprint::ZERO,
|
||||||
};
|
};
|
||||||
|
|
||||||
impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for Ty<'tcx> {
|
impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for Ty<'tcx> {
|
||||||
fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
|
fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
|
||||||
let TyS {
|
let TyS {
|
||||||
ref kind,
|
kind,
|
||||||
|
|
||||||
// The other fields just provide fast access to information that is
|
// The other fields just provide fast access to information that is
|
||||||
// also contained in `kind`, so no need to hash them.
|
// also contained in `kind`, so no need to hash them.
|
||||||
flags: _,
|
flags: _,
|
||||||
|
|
||||||
outer_exclusive_binder: _,
|
outer_exclusive_binder: _,
|
||||||
|
|
||||||
|
stable_hash,
|
||||||
} = self.0.0;
|
} = self.0.0;
|
||||||
|
|
||||||
kind.hash_stable(hcx, hasher);
|
assert_ne!(*stable_hash, Fingerprint::ZERO, "{:#?}", kind);
|
||||||
|
stable_hash.hash_stable(hcx, hasher);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
error: symbol-name(_ZN5basic4main17h611df9c6948c15f7E)
|
error: symbol-name(_ZN5basic4main17h87acd86b3a6f1754E)
|
||||||
--> $DIR/basic.rs:8:1
|
--> $DIR/basic.rs:8:1
|
||||||
|
|
|
|
||||||
LL | #[rustc_symbol_name]
|
LL | #[rustc_symbol_name]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: demangling(basic::main::h611df9c6948c15f7)
|
error: demangling(basic::main::h87acd86b3a6f1754)
|
||||||
--> $DIR/basic.rs:8:1
|
--> $DIR/basic.rs:8:1
|
||||||
|
|
|
|
||||||
LL | #[rustc_symbol_name]
|
LL | #[rustc_symbol_name]
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
error: symbol-name(_ZN11issue_609253foo37Foo$LT$issue_60925..llv$u6d$..Foo$GT$3foo17h5425dadb5b1e5fb6E)
|
error: symbol-name(_ZN11issue_609253foo37Foo$LT$issue_60925..llv$u6d$..Foo$GT$3foo17h8d22952c45e20d65E)
|
||||||
--> $DIR/issue-60925.rs:21:9
|
--> $DIR/issue-60925.rs:21:9
|
||||||
|
|
|
|
||||||
LL | #[rustc_symbol_name]
|
LL | #[rustc_symbol_name]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: demangling(issue_60925::foo::Foo<issue_60925::llvm::Foo>::foo::h5425dadb5b1e5fb6)
|
error: demangling(issue_60925::foo::Foo<issue_60925::llvm::Foo>::foo::h8d22952c45e20d65)
|
||||||
--> $DIR/issue-60925.rs:21:9
|
--> $DIR/issue-60925.rs:21:9
|
||||||
|
|
|
|
||||||
LL | #[rustc_symbol_name]
|
LL | #[rustc_symbol_name]
|
||||||
|
|||||||
Reference in New Issue
Block a user