Skip to content

Commit

Permalink
Auto merge of #120076 - Mark-Simulacrum:unhash, r=cjgillot
Browse files Browse the repository at this point in the history
Use UnhashMap for a few more maps

This avoids a few cases of hashing data that's already hashed.

cc #56308
  • Loading branch information
bors committed Jan 19, 2024
2 parents d3c9082 + 510fcd3 commit 1bd42be
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 6 deletions.
12 changes: 11 additions & 1 deletion compiler/rustc_data_structures/src/hashes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,21 @@ impl fmt::LowerHex for Hash64 {
}
}

#[derive(Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Default)]
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default)]
pub struct Hash128 {
inner: u128,
}

// We expect Hash128 to be well mixed. So there's no point in hashing both parts.
//
// This also allows using Hash128-containing types in UnHash-based hashmaps, which would otherwise
// debug_assert! that we're hashing more than a single u64.
impl std::hash::Hash for Hash128 {
fn hash<H: std::hash::Hasher>(&self, h: &mut H) {
h.write_u64(self.truncate().as_u64());
}
}

impl Hash128 {
#[inline]
pub fn truncate(self) -> Hash64 {
Expand Down
14 changes: 13 additions & 1 deletion compiler/rustc_data_structures/src/stable_hasher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,19 @@ impl_stable_traits_for_trivial_type!(char);
impl_stable_traits_for_trivial_type!(());

impl_stable_traits_for_trivial_type!(Hash64);
impl_stable_traits_for_trivial_type!(Hash128);

// We need a custom impl as the default hash function will only hash half the bits. For stable
// hashing we want to hash the full 128-bit hash.
impl<CTX> HashStable<CTX> for Hash128 {
#[inline]
fn hash_stable(&self, _: &mut CTX, hasher: &mut StableHasher) {
self.as_u128().hash(hasher);
}
}

unsafe impl StableOrd for Hash128 {
const CAN_USE_UNSTABLE_SORT: bool = true;
}

impl<CTX> HashStable<CTX> for ! {
fn hash_stable(&self, _ctx: &mut CTX, _hasher: &mut StableHasher) {
Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_span/src/hygiene.rs
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ pub(crate) struct HygieneData {
/// would have collisions without a disambiguator.
/// The keys of this map are always computed with `ExpnData.disambiguator`
/// set to 0.
expn_data_disambiguators: FxHashMap<Hash64, u32>,
expn_data_disambiguators: UnhashMap<Hash64, u32>,
}

impl HygieneData {
Expand Down Expand Up @@ -359,7 +359,7 @@ impl HygieneData {
dollar_crate_name: kw::DollarCrate,
}],
syntax_context_map: FxHashMap::default(),
expn_data_disambiguators: FxHashMap::default(),
expn_data_disambiguators: UnhashMap::default(),
}
}

Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_span/src/source_map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
//! information, source code snippets, etc.

use crate::*;
use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::sync::{IntoDynSyncSend, MappedReadGuard, ReadGuard, RwLock};
use rustc_data_structures::unhash::UnhashMap;
use std::fs;
use std::io::{self, BorrowedBuf, Read};
use std::path::{self};
Expand Down Expand Up @@ -164,7 +164,7 @@ impl FileLoader for RealFileLoader {
#[derive(Default)]
struct SourceMapFiles {
source_files: monotonic::MonotonicVec<Lrc<SourceFile>>,
stable_id_to_source_file: FxHashMap<StableSourceFileId, Lrc<SourceFile>>,
stable_id_to_source_file: UnhashMap<StableSourceFileId, Lrc<SourceFile>>,
}

pub struct SourceMap {
Expand Down

0 comments on commit 1bd42be

Please sign in to comment.