mirror of https://github.com/rust-lang/rust.git
Rollup merge of #137095 - saethlin:use-hash64-for-hashes, r=workingjubilee
Replace some u64 hashes with Hash64 I introduced the Hash64 and Hash128 types in https://github.com/rust-lang/rust/pull/110083, essentially as a mechanism to prevent hashes from landing in our leb128 encoding paths. If you just have a u64 or u128 field in a struct then derive Encodable/Decodable, that number gets leb128 encoding. So if you need to store a hash or some other value which behaves very close to a hash, don't store it as a u64. This reverts part of https://github.com/rust-lang/rust/pull/117603, which turned an encoded Hash64 into a u64. Based on https://github.com/rust-lang/rust/pull/110083, I don't expect this to be perf-sensitive on its own, though I expect that it may help stabilize some of the small rmeta size fluctuations we currently see in perf reports.
This commit is contained in:
commit
fab38375bc
21
Cargo.lock
21
Cargo.lock
|
@ -3317,6 +3317,7 @@ dependencies = [
|
|||
"rand 0.8.5",
|
||||
"rand_xoshiro",
|
||||
"rustc_data_structures",
|
||||
"rustc_hashes",
|
||||
"rustc_index",
|
||||
"rustc_macros",
|
||||
"rustc_serialize",
|
||||
|
@ -3544,6 +3545,7 @@ dependencies = [
|
|||
"rustc_errors",
|
||||
"rustc_fluent_macro",
|
||||
"rustc_fs_util",
|
||||
"rustc_hashes",
|
||||
"rustc_hir",
|
||||
"rustc_index",
|
||||
"rustc_llvm",
|
||||
|
@ -3586,6 +3588,7 @@ dependencies = [
|
|||
"rustc_errors",
|
||||
"rustc_fluent_macro",
|
||||
"rustc_fs_util",
|
||||
"rustc_hashes",
|
||||
"rustc_hir",
|
||||
"rustc_hir_pretty",
|
||||
"rustc_incremental",
|
||||
|
@ -3658,6 +3661,7 @@ dependencies = [
|
|||
"rustc-stable-hash",
|
||||
"rustc_arena",
|
||||
"rustc_graphviz",
|
||||
"rustc_hashes",
|
||||
"rustc_index",
|
||||
"rustc_macros",
|
||||
"rustc_serialize",
|
||||
|
@ -3768,6 +3772,7 @@ dependencies = [
|
|||
"rustc_error_codes",
|
||||
"rustc_error_messages",
|
||||
"rustc_fluent_macro",
|
||||
"rustc_hashes",
|
||||
"rustc_hir",
|
||||
"rustc_index",
|
||||
"rustc_lexer",
|
||||
|
@ -3840,6 +3845,13 @@ version = "0.0.0"
|
|||
name = "rustc_graphviz"
|
||||
version = "0.0.0"
|
||||
|
||||
[[package]]
|
||||
name = "rustc_hashes"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"rustc-stable-hash",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustc_hir"
|
||||
version = "0.0.0"
|
||||
|
@ -3849,6 +3861,7 @@ dependencies = [
|
|||
"rustc_arena",
|
||||
"rustc_ast",
|
||||
"rustc_data_structures",
|
||||
"rustc_hashes",
|
||||
"rustc_index",
|
||||
"rustc_macros",
|
||||
"rustc_serialize",
|
||||
|
@ -4169,6 +4182,7 @@ dependencies = [
|
|||
"rustc_feature",
|
||||
"rustc_fluent_macro",
|
||||
"rustc_graphviz",
|
||||
"rustc_hashes",
|
||||
"rustc_hir",
|
||||
"rustc_hir_pretty",
|
||||
"rustc_index",
|
||||
|
@ -4405,6 +4419,7 @@ dependencies = [
|
|||
"measureme",
|
||||
"rustc_data_structures",
|
||||
"rustc_errors",
|
||||
"rustc_hashes",
|
||||
"rustc_hir",
|
||||
"rustc_index",
|
||||
"rustc_middle",
|
||||
|
@ -4428,6 +4443,7 @@ dependencies = [
|
|||
"rustc_errors",
|
||||
"rustc_feature",
|
||||
"rustc_fluent_macro",
|
||||
"rustc_hashes",
|
||||
"rustc_hir",
|
||||
"rustc_index",
|
||||
"rustc_macros",
|
||||
|
@ -4488,6 +4504,7 @@ name = "rustc_serialize"
|
|||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"rustc_hashes",
|
||||
"rustc_macros",
|
||||
"smallvec",
|
||||
"tempfile",
|
||||
|
@ -4508,6 +4525,7 @@ dependencies = [
|
|||
"rustc_feature",
|
||||
"rustc_fluent_macro",
|
||||
"rustc_fs_util",
|
||||
"rustc_hashes",
|
||||
"rustc_hir",
|
||||
"rustc_lint_defs",
|
||||
"rustc_macros",
|
||||
|
@ -4549,6 +4567,7 @@ dependencies = [
|
|||
"md-5",
|
||||
"rustc_arena",
|
||||
"rustc_data_structures",
|
||||
"rustc_hashes",
|
||||
"rustc_index",
|
||||
"rustc_macros",
|
||||
"rustc_serialize",
|
||||
|
@ -4568,6 +4587,7 @@ dependencies = [
|
|||
"rustc_abi",
|
||||
"rustc_data_structures",
|
||||
"rustc_errors",
|
||||
"rustc_hashes",
|
||||
"rustc_hir",
|
||||
"rustc_middle",
|
||||
"rustc_session",
|
||||
|
@ -4663,6 +4683,7 @@ dependencies = [
|
|||
"rustc_data_structures",
|
||||
"rustc_errors",
|
||||
"rustc_fluent_macro",
|
||||
"rustc_hashes",
|
||||
"rustc_hir",
|
||||
"rustc_index",
|
||||
"rustc_infer",
|
||||
|
|
|
@ -9,6 +9,7 @@ bitflags = "2.4.1"
|
|||
rand = { version = "0.8.4", default-features = false, optional = true }
|
||||
rand_xoshiro = { version = "0.6.0", optional = true }
|
||||
rustc_data_structures = { path = "../rustc_data_structures", optional = true }
|
||||
rustc_hashes = { path = "../rustc_hashes" }
|
||||
rustc_index = { path = "../rustc_index", default-features = false }
|
||||
rustc_macros = { path = "../rustc_macros", optional = true }
|
||||
rustc_serialize = { path = "../rustc_serialize", optional = true }
|
||||
|
|
|
@ -2,6 +2,7 @@ use std::fmt::{self, Write};
|
|||
use std::ops::{Bound, Deref};
|
||||
use std::{cmp, iter};
|
||||
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_index::Idx;
|
||||
use tracing::debug;
|
||||
|
||||
|
@ -133,7 +134,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
|
|||
size,
|
||||
max_repr_align: None,
|
||||
unadjusted_abi_align: align.abi,
|
||||
randomization_seed: combined_seed,
|
||||
randomization_seed: Hash64::new(combined_seed),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -226,7 +227,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
|
|||
size: Size::ZERO,
|
||||
max_repr_align: None,
|
||||
unadjusted_abi_align: dl.i8_align.abi,
|
||||
randomization_seed: 0,
|
||||
randomization_seed: Hash64::ZERO,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1058,7 +1059,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
|
|||
// unsizable tail fields are excluded so that we use the same seed for the sized and unsized layouts.
|
||||
let field_seed = fields_excluding_tail
|
||||
.iter()
|
||||
.fold(0u64, |acc, f| acc.wrapping_add(f.randomization_seed));
|
||||
.fold(Hash64::ZERO, |acc, f| acc.wrapping_add(f.randomization_seed));
|
||||
|
||||
if optimize_field_order && fields.len() > 1 {
|
||||
// If `-Z randomize-layout` was enabled for the type definition we can shuffle
|
||||
|
@ -1072,7 +1073,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
|
|||
// `ReprOptions.field_shuffle_seed` is a deterministic seed we can use to randomize field
|
||||
// ordering.
|
||||
let mut rng = rand_xoshiro::Xoshiro128StarStar::seed_from_u64(
|
||||
field_seed.wrapping_add(repr.field_shuffle_seed),
|
||||
field_seed.wrapping_add(repr.field_shuffle_seed).as_u64(),
|
||||
);
|
||||
|
||||
// Shuffle the ordering of the fields.
|
||||
|
|
|
@ -50,6 +50,7 @@ use std::str::FromStr;
|
|||
use bitflags::bitflags;
|
||||
#[cfg(feature = "nightly")]
|
||||
use rustc_data_structures::stable_hasher::StableOrd;
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_index::{Idx, IndexSlice, IndexVec};
|
||||
#[cfg(feature = "nightly")]
|
||||
use rustc_macros::{Decodable_Generic, Encodable_Generic, HashStable_Generic};
|
||||
|
@ -140,7 +141,7 @@ pub struct ReprOptions {
|
|||
/// hash without loss, but it does pay the price of being larger.
|
||||
/// Everything's a tradeoff, a 64-bit seed should be sufficient for our
|
||||
/// purposes (primarily `-Z randomize-layout`)
|
||||
pub field_shuffle_seed: u64,
|
||||
pub field_shuffle_seed: Hash64,
|
||||
}
|
||||
|
||||
impl ReprOptions {
|
||||
|
@ -1727,7 +1728,7 @@ pub struct LayoutData<FieldIdx: Idx, VariantIdx: Idx> {
|
|||
/// transmuted to `Foo<U>` we aim to create probalistically distinct seeds so that Foo can choose
|
||||
/// to reorder its fields based on that information. The current implementation is a conservative
|
||||
/// approximation of this goal.
|
||||
pub randomization_seed: u64,
|
||||
pub randomization_seed: Hash64,
|
||||
}
|
||||
|
||||
impl<FieldIdx: Idx, VariantIdx: Idx> LayoutData<FieldIdx, VariantIdx> {
|
||||
|
@ -1781,7 +1782,7 @@ impl<FieldIdx: Idx, VariantIdx: Idx> LayoutData<FieldIdx, VariantIdx> {
|
|||
align,
|
||||
max_repr_align: None,
|
||||
unadjusted_abi_align: align.abi,
|
||||
randomization_seed,
|
||||
randomization_seed: Hash64::new(randomization_seed),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@ rustc_data_structures = { path = "../rustc_data_structures" }
|
|||
rustc_errors = { path = "../rustc_errors" }
|
||||
rustc_fluent_macro = { path = "../rustc_fluent_macro" }
|
||||
rustc_fs_util = { path = "../rustc_fs_util" }
|
||||
rustc_hashes = { path = "../rustc_hashes" }
|
||||
rustc_hir = { path = "../rustc_hir" }
|
||||
rustc_index = { path = "../rustc_index" }
|
||||
rustc_llvm = { path = "../rustc_llvm" }
|
||||
|
|
|
@ -7,7 +7,8 @@ use rustc_abi::{AddressSpace, HasDataLayout};
|
|||
use rustc_ast::Mutability;
|
||||
use rustc_codegen_ssa::common::TypeKind;
|
||||
use rustc_codegen_ssa::traits::*;
|
||||
use rustc_data_structures::stable_hasher::{Hash128, HashStable, StableHasher};
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
use rustc_hashes::Hash128;
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_middle::bug;
|
||||
use rustc_middle::mir::interpret::{ConstAllocation, GlobalAlloc, Scalar};
|
||||
|
|
|
@ -25,6 +25,7 @@ rustc_data_structures = { path = "../rustc_data_structures" }
|
|||
rustc_errors = { path = "../rustc_errors" }
|
||||
rustc_fluent_macro = { path = "../rustc_fluent_macro" }
|
||||
rustc_fs_util = { path = "../rustc_fs_util" }
|
||||
rustc_hashes = { path = "../rustc_hashes" }
|
||||
rustc_hir = { path = "../rustc_hir" }
|
||||
rustc_hir_pretty = { path = "../rustc_hir_pretty" }
|
||||
rustc_incremental = { path = "../rustc_incremental" }
|
||||
|
|
|
@ -15,7 +15,8 @@ use std::fmt::Write;
|
|||
|
||||
use rustc_abi::Integer;
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
use rustc_data_structures::stable_hasher::{Hash64, HashStable, StableHasher};
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_hir::definitions::{DefPathData, DefPathDataName, DisambiguatedDefPathData};
|
||||
use rustc_hir::{CoroutineDesugaring, CoroutineKind, CoroutineSource, Mutability};
|
||||
|
|
|
@ -18,6 +18,7 @@ rustc-rayon = { version = "0.5.1", features = ["indexmap"] }
|
|||
rustc-stable-hash = { version = "0.1.0", features = ["nightly"] }
|
||||
rustc_arena = { path = "../rustc_arena" }
|
||||
rustc_graphviz = { path = "../rustc_graphviz" }
|
||||
rustc_hashes = { path = "../rustc_hashes" }
|
||||
rustc_index = { path = "../rustc_index", package = "rustc_index" }
|
||||
rustc_macros = { path = "../rustc_macros" }
|
||||
rustc_serialize = { path = "../rustc_serialize" }
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
use std::hash::{Hash, Hasher};
|
||||
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
|
||||
|
||||
use crate::stable_hasher::{
|
||||
FromStableHash, Hash64, StableHasherHash, impl_stable_traits_for_trivial_type,
|
||||
};
|
||||
use crate::stable_hasher::{FromStableHash, StableHasherHash, impl_stable_traits_for_trivial_type};
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
|
|
@ -84,7 +84,6 @@ pub mod vec_cache;
|
|||
pub mod work_queue;
|
||||
|
||||
mod atomic_ref;
|
||||
mod hashes;
|
||||
|
||||
/// This calls the passed function while ensuring it won't be inlined into the caller.
|
||||
#[inline(never)]
|
||||
|
|
|
@ -10,12 +10,11 @@ use smallvec::SmallVec;
|
|||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
use rustc_hashes::{Hash64, Hash128};
|
||||
pub use rustc_stable_hash::{
|
||||
FromStableHash, SipHasher128Hash as StableHasherHash, StableSipHasher128 as StableHasher,
|
||||
};
|
||||
|
||||
pub use crate::hashes::{Hash64, Hash128};
|
||||
|
||||
/// Something that implements `HashStable<CTX>` can be hashed in a way that is
|
||||
/// stable across multiple compilation sessions.
|
||||
///
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
use std::ptr;
|
||||
|
||||
use rustc_hashes::Hash128;
|
||||
|
||||
use super::*;
|
||||
use crate::hashes::Hash128;
|
||||
use crate::stable_hasher::{HashStable, StableHasher};
|
||||
|
||||
/// A tag type used in [`TaggedRef`] tests.
|
||||
|
|
|
@ -14,6 +14,7 @@ rustc_data_structures = { path = "../rustc_data_structures" }
|
|||
rustc_error_codes = { path = "../rustc_error_codes" }
|
||||
rustc_error_messages = { path = "../rustc_error_messages" }
|
||||
rustc_fluent_macro = { path = "../rustc_fluent_macro" }
|
||||
rustc_hashes = { path = "../rustc_hashes" }
|
||||
rustc_hir = { path = "../rustc_hir" }
|
||||
rustc_index = { path = "../rustc_index" }
|
||||
rustc_lexer = { path = "../rustc_lexer" }
|
||||
|
|
|
@ -58,12 +58,13 @@ pub use emitter::ColorConfig;
|
|||
use emitter::{DynEmitter, Emitter, is_case_difference, is_different};
|
||||
use rustc_data_structures::AtomicRef;
|
||||
use rustc_data_structures::fx::{FxHashSet, FxIndexMap, FxIndexSet};
|
||||
use rustc_data_structures::stable_hasher::{Hash128, StableHasher};
|
||||
use rustc_data_structures::stable_hasher::StableHasher;
|
||||
use rustc_data_structures::sync::{DynSend, Lock};
|
||||
pub use rustc_error_messages::{
|
||||
DiagMessage, FluentBundle, LanguageIdentifier, LazyFallbackBundle, MultiSpan, SpanLabel,
|
||||
SubdiagMessage, fallback_fluent_bundle, fluent_bundle,
|
||||
};
|
||||
use rustc_hashes::Hash128;
|
||||
use rustc_lint_defs::LintExpectationId;
|
||||
pub use rustc_lint_defs::{Applicability, listify, pluralize};
|
||||
use rustc_macros::{Decodable, Encodable};
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
[package]
|
||||
name = "rustc_hashes"
|
||||
version = "0.0.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
# tidy-alphabetical-start
|
||||
rustc-stable-hash = { version = "0.1.0" }
|
||||
# tidy-alphabetical-end
|
|
@ -1,6 +1,8 @@
|
|||
//! rustc encodes a lot of hashes. If hashes are stored as `u64` or `u128`, a `derive(Encodable)`
|
||||
//! will apply varint encoding to the hashes, which is less efficient than directly encoding the 8
|
||||
//! or 16 bytes of the hash.
|
||||
//! or 16 bytes of the hash. And if that hash depends on the `StableCrateHash` (which most in rustc
|
||||
//! do), the varint encoding will make the number of bytes encoded fluctuate between compiler
|
||||
//! versions.
|
||||
//!
|
||||
//! The types in this module represent 64-bit or 128-bit hashes produced by a `StableHasher`.
|
||||
//! `Hash64` and `Hash128` expose some utility functions to encourage users to not extract the inner
|
||||
|
@ -14,10 +16,9 @@
|
|||
use std::fmt;
|
||||
use std::ops::BitXorAssign;
|
||||
|
||||
use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
|
||||
|
||||
use crate::stable_hasher::{FromStableHash, StableHasherHash};
|
||||
use rustc_stable_hash::{FromStableHash, SipHasher128Hash as StableHasherHash};
|
||||
|
||||
/// A `u64` but encoded with a fixed size; for hashes this encoding is more compact than `u64`.
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Default)]
|
||||
pub struct Hash64 {
|
||||
inner: u64,
|
||||
|
@ -35,6 +36,11 @@ impl Hash64 {
|
|||
pub fn as_u64(self) -> u64 {
|
||||
self.inner
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn wrapping_add(self, other: Self) -> Self {
|
||||
Self { inner: self.inner.wrapping_add(other.inner) }
|
||||
}
|
||||
}
|
||||
|
||||
impl BitXorAssign<u64> for Hash64 {
|
||||
|
@ -44,20 +50,6 @@ impl BitXorAssign<u64> for Hash64 {
|
|||
}
|
||||
}
|
||||
|
||||
impl<S: Encoder> Encodable<S> for Hash64 {
|
||||
#[inline]
|
||||
fn encode(&self, s: &mut S) {
|
||||
s.emit_raw_bytes(&self.inner.to_le_bytes());
|
||||
}
|
||||
}
|
||||
|
||||
impl<D: Decoder> Decodable<D> for Hash64 {
|
||||
#[inline]
|
||||
fn decode(d: &mut D) -> Self {
|
||||
Self { inner: u64::from_le_bytes(d.read_raw_bytes(8).try_into().unwrap()) }
|
||||
}
|
||||
}
|
||||
|
||||
impl FromStableHash for Hash64 {
|
||||
type Hash = StableHasherHash;
|
||||
|
||||
|
@ -79,6 +71,7 @@ impl fmt::LowerHex for Hash64 {
|
|||
}
|
||||
}
|
||||
|
||||
/// A `u128` but encoded with a fixed size; for hashes this encoding is more compact than `u128`.
|
||||
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default)]
|
||||
pub struct Hash128 {
|
||||
inner: u128,
|
||||
|
@ -95,6 +88,11 @@ impl std::hash::Hash for Hash128 {
|
|||
}
|
||||
|
||||
impl Hash128 {
|
||||
#[inline]
|
||||
pub fn new(n: u128) -> Self {
|
||||
Self { inner: n }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn truncate(self) -> Hash64 {
|
||||
Hash64 { inner: self.inner as u64 }
|
||||
|
@ -111,20 +109,6 @@ impl Hash128 {
|
|||
}
|
||||
}
|
||||
|
||||
impl<S: Encoder> Encodable<S> for Hash128 {
|
||||
#[inline]
|
||||
fn encode(&self, s: &mut S) {
|
||||
s.emit_raw_bytes(&self.inner.to_le_bytes());
|
||||
}
|
||||
}
|
||||
|
||||
impl<D: Decoder> Decodable<D> for Hash128 {
|
||||
#[inline]
|
||||
fn decode(d: &mut D) -> Self {
|
||||
Self { inner: u128::from_le_bytes(d.read_raw_bytes(16).try_into().unwrap()) }
|
||||
}
|
||||
}
|
||||
|
||||
impl FromStableHash for Hash128 {
|
||||
type Hash = StableHasherHash;
|
||||
|
|
@ -10,6 +10,7 @@ rustc_abi = { path = "../rustc_abi" }
|
|||
rustc_arena = { path = "../rustc_arena" }
|
||||
rustc_ast = { path = "../rustc_ast" }
|
||||
rustc_data_structures = { path = "../rustc_data_structures" }
|
||||
rustc_hashes = { path = "../rustc_hashes" }
|
||||
rustc_index = { path = "../rustc_index" }
|
||||
rustc_macros = { path = "../rustc_macros" }
|
||||
rustc_serialize = { path = "../rustc_serialize" }
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use rustc_data_structures::stable_hasher::Hash64;
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_span::def_id::DefIndex;
|
||||
|
||||
#[derive(Clone, Default)]
|
||||
|
|
|
@ -7,8 +7,9 @@
|
|||
use std::fmt::{self, Write};
|
||||
use std::hash::Hash;
|
||||
|
||||
use rustc_data_structures::stable_hasher::{Hash64, StableHasher};
|
||||
use rustc_data_structures::stable_hasher::StableHasher;
|
||||
use rustc_data_structures::unord::UnordMap;
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_index::IndexVec;
|
||||
use rustc_macros::{Decodable, Encodable};
|
||||
use rustc_span::{Symbol, kw, sym};
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#![allow(rustc::symbol_intern_string_literal)]
|
||||
|
||||
use rustc_data_structures::stable_hasher::Hash64;
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_span::def_id::{DefPathHash, StableCrateId};
|
||||
use rustc_span::edition::Edition;
|
||||
use rustc_span::{Symbol, create_session_globals_then};
|
||||
|
|
|
@ -22,6 +22,7 @@ rustc_errors = { path = "../rustc_errors" }
|
|||
rustc_feature = { path = "../rustc_feature" }
|
||||
rustc_fluent_macro = { path = "../rustc_fluent_macro" }
|
||||
rustc_graphviz = { path = "../rustc_graphviz" }
|
||||
rustc_hashes = { path = "../rustc_hashes" }
|
||||
rustc_hir = { path = "../rustc_hir" }
|
||||
rustc_hir_pretty = { path = "../rustc_hir_pretty" }
|
||||
rustc_index = { path = "../rustc_index" }
|
||||
|
|
|
@ -6,8 +6,9 @@ use rustc_attr_parsing::InlineAttr;
|
|||
use rustc_data_structures::base_n::{BaseNString, CASE_INSENSITIVE, ToBaseN};
|
||||
use rustc_data_structures::fingerprint::Fingerprint;
|
||||
use rustc_data_structures::fx::FxIndexMap;
|
||||
use rustc_data_structures::stable_hasher::{Hash128, HashStable, StableHasher, ToStableHashKey};
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher, ToStableHashKey};
|
||||
use rustc_data_structures::unord::UnordMap;
|
||||
use rustc_hashes::Hash128;
|
||||
use rustc_hir::ItemId;
|
||||
use rustc_hir::def_id::{CrateNum, DefId, DefIdSet, LOCAL_CRATE};
|
||||
use rustc_index::Idx;
|
||||
|
|
|
@ -11,6 +11,7 @@ use rustc_error_messages::DiagMessage;
|
|||
use rustc_errors::{
|
||||
Diag, DiagArgValue, DiagCtxtHandle, Diagnostic, EmissionGuarantee, IntoDiagArg, Level,
|
||||
};
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_hir::LangItem;
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_index::IndexVec;
|
||||
|
@ -778,7 +779,7 @@ where
|
|||
size: Size::ZERO,
|
||||
max_repr_align: None,
|
||||
unadjusted_abi_align: tcx.data_layout.i8_align.abi,
|
||||
randomization_seed: 0,
|
||||
randomization_seed: Hash64::ZERO,
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -1487,8 +1487,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
|
||||
// Generate a deterministically-derived seed from the item's path hash
|
||||
// to allow for cross-crate compilation to actually work
|
||||
let mut field_shuffle_seed =
|
||||
self.def_path_hash(did.to_def_id()).0.to_smaller_hash().as_u64();
|
||||
let mut field_shuffle_seed = self.def_path_hash(did.to_def_id()).0.to_smaller_hash();
|
||||
|
||||
// If the user defined a custom seed for layout randomization, xor the item's
|
||||
// path hash with the user defined seed, this will allowing determinism while
|
||||
|
|
|
@ -5,9 +5,10 @@ use std::{fmt, iter};
|
|||
use rustc_abi::{ExternAbi, Float, Integer, IntegerType, Size};
|
||||
use rustc_apfloat::Float as _;
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_data_structures::stable_hasher::{Hash128, HashStable, StableHasher};
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||
use rustc_errors::ErrorGuaranteed;
|
||||
use rustc_hashes::Hash128;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::{CtorOf, DefKind, Res};
|
||||
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId};
|
||||
|
|
|
@ -8,6 +8,7 @@ edition = "2021"
|
|||
measureme = "11"
|
||||
rustc_data_structures = { path = "../rustc_data_structures" }
|
||||
rustc_errors = { path = "../rustc_errors" }
|
||||
rustc_hashes = { path = "../rustc_hashes" }
|
||||
rustc_hir = { path = "../rustc_hir" }
|
||||
rustc_index = { path = "../rustc_index" }
|
||||
rustc_middle = { path = "../rustc_middle" }
|
||||
|
|
|
@ -4,10 +4,11 @@
|
|||
|
||||
use std::num::NonZero;
|
||||
|
||||
use rustc_data_structures::stable_hasher::{Hash64, HashStable, StableHasher};
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
use rustc_data_structures::sync::Lock;
|
||||
use rustc_data_structures::unord::UnordMap;
|
||||
use rustc_errors::DiagInner;
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_index::Idx;
|
||||
use rustc_middle::bug;
|
||||
use rustc_middle::dep_graph::{
|
||||
|
|
|
@ -13,6 +13,7 @@ rustc_data_structures = { path = "../rustc_data_structures" }
|
|||
rustc_errors = { path = "../rustc_errors" }
|
||||
rustc_feature = { path = "../rustc_feature" }
|
||||
rustc_fluent_macro = { path = "../rustc_fluent_macro" }
|
||||
rustc_hashes = { path = "../rustc_hashes" }
|
||||
rustc_hir = { path = "../rustc_hir" }
|
||||
rustc_index = { path = "../rustc_index" }
|
||||
rustc_macros = { path = "../rustc_macros" }
|
||||
|
|
|
@ -11,9 +11,9 @@ mod caches;
|
|||
pub use self::caches::{DefIdCache, DefaultCache, QueryCache, SingleCache, VecCache};
|
||||
|
||||
mod config;
|
||||
use rustc_data_structures::stable_hasher::Hash64;
|
||||
use rustc_data_structures::sync::Lock;
|
||||
use rustc_errors::DiagInner;
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_hir::def::DefKind;
|
||||
use rustc_macros::{Decodable, Encodable};
|
||||
use rustc_span::Span;
|
||||
|
|
|
@ -6,6 +6,7 @@ edition = "2021"
|
|||
[dependencies]
|
||||
# tidy-alphabetical-start
|
||||
indexmap = "2.0.0"
|
||||
rustc_hashes = { path = "../rustc_hashes" }
|
||||
smallvec = { version = "1.8.1", features = ["union", "may_dangle"] }
|
||||
thin-vec = "0.2.12"
|
||||
# tidy-alphabetical-end
|
||||
|
|
|
@ -10,6 +10,7 @@ use std::path;
|
|||
use std::rc::Rc;
|
||||
use std::sync::Arc;
|
||||
|
||||
use rustc_hashes::{Hash64, Hash128};
|
||||
use smallvec::{Array, SmallVec};
|
||||
use thin_vec::ThinVec;
|
||||
|
||||
|
@ -716,3 +717,31 @@ impl<D: Decoder, T: Decodable<D>> Decodable<D> for Arc<[T]> {
|
|||
vec.into()
|
||||
}
|
||||
}
|
||||
|
||||
impl<S: Encoder> Encodable<S> for Hash64 {
|
||||
#[inline]
|
||||
fn encode(&self, s: &mut S) {
|
||||
s.emit_raw_bytes(&self.as_u64().to_le_bytes());
|
||||
}
|
||||
}
|
||||
|
||||
impl<S: Encoder> Encodable<S> for Hash128 {
|
||||
#[inline]
|
||||
fn encode(&self, s: &mut S) {
|
||||
s.emit_raw_bytes(&self.as_u128().to_le_bytes());
|
||||
}
|
||||
}
|
||||
|
||||
impl<D: Decoder> Decodable<D> for Hash64 {
|
||||
#[inline]
|
||||
fn decode(d: &mut D) -> Self {
|
||||
Self::new(u64::from_le_bytes(d.read_raw_bytes(8).try_into().unwrap()))
|
||||
}
|
||||
}
|
||||
|
||||
impl<D: Decoder> Decodable<D> for Hash128 {
|
||||
#[inline]
|
||||
fn decode(d: &mut D) -> Self {
|
||||
Self::new(u128::from_le_bytes(d.read_raw_bytes(16).try_into().unwrap()))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ rustc_errors = { path = "../rustc_errors" }
|
|||
rustc_feature = { path = "../rustc_feature" }
|
||||
rustc_fluent_macro = { path = "../rustc_fluent_macro" }
|
||||
rustc_fs_util = { path = "../rustc_fs_util" }
|
||||
rustc_hashes = { path = "../rustc_hashes" }
|
||||
rustc_hir = { path = "../rustc_hir" }
|
||||
rustc_lint_defs = { path = "../rustc_lint_defs" }
|
||||
rustc_macros = { path = "../rustc_macros" }
|
||||
|
|
|
@ -2934,9 +2934,9 @@ pub(crate) mod dep_tracking {
|
|||
|
||||
use rustc_abi::Align;
|
||||
use rustc_data_structures::fx::FxIndexMap;
|
||||
use rustc_data_structures::stable_hasher::Hash64;
|
||||
use rustc_errors::LanguageIdentifier;
|
||||
use rustc_feature::UnstableFeatures;
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_span::RealFileName;
|
||||
use rustc_span::edition::Edition;
|
||||
use rustc_target::spec::{
|
||||
|
|
|
@ -7,9 +7,9 @@ use std::str;
|
|||
use rustc_abi::Align;
|
||||
use rustc_data_structures::fx::FxIndexMap;
|
||||
use rustc_data_structures::profiling::TimePassesFormat;
|
||||
use rustc_data_structures::stable_hasher::Hash64;
|
||||
use rustc_errors::{ColorConfig, LanguageIdentifier, TerminalUrl};
|
||||
use rustc_feature::UnstableFeatures;
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_macros::{Decodable, Encodable};
|
||||
use rustc_span::edition::Edition;
|
||||
use rustc_span::{RealFileName, SourceFileHashAlgorithm};
|
||||
|
|
|
@ -12,6 +12,7 @@ itoa = "1.0"
|
|||
md5 = { package = "md-5", version = "0.10.0" }
|
||||
rustc_arena = { path = "../rustc_arena" }
|
||||
rustc_data_structures = { path = "../rustc_data_structures" }
|
||||
rustc_hashes = { path = "../rustc_hashes" }
|
||||
rustc_index = { path = "../rustc_index" }
|
||||
rustc_macros = { path = "../rustc_macros" }
|
||||
rustc_serialize = { path = "../rustc_serialize" }
|
||||
|
|
|
@ -3,10 +3,9 @@ use std::hash::{BuildHasherDefault, Hash, Hasher};
|
|||
|
||||
use rustc_data_structures::AtomicRef;
|
||||
use rustc_data_structures::fingerprint::Fingerprint;
|
||||
use rustc_data_structures::stable_hasher::{
|
||||
Hash64, HashStable, StableHasher, StableOrd, ToStableHashKey,
|
||||
};
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher, StableOrd, ToStableHashKey};
|
||||
use rustc_data_structures::unhash::Unhasher;
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_index::Idx;
|
||||
use rustc_macros::{Decodable, Encodable, HashStable_Generic};
|
||||
use rustc_serialize::{Decodable, Encodable};
|
||||
|
|
|
@ -33,9 +33,10 @@ use std::sync::Arc;
|
|||
|
||||
use rustc_data_structures::fingerprint::Fingerprint;
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_data_structures::stable_hasher::{Hash64, HashStable, HashingControls, StableHasher};
|
||||
use rustc_data_structures::stable_hasher::{HashStable, HashingControls, StableHasher};
|
||||
use rustc_data_structures::sync::{Lock, WorkerLocal};
|
||||
use rustc_data_structures::unhash::UnhashMap;
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_index::IndexVec;
|
||||
use rustc_macros::{Decodable, Encodable, HashStable_Generic};
|
||||
use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
|
||||
|
|
|
@ -87,9 +87,10 @@ use std::sync::Arc;
|
|||
use std::{fmt, iter};
|
||||
|
||||
use md5::{Digest, Md5};
|
||||
use rustc_data_structures::stable_hasher::{Hash64, Hash128, HashStable, StableHasher};
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
use rustc_data_structures::sync::{FreezeLock, FreezeWriteGuard, Lock};
|
||||
use rustc_data_structures::unord::UnordMap;
|
||||
use rustc_hashes::{Hash64, Hash128};
|
||||
use sha1::Sha1;
|
||||
use sha2::Sha256;
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ rustc-demangle = "0.1.21"
|
|||
rustc_abi = { path = "../rustc_abi" }
|
||||
rustc_data_structures = { path = "../rustc_data_structures" }
|
||||
rustc_errors = { path = "../rustc_errors" }
|
||||
rustc_hashes = { path = "../rustc_hashes" }
|
||||
rustc_hir = { path = "../rustc_hir" }
|
||||
rustc_middle = { path = "../rustc_middle" }
|
||||
rustc_session = { path = "../rustc_session" }
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
use std::fmt::Write;
|
||||
|
||||
use rustc_data_structures::stable_hasher::{Hash64, HashStable, StableHasher};
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_hir::def_id::CrateNum;
|
||||
use rustc_middle::ty::{Instance, TyCtxt};
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
use std::fmt::{self, Write};
|
||||
use std::mem::{self, discriminant};
|
||||
|
||||
use rustc_data_structures::stable_hasher::{Hash64, HashStable, StableHasher};
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_hir::def_id::{CrateNum, DefId};
|
||||
use rustc_hir::definitions::{DefPathData, DisambiguatedDefPathData};
|
||||
use rustc_middle::bug;
|
||||
|
|
|
@ -11,6 +11,7 @@ rustc_ast_ir = { path = "../rustc_ast_ir" }
|
|||
rustc_data_structures = { path = "../rustc_data_structures" }
|
||||
rustc_errors = { path = "../rustc_errors" }
|
||||
rustc_fluent_macro = { path = "../rustc_fluent_macro" }
|
||||
rustc_hashes = { path = "../rustc_hashes" }
|
||||
rustc_hir = { path = "../rustc_hir" }
|
||||
rustc_index = { path = "../rustc_index" }
|
||||
rustc_infer = { path = "../rustc_infer" }
|
||||
|
|
|
@ -9,6 +9,7 @@ use rustc_abi::{
|
|||
HasDataLayout, Layout, LayoutCalculatorError, LayoutData, Niche, ReprOptions, Scalar, Size,
|
||||
StructKind, TagEncoding, VariantIdx, Variants, WrappingRange,
|
||||
};
|
||||
use rustc_hashes::Hash64;
|
||||
use rustc_index::bit_set::DenseBitSet;
|
||||
use rustc_index::{IndexSlice, IndexVec};
|
||||
use rustc_middle::bug;
|
||||
|
@ -380,7 +381,7 @@ fn layout_of_uncached<'tcx>(
|
|||
size,
|
||||
max_repr_align: None,
|
||||
unadjusted_abi_align: element.align.abi,
|
||||
randomization_seed: element.randomization_seed.wrapping_add(count),
|
||||
randomization_seed: element.randomization_seed.wrapping_add(Hash64::new(count)),
|
||||
})
|
||||
}
|
||||
ty::Slice(element) => {
|
||||
|
@ -395,7 +396,9 @@ fn layout_of_uncached<'tcx>(
|
|||
max_repr_align: None,
|
||||
unadjusted_abi_align: element.align.abi,
|
||||
// adding a randomly chosen value to distinguish slices
|
||||
randomization_seed: element.randomization_seed.wrapping_add(0x2dcba99c39784102),
|
||||
randomization_seed: element
|
||||
.randomization_seed
|
||||
.wrapping_add(Hash64::new(0x2dcba99c39784102)),
|
||||
})
|
||||
}
|
||||
ty::Str => tcx.mk_layout(LayoutData {
|
||||
|
@ -408,7 +411,7 @@ fn layout_of_uncached<'tcx>(
|
|||
max_repr_align: None,
|
||||
unadjusted_abi_align: dl.i8_align.abi,
|
||||
// another random value
|
||||
randomization_seed: 0xc1325f37d127be22,
|
||||
randomization_seed: Hash64::new(0xc1325f37d127be22),
|
||||
}),
|
||||
|
||||
// Odd unit types.
|
||||
|
@ -585,7 +588,7 @@ fn layout_of_uncached<'tcx>(
|
|||
align,
|
||||
max_repr_align: None,
|
||||
unadjusted_abi_align: align.abi,
|
||||
randomization_seed: e_ly.randomization_seed.wrapping_add(e_len),
|
||||
randomization_seed: e_ly.randomization_seed.wrapping_add(Hash64::new(e_len)),
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -1051,7 +1054,7 @@ fn coroutine_layout<'tcx>(
|
|||
};
|
||||
|
||||
// this is similar to how ReprOptions populates its field_shuffle_seed
|
||||
let def_hash = tcx.def_path_hash(def_id).0.to_smaller_hash().as_u64();
|
||||
let def_hash = tcx.def_path_hash(def_id).0.to_smaller_hash();
|
||||
|
||||
let layout = tcx.mk_layout(LayoutData {
|
||||
variants: Variants::Multiple {
|
||||
|
|
|
@ -14,6 +14,7 @@ use rustc_type_ir_macros::{Lift_Generic, TypeFoldable_Generic, TypeVisitable_Gen
|
|||
use self::TyKind::*;
|
||||
pub use self::closure::*;
|
||||
use crate::inherent::*;
|
||||
#[cfg(feature = "nightly")]
|
||||
use crate::visit::TypeVisitable;
|
||||
use crate::{self as ty, DebruijnIndex, Interner};
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ use hir_expand::name::Name;
|
|||
use intern::sym;
|
||||
use la_arena::Arena;
|
||||
use rustc_abi::{Align, Integer, IntegerType, ReprFlags, ReprOptions};
|
||||
use rustc_hashes::Hash64;
|
||||
use triomphe::Arc;
|
||||
use tt::iter::TtElement;
|
||||
|
||||
|
@ -172,7 +173,7 @@ fn parse_repr_tt(tt: &TopSubtree) -> Option<ReprOptions> {
|
|||
}
|
||||
}
|
||||
|
||||
Some(ReprOptions { int, align: max_align, pack: min_pack, flags, field_shuffle_seed: 0 })
|
||||
Some(ReprOptions { int, align: max_align, pack: min_pack, flags, field_shuffle_seed: Hash64::ZERO })
|
||||
}
|
||||
|
||||
impl StructData {
|
||||
|
|
|
@ -18,9 +18,15 @@ extern crate ra_ap_rustc_parse_format as rustc_parse_format;
|
|||
#[cfg(feature = "in-rust-tree")]
|
||||
extern crate rustc_abi;
|
||||
|
||||
#[cfg(feature = "in-rust-tree")]
|
||||
extern crate rustc_hashes;
|
||||
|
||||
#[cfg(not(feature = "in-rust-tree"))]
|
||||
extern crate ra_ap_rustc_abi as rustc_abi;
|
||||
|
||||
#[cfg(not(feature = "in-rust-tree"))]
|
||||
extern crate ra_ap_rustc_hashes as rustc_hashes;
|
||||
|
||||
pub mod db;
|
||||
|
||||
pub mod attr;
|
||||
|
|
|
@ -15,6 +15,7 @@ use hir_def::{
|
|||
use la_arena::{Idx, RawIdx};
|
||||
use rustc_abi::AddressSpace;
|
||||
use rustc_index::{IndexSlice, IndexVec};
|
||||
use rustc_hashes::Hash64;
|
||||
|
||||
use triomphe::Arc;
|
||||
|
||||
|
@ -197,7 +198,7 @@ fn layout_of_simd_ty(
|
|||
align,
|
||||
max_repr_align: None,
|
||||
unadjusted_abi_align: align.abi,
|
||||
randomization_seed: 0,
|
||||
randomization_seed: Hash64::ZERO,
|
||||
}))
|
||||
}
|
||||
|
||||
|
@ -314,7 +315,7 @@ pub fn layout_of_ty_query(
|
|||
size,
|
||||
max_repr_align: None,
|
||||
unadjusted_abi_align: element.align.abi,
|
||||
randomization_seed: 0,
|
||||
randomization_seed: Hash64::ZERO,
|
||||
}
|
||||
}
|
||||
TyKind::Slice(element) => {
|
||||
|
@ -328,7 +329,7 @@ pub fn layout_of_ty_query(
|
|||
size: Size::ZERO,
|
||||
max_repr_align: None,
|
||||
unadjusted_abi_align: element.align.abi,
|
||||
randomization_seed: 0,
|
||||
randomization_seed: Hash64::ZERO,
|
||||
}
|
||||
}
|
||||
TyKind::Str => Layout {
|
||||
|
@ -340,7 +341,7 @@ pub fn layout_of_ty_query(
|
|||
size: Size::ZERO,
|
||||
max_repr_align: None,
|
||||
unadjusted_abi_align: dl.i8_align.abi,
|
||||
randomization_seed: 0,
|
||||
randomization_seed: Hash64::ZERO,
|
||||
},
|
||||
// Potentially-wide pointers.
|
||||
TyKind::Ref(_, _, pointee) | TyKind::Raw(_, pointee) => {
|
||||
|
|
|
@ -12,6 +12,9 @@ extern crate ra_ap_rustc_index as rustc_index;
|
|||
#[cfg(feature = "in-rust-tree")]
|
||||
extern crate rustc_abi;
|
||||
|
||||
#[cfg(feature = "in-rust-tree")]
|
||||
extern crate rustc_hashes;
|
||||
|
||||
#[cfg(not(feature = "in-rust-tree"))]
|
||||
extern crate ra_ap_rustc_abi as rustc_abi;
|
||||
|
||||
|
@ -21,6 +24,9 @@ extern crate rustc_pattern_analysis;
|
|||
#[cfg(not(feature = "in-rust-tree"))]
|
||||
extern crate ra_ap_rustc_pattern_analysis as rustc_pattern_analysis;
|
||||
|
||||
#[cfg(not(feature = "in-rust-tree"))]
|
||||
extern crate ra_ap_rustc_hashes as rustc_hashes;
|
||||
|
||||
mod builder;
|
||||
mod chalk_db;
|
||||
mod chalk_ext;
|
||||
|
|
|
@ -35,6 +35,8 @@ fn main() {
|
|||
"rustc_abi",
|
||||
"-p",
|
||||
"rustc_parse_format",
|
||||
"-p",
|
||||
"rustc_hashes",
|
||||
])
|
||||
.run();
|
||||
}
|
||||
|
|
|
@ -2,5 +2,13 @@ error: crate `rustc_serialize` required to be available in rlib format, but was
|
|||
|
|
||||
= help: try adding `extern crate rustc_driver;` at the top level of this crate
|
||||
|
||||
error: crate `rustc_hashes` required to be available in rlib format, but was not found in this form
|
||||
|
|
||||
= help: try adding `extern crate rustc_driver;` at the top level of this crate
|
||||
|
||||
error: crate `rustc_stable_hash` required to be available in rlib format, but was not found in this form
|
||||
|
|
||||
= help: try adding `extern crate rustc_driver;` at the top level of this crate
|
||||
|
||||
error: aborting due to NUMBER previous errors
|
||||
|
||||
|
|
Loading…
Reference in New Issue