From: Mark Rousskov Date: Sat, 4 Aug 2018 00:34:23 +0000 (-0600) Subject: Move Fingerprint to data structures X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=bd6fe1e7007c110d3afa46a2c0df14eb07df372e;p=rust.git Move Fingerprint to data structures --- diff --git a/src/librustc/ich/fingerprint.rs b/src/librustc/ich/fingerprint.rs deleted file mode 100644 index f00c5a649d2..00000000000 --- a/src/librustc/ich/fingerprint.rs +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2016 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use std::mem; -use rustc_data_structures::stable_hasher; -use serialize; -use serialize::opaque::{EncodeResult, Encoder, Decoder}; - -#[derive(Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Clone, Copy)] -pub struct Fingerprint(u64, u64); - -impl Fingerprint { - - pub const ZERO: Fingerprint = Fingerprint(0, 0); - - #[inline] - pub fn from_smaller_hash(hash: u64) -> Fingerprint { - Fingerprint(hash, hash) - } - - #[inline] - pub fn to_smaller_hash(&self) -> u64 { - self.0 - } - - #[inline] - pub fn as_value(&self) -> (u64, u64) { - (self.0, self.1) - } - - #[inline] - pub fn combine(self, other: Fingerprint) -> Fingerprint { - // See https://stackoverflow.com/a/27952689 on why this function is - // implemented this way. - Fingerprint( - self.0.wrapping_mul(3).wrapping_add(other.0), - self.1.wrapping_mul(3).wrapping_add(other.1) - ) - } - - // Combines two hashes in an order independent way. Make sure this is what - // you want. - #[inline] - pub fn combine_commutative(self, other: Fingerprint) -> Fingerprint { - let a = (self.1 as u128) << 64 | self.0 as u128; - let b = (other.1 as u128) << 64 | other.0 as u128; - - let c = a.wrapping_add(b); - - Fingerprint((c >> 64) as u64, c as u64) - } - - pub fn to_hex(&self) -> String { - format!("{:x}{:x}", self.0, self.1) - } - - pub fn encode_opaque(&self, encoder: &mut Encoder) -> EncodeResult { - let bytes: [u8; 16] = unsafe { mem::transmute([self.0.to_le(), self.1.to_le()]) }; - - encoder.emit_raw_bytes(&bytes); - Ok(()) - } - - pub fn decode_opaque<'a>(decoder: &mut Decoder<'a>) -> Result { - let mut bytes = [0; 16]; - - decoder.read_raw_bytes(&mut bytes)?; - - let [l, r]: [u64; 2] = unsafe { mem::transmute(bytes) }; - - Ok(Fingerprint(u64::from_le(l), u64::from_le(r))) - } -} - -impl ::std::fmt::Display for Fingerprint { - fn fmt(&self, formatter: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(formatter, "{:x}-{:x}", self.0, self.1) - } -} - -impl stable_hasher::StableHasherResult for Fingerprint { - fn finish(hasher: stable_hasher::StableHasher) -> Self { - let (_0, _1) = hasher.finalize(); - Fingerprint(_0, _1) - } -} - -impl_stable_hash_via_hash!(Fingerprint); - -impl serialize::UseSpecializedEncodable for Fingerprint { } - -impl serialize::UseSpecializedDecodable for Fingerprint { } - -impl serialize::SpecializedEncoder for serialize::opaque::Encoder { - fn specialized_encode(&mut self, f: &Fingerprint) -> Result<(), Self::Error> { - f.encode_opaque(self) - } -} - -impl<'a> serialize::SpecializedDecoder for serialize::opaque::Decoder<'a> { - fn specialized_decode(&mut self) -> Result { - Fingerprint::decode_opaque(self) - } -} diff --git a/src/librustc/ich/mod.rs b/src/librustc/ich/mod.rs index d58eb64c366..dbb9ecaddfd 100644 --- a/src/librustc/ich/mod.rs +++ b/src/librustc/ich/mod.rs @@ -10,11 +10,10 @@ //! ICH - Incremental Compilation Hash -pub use self::fingerprint::Fingerprint; +crate use rustc_data_structures::fingerprint::Fingerprint; pub use self::caching_codemap_view::CachingCodemapView; pub use self::hcx::{StableHashingContextProvider, StableHashingContext, NodeIdHashingMode, hash_stable_trait_impls, compute_ignored_attr_names}; -mod fingerprint; mod caching_codemap_view; mod hcx; diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs index 62f244acc9a..6b00a10eaa3 100644 --- a/src/librustc/lib.rs +++ b/src/librustc/lib.rs @@ -72,6 +72,7 @@ #![feature(in_band_lifetimes)] #![feature(macro_at_most_once_rep)] #![feature(crate_in_paths)] +#![feature(crate_visibility_modifier)] #![recursion_limit="512"] diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index 6bbb4d9c668..ece58978c5d 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -12,7 +12,7 @@ use self::code_stats::CodeStats; use hir::def_id::CrateNum; -use ich::Fingerprint; +use rustc_data_structures::fingerprint::Fingerprint; use ich; use lint; diff --git a/src/librustc_codegen_llvm/back/symbol_export.rs b/src/librustc_codegen_llvm/back/symbol_export.rs index 02434b7be0b..c78d061a39b 100644 --- a/src/librustc_codegen_llvm/back/symbol_export.rs +++ b/src/librustc_codegen_llvm/back/symbol_export.rs @@ -15,7 +15,7 @@ use rustc::hir; use rustc::hir::CodegenFnAttrFlags; use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE, CRATE_DEF_INDEX}; -use rustc::ich::Fingerprint; +use rustc_data_structures::fingerprint::Fingerprint; use rustc::middle::exported_symbols::{SymbolExportLevel, ExportedSymbol, metadata_symbol_name}; use rustc::session::config; use rustc::ty::{TyCtxt, SymbolName}; diff --git a/src/librustc_codegen_llvm/debuginfo/metadata.rs b/src/librustc_codegen_llvm/debuginfo/metadata.rs index 3ae30e85796..8ee2404e10c 100644 --- a/src/librustc_codegen_llvm/debuginfo/metadata.rs +++ b/src/librustc_codegen_llvm/debuginfo/metadata.rs @@ -28,7 +28,8 @@ use rustc::hir::CodegenFnAttrFlags; use rustc::hir::def::CtorKind; use rustc::hir::def_id::{DefId, CrateNum, LOCAL_CRATE}; -use rustc::ich::{Fingerprint, NodeIdHashingMode}; +use rustc::ich::NodeIdHashingMode; +use rustc_data_structures::fingerprint::Fingerprint; use rustc::ty::Instance; use common::CodegenCx; use rustc::ty::{self, AdtKind, ParamEnv, Ty, TyCtxt}; diff --git a/src/librustc_data_structures/fingerprint.rs b/src/librustc_data_structures/fingerprint.rs new file mode 100644 index 00000000000..aa9ddda2b93 --- /dev/null +++ b/src/librustc_data_structures/fingerprint.rs @@ -0,0 +1,111 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use std::mem; +use stable_hasher; +use serialize; +use serialize::opaque::{EncodeResult, Encoder, Decoder}; + +#[derive(Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Clone, Copy)] +pub struct Fingerprint(u64, u64); + +impl Fingerprint { + + pub const ZERO: Fingerprint = Fingerprint(0, 0); + + #[inline] + pub fn from_smaller_hash(hash: u64) -> Fingerprint { + Fingerprint(hash, hash) + } + + #[inline] + pub fn to_smaller_hash(&self) -> u64 { + self.0 + } + + #[inline] + pub fn as_value(&self) -> (u64, u64) { + (self.0, self.1) + } + + #[inline] + pub fn combine(self, other: Fingerprint) -> Fingerprint { + // See https://stackoverflow.com/a/27952689 on why this function is + // implemented this way. + Fingerprint( + self.0.wrapping_mul(3).wrapping_add(other.0), + self.1.wrapping_mul(3).wrapping_add(other.1) + ) + } + + // Combines two hashes in an order independent way. Make sure this is what + // you want. + #[inline] + pub fn combine_commutative(self, other: Fingerprint) -> Fingerprint { + let a = (self.1 as u128) << 64 | self.0 as u128; + let b = (other.1 as u128) << 64 | other.0 as u128; + + let c = a.wrapping_add(b); + + Fingerprint((c >> 64) as u64, c as u64) + } + + pub fn to_hex(&self) -> String { + format!("{:x}{:x}", self.0, self.1) + } + + pub fn encode_opaque(&self, encoder: &mut Encoder) -> EncodeResult { + let bytes: [u8; 16] = unsafe { mem::transmute([self.0.to_le(), self.1.to_le()]) }; + + encoder.emit_raw_bytes(&bytes); + Ok(()) + } + + pub fn decode_opaque<'a>(decoder: &mut Decoder<'a>) -> Result { + let mut bytes = [0; 16]; + + decoder.read_raw_bytes(&mut bytes)?; + + let [l, r]: [u64; 2] = unsafe { mem::transmute(bytes) }; + + Ok(Fingerprint(u64::from_le(l), u64::from_le(r))) + } +} + +impl ::std::fmt::Display for Fingerprint { + fn fmt(&self, formatter: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(formatter, "{:x}-{:x}", self.0, self.1) + } +} + +impl stable_hasher::StableHasherResult for Fingerprint { + fn finish(hasher: stable_hasher::StableHasher) -> Self { + let (_0, _1) = hasher.finalize(); + Fingerprint(_0, _1) + } +} + +impl_stable_hash_via_hash!(Fingerprint); + +impl serialize::UseSpecializedEncodable for Fingerprint { } + +impl serialize::UseSpecializedDecodable for Fingerprint { } + +impl serialize::SpecializedEncoder for serialize::opaque::Encoder { + fn specialized_encode(&mut self, f: &Fingerprint) -> Result<(), Self::Error> { + f.encode_opaque(self) + } +} + +impl<'a> serialize::SpecializedDecoder for serialize::opaque::Decoder<'a> { + fn specialized_decode(&mut self) -> Result { + Fingerprint::decode_opaque(self) + } +} diff --git a/src/librustc_data_structures/lib.rs b/src/librustc_data_structures/lib.rs index b8c21afc386..3aa15f472a2 100644 --- a/src/librustc_data_structures/lib.rs +++ b/src/librustc_data_structures/lib.rs @@ -73,13 +73,14 @@ pub mod snapshot_map; pub use ena::snapshot_vec; pub mod sorted_map; -pub mod stable_hasher; +#[macro_use] pub mod stable_hasher; pub mod sync; pub mod tiny_list; pub mod transitive_relation; pub mod tuple_slice; pub use ena::unify; pub mod work_queue; +pub mod fingerprint; pub struct OnDrop(pub F); diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index 805a5ecd991..b6e03b66510 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -11,7 +11,7 @@ use rustc::dep_graph::DepGraph; use rustc::hir::{self, map as hir_map}; use rustc::hir::lowering::lower_crate; -use rustc::ich::Fingerprint; +use rustc_data_structures::fingerprint::Fingerprint; use rustc_data_structures::stable_hasher::StableHasher; use rustc_mir as mir; use rustc::session::{CompileResult, CrateDisambiguator, Session}; diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs index 5121b682d36..33d4cf26c03 100644 --- a/src/librustc_metadata/decoder.rs +++ b/src/librustc_metadata/decoder.rs @@ -22,7 +22,7 @@ use rustc::hir::def::{self, Def, CtorKind}; use rustc::hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX, LOCAL_CRATE, LocalDefId}; -use rustc::ich::Fingerprint; +use rustc_data_structures::fingerprint::Fingerprint; use rustc::middle::lang_items; use rustc::mir::{self, interpret}; use rustc::mir::interpret::AllocDecodingSession; diff --git a/src/librustc_metadata/encoder.rs b/src/librustc_metadata/encoder.rs index 96d6c5b75f4..7c445cb715e 100644 --- a/src/librustc_metadata/encoder.rs +++ b/src/librustc_metadata/encoder.rs @@ -18,7 +18,7 @@ use rustc::hir::def::CtorKind; use rustc::hir::def_id::{CrateNum, CRATE_DEF_INDEX, DefIndex, DefId, LocalDefId, LOCAL_CRATE}; use rustc::hir::map::definitions::DefPathTable; -use rustc::ich::Fingerprint; +use rustc_data_structures::fingerprint::Fingerprint; use rustc::middle::dependency_format::Linkage; use rustc::middle::exported_symbols::{ExportedSymbol, SymbolExportLevel, metadata_symbol_name};