From e00ebd725fedd721dd39c89affad83ac49f155c3 Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Sat, 9 Nov 2019 22:37:21 +0100 Subject: [PATCH 1/8] Derive HashStable in librustc. --- src/librustc/ty/mod.rs | 16 +++------------- src/librustc/ty/sty.rs | 9 ++++----- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index 031d6f09b4485..541121928c79d 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -2081,7 +2081,8 @@ impl_stable_hash_for!(struct ReprFlags { }); /// Represents the repr options provided by the user, -#[derive(Copy, Clone, Debug, Eq, PartialEq, RustcEncodable, RustcDecodable, Default)] +#[derive(Copy, Clone, Debug, Eq, PartialEq, RustcEncodable, RustcDecodable, + Default, HashStable)] pub struct ReprOptions { pub int: Option, pub align: Option, @@ -2089,13 +2090,6 @@ pub struct ReprOptions { pub flags: ReprFlags, } -impl_stable_hash_for!(struct ReprOptions { - align, - pack, - int, - flags -}); - impl ReprOptions { pub fn new(tcx: TyCtxt<'_>, did: DefId) -> ReprOptions { let mut flags = ReprFlags::empty(); @@ -3439,17 +3433,13 @@ pub struct CrateInherentImpls { pub inherent_impls: DefIdMap>, } -#[derive(Clone, Copy, PartialEq, Eq, RustcEncodable, RustcDecodable)] +#[derive(Clone, Copy, PartialEq, Eq, RustcEncodable, RustcDecodable, HashStable)] pub struct SymbolName { // FIXME: we don't rely on interning or equality here - better have // this be a `&'tcx str`. pub name: Symbol } -impl_stable_hash_for!(struct self::SymbolName { - name -}); - impl SymbolName { pub fn new(name: &str) -> SymbolName { SymbolName { diff --git a/src/librustc/ty/sty.rs b/src/librustc/ty/sty.rs index fa22709d66fc4..858f9d7e34c6c 100644 --- a/src/librustc/ty/sty.rs +++ b/src/librustc/ty/sty.rs @@ -1379,21 +1379,20 @@ rustc_index::newtype_index! { pub struct BoundVar { .. } } -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, RustcEncodable, RustcDecodable)] +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, + RustcEncodable, RustcDecodable, HashStable)] pub struct BoundTy { pub var: BoundVar, pub kind: BoundTyKind, } -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, RustcEncodable, RustcDecodable)] +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, + RustcEncodable, RustcDecodable, HashStable)] pub enum BoundTyKind { Anon, Param(Symbol), } -impl_stable_hash_for!(struct BoundTy { var, kind }); -impl_stable_hash_for!(enum self::BoundTyKind { Anon, Param(a) }); - impl From for BoundTy { fn from(var: BoundVar) -> Self { BoundTy { From c4bc3f05f54915a962620bfcb8dff7aff0d849f5 Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Sat, 9 Nov 2019 23:17:42 +0100 Subject: [PATCH 2/8] More HashStable. --- src/librustc/hir/map/definitions.rs | 4 +- .../infer/outlives/free_region_map.rs | 6 +- src/librustc/lint/mod.rs | 17 +---- src/librustc/middle/exported_symbols.rs | 7 +-- src/librustc/middle/resolve_lifetime.rs | 8 +-- src/librustc/middle/stability.rs | 15 +---- src/librustc/mir/interpret/allocation.rs | 6 +- src/librustc/mir/interpret/value.rs | 7 +-- src/librustc/mir/mod.rs | 62 +++---------------- src/librustc/traits/query/dropck_outlives.rs | 13 +--- src/librustc/traits/query/method_autoderef.rs | 18 +----- src/librustc/traits/query/normalize.rs | 6 +- 12 files changed, 25 insertions(+), 144 deletions(-) diff --git a/src/librustc/hir/map/definitions.rs b/src/librustc/hir/map/definitions.rs index 1e444e8a5b84e..2b3bc37c87ccb 100644 --- a/src/librustc/hir/map/definitions.rs +++ b/src/librustc/hir/map/definitions.rs @@ -313,11 +313,9 @@ pub enum DefPathData { } #[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Debug, - RustcEncodable, RustcDecodable)] + RustcEncodable, RustcDecodable, HashStable)] pub struct DefPathHash(pub Fingerprint); -impl_stable_hash_for!(tuple_struct DefPathHash { fingerprint }); - impl Borrow for DefPathHash { #[inline] fn borrow(&self) -> &Fingerprint { diff --git a/src/librustc/infer/outlives/free_region_map.rs b/src/librustc/infer/outlives/free_region_map.rs index c085df6a6e7ab..fd8ccce683352 100644 --- a/src/librustc/infer/outlives/free_region_map.rs +++ b/src/librustc/infer/outlives/free_region_map.rs @@ -1,7 +1,7 @@ use crate::ty::{self, Lift, TyCtxt, Region}; use rustc_data_structures::transitive_relation::TransitiveRelation; -#[derive(Clone, RustcEncodable, RustcDecodable, Debug, Default)] +#[derive(Clone, RustcEncodable, RustcDecodable, Debug, Default, HashStable)] pub struct FreeRegionMap<'tcx> { // Stores the relation `a < b`, where `a` and `b` are regions. // @@ -89,10 +89,6 @@ fn is_free_or_static(r: Region<'_>) -> bool { } } -impl_stable_hash_for!(struct FreeRegionMap<'tcx> { - relation -}); - impl<'a, 'tcx> Lift<'tcx> for FreeRegionMap<'a> { type Lifted = FreeRegionMap<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option> { diff --git a/src/librustc/lint/mod.rs b/src/librustc/lint/mod.rs index 11d0d0d90fa86..d84102ff3c5d8 100644 --- a/src/librustc/lint/mod.rs +++ b/src/librustc/lint/mod.rs @@ -543,18 +543,11 @@ impl LintId { } /// Setting for how to handle a lint. -#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)] +#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash, HashStable)] pub enum Level { Allow, Warn, Deny, Forbid, } -impl_stable_hash_for!(enum self::Level { - Allow, - Warn, - Deny, - Forbid -}); - impl Level { /// Converts a level to a lower-case string. pub fn as_str(self) -> &'static str { @@ -590,7 +583,7 @@ impl Level { } /// How a lint level was set. -#[derive(Clone, Copy, PartialEq, Eq)] +#[derive(Clone, Copy, PartialEq, Eq, HashStable)] pub enum LintSource { /// Lint is at the default level as declared /// in rustc or a plugin. @@ -603,12 +596,6 @@ pub enum LintSource { CommandLine(Symbol), } -impl_stable_hash_for!(enum self::LintSource { - Default, - Node(name, span, reason), - CommandLine(text) -}); - pub type LevelSource = (Level, LintSource); pub mod builtin; diff --git a/src/librustc/middle/exported_symbols.rs b/src/librustc/middle/exported_symbols.rs index 4d14299751c3d..7182f03182402 100644 --- a/src/librustc/middle/exported_symbols.rs +++ b/src/librustc/middle/exported_symbols.rs @@ -11,17 +11,12 @@ use crate::ty::subst::SubstsRef; /// kind of crate, including cdylibs which export very few things. /// `Rust` will only be exported if the crate produced is a Rust /// dylib. -#[derive(Eq, PartialEq, Debug, Copy, Clone, RustcEncodable, RustcDecodable)] +#[derive(Eq, PartialEq, Debug, Copy, Clone, RustcEncodable, RustcDecodable, HashStable)] pub enum SymbolExportLevel { C, Rust, } -impl_stable_hash_for!(enum self::SymbolExportLevel { - C, - Rust -}); - impl SymbolExportLevel { pub fn is_below_threshold(self, threshold: SymbolExportLevel) -> bool { threshold == SymbolExportLevel::Rust // export everything from Rust dylibs diff --git a/src/librustc/middle/resolve_lifetime.rs b/src/librustc/middle/resolve_lifetime.rs index a70fe2be96cc1..c13c44c413d77 100644 --- a/src/librustc/middle/resolve_lifetime.rs +++ b/src/librustc/middle/resolve_lifetime.rs @@ -207,7 +207,7 @@ struct NamedRegionMap { } /// See [`NamedRegionMap`]. -#[derive(Default)] +#[derive(Default, HashStable)] pub struct ResolveLifetimes { defs: FxHashMap>, late_bound: FxHashMap>, @@ -215,12 +215,6 @@ pub struct ResolveLifetimes { FxHashMap>>, } -impl_stable_hash_for!(struct crate::middle::resolve_lifetime::ResolveLifetimes { - defs, - late_bound, - object_lifetime_defaults -}); - struct LifetimeContext<'a, 'tcx> { tcx: TyCtxt<'tcx>, map: &'a mut NamedRegionMap, diff --git a/src/librustc/middle/stability.rs b/src/librustc/middle/stability.rs index 8f8b4ed98bd3b..411a47423c5aa 100644 --- a/src/librustc/middle/stability.rs +++ b/src/librustc/middle/stability.rs @@ -52,7 +52,7 @@ enum AnnotationKind { } /// An entry in the `depr_map`. -#[derive(Clone)] +#[derive(Clone, HashStable)] pub struct DeprecationEntry { /// The metadata of the attribute associated with this entry. pub attr: Deprecation, @@ -61,11 +61,6 @@ pub struct DeprecationEntry { origin: Option, } -impl_stable_hash_for!(struct self::DeprecationEntry { - attr, - origin -}); - impl DeprecationEntry { fn local(attr: Deprecation, id: HirId) -> DeprecationEntry { DeprecationEntry { @@ -90,6 +85,7 @@ impl DeprecationEntry { } /// A stability index, giving the stability level for items and methods. +#[derive(HashStable)] pub struct Index<'tcx> { /// This is mostly a cache, except the stabilities of local items /// are filled by the annotator. @@ -103,13 +99,6 @@ pub struct Index<'tcx> { active_features: FxHashSet, } -impl_stable_hash_for!(struct self::Index<'tcx> { - stab_map, - depr_map, - staged_api, - active_features -}); - // A private tree-walker for producing an Index. struct Annotator<'a, 'tcx> { tcx: TyCtxt<'tcx>, diff --git a/src/librustc/mir/interpret/allocation.rs b/src/librustc/mir/interpret/allocation.rs index aa8ac4902a894..f849361e08be9 100644 --- a/src/librustc/mir/interpret/allocation.rs +++ b/src/librustc/mir/interpret/allocation.rs @@ -4,7 +4,6 @@ use super::{ Pointer, InterpResult, AllocId, ScalarMaybeUndef, write_target_uint, read_target_uint, Scalar, }; -use crate::mir; use crate::ty::layout::{Size, Align}; use rustc_data_structures::sorted_map::SortedMap; @@ -787,14 +786,13 @@ type Block = u64; /// A bitmask where each bit refers to the byte with the same index. If the bit is `true`, the byte /// is defined. If it is `false` the byte is undefined. -#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord, Hash, RustcEncodable, RustcDecodable)] +#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord, Hash, + RustcEncodable, RustcDecodable, HashStable)] pub struct UndefMask { blocks: Vec, len: Size, } -impl_stable_hash_for!(struct mir::interpret::UndefMask{blocks, len}); - impl UndefMask { pub const BLOCK_SIZE: u64 = 64; diff --git a/src/librustc/mir/interpret/value.rs b/src/librustc/mir/interpret/value.rs index a0367154b75b3..52c72de7579e1 100644 --- a/src/librustc/mir/interpret/value.rs +++ b/src/librustc/mir/interpret/value.rs @@ -458,7 +458,7 @@ impl From> for Scalar { } } -#[derive(Clone, Copy, Eq, PartialEq, RustcEncodable, RustcDecodable)] +#[derive(Clone, Copy, Eq, PartialEq, RustcEncodable, RustcDecodable, HashStable)] pub enum ScalarMaybeUndef { Scalar(Scalar), Undef, @@ -583,11 +583,6 @@ impl<'tcx, Tag> ScalarMaybeUndef { } } -impl_stable_hash_for!(enum crate::mir::interpret::ScalarMaybeUndef { - Scalar(v), - Undef -}); - /// Gets the bytes of a constant slice value. pub fn get_slice_bytes<'tcx>(cx: &impl HasDataLayout, val: ConstValue<'tcx>) -> &'tcx [u8] { if let ConstValue::Slice { data, start, end } = val { diff --git a/src/librustc/mir/mod.rs b/src/librustc/mir/mod.rs index 5997e4367bf29..79468b68055d4 100644 --- a/src/librustc/mir/mod.rs +++ b/src/librustc/mir/mod.rs @@ -70,7 +70,8 @@ impl<'tcx> HasLocalDecls<'tcx> for Body<'tcx> { /// The various "big phases" that MIR goes through. /// /// Warning: ordering of variants is significant. -#[derive(Copy, Clone, RustcEncodable, RustcDecodable, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Copy, Clone, RustcEncodable, RustcDecodable, HashStable, + Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum MirPhase { Build = 0, Const = 1, @@ -86,7 +87,7 @@ impl MirPhase { } /// The lowered representation of a single function. -#[derive(Clone, RustcEncodable, RustcDecodable, Debug, TypeFoldable)] +#[derive(Clone, RustcEncodable, RustcDecodable, Debug, HashStable, TypeFoldable)] pub struct Body<'tcx> { /// A list of basic blocks. References to basic block use a newtyped index type `BasicBlock` /// that indexes into this vector. @@ -412,24 +413,6 @@ pub enum Safety { ExplicitUnsafe(hir::HirId), } -impl_stable_hash_for!(struct Body<'tcx> { - phase, - basic_blocks, - source_scopes, - source_scope_local_data, - yield_ty, - generator_drop, - generator_layout, - local_decls, - user_type_annotations, - arg_count, - __upvar_debuginfo_codegen_only_do_not_use, - spread_arg, - control_flow_destroyed, - span, - cache -}); - impl<'tcx> Index for Body<'tcx> { type Output = BasicBlockData<'tcx>; @@ -609,7 +592,7 @@ pub enum LocalKind { ReturnPointer, } -#[derive(Clone, Debug, RustcEncodable, RustcDecodable)] +#[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable)] pub struct VarBindingForm<'tcx> { /// Is variable bound via `x`, `mut x`, `ref x`, or `ref mut x`? pub binding_mode: ty::BindingMode, @@ -642,7 +625,7 @@ pub enum BindingForm<'tcx> { } /// Represents what type of implicit self a function has, if any. -#[derive(Clone, Copy, PartialEq, Debug, RustcEncodable, RustcDecodable)] +#[derive(Clone, Copy, PartialEq, Debug, RustcEncodable, RustcDecodable, HashStable)] pub enum ImplicitSelfKind { /// Represents a `fn x(self);`. Imm, @@ -659,28 +642,6 @@ pub enum ImplicitSelfKind { CloneTypeFoldableAndLiftImpls! { BindingForm<'tcx>, } -impl_stable_hash_for!(struct self::VarBindingForm<'tcx> { - binding_mode, - opt_ty_info, - opt_match_place, - pat_span -}); - -impl_stable_hash_for!(enum self::ImplicitSelfKind { - Imm, - Mut, - ImmRef, - MutRef, - None -}); - -impl_stable_hash_for!(enum self::MirPhase { - Build, - Const, - Validated, - Optimized, -}); - mod binding_form_impl { use crate::ich::StableHashingContext; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; @@ -707,7 +668,7 @@ mod binding_form_impl { /// involved in borrow_check errors, e.g., explanations of where the /// temporaries come from, when their destructors are run, and/or how /// one might revise the code to satisfy the borrow checker's rules. -#[derive(Clone, Debug, RustcEncodable, RustcDecodable)] +#[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable)] pub struct BlockTailInfo { /// If `true`, then the value resulting from evaluating this tail /// expression is ignored by the block's expression context. @@ -717,8 +678,6 @@ pub struct BlockTailInfo { pub tail_result_is_ignored: bool, } -impl_stable_hash_for!(struct BlockTailInfo { tail_result_is_ignored }); - /// A MIR local. /// /// This can be a binding declared by the user, a temporary inserted by the compiler, a function @@ -1746,7 +1705,8 @@ pub enum PlaceBase<'tcx> { } /// We store the normalized type to avoid requiring normalization when reading MIR -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, RustcEncodable, RustcDecodable)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, + RustcEncodable, RustcDecodable, HashStable)] pub struct Static<'tcx> { pub ty: Ty<'tcx>, pub kind: StaticKind<'tcx>, @@ -1768,12 +1728,6 @@ pub enum StaticKind<'tcx> { Static, } -impl_stable_hash_for!(struct Static<'tcx> { - ty, - kind, - def_id -}); - #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[derive(RustcEncodable, RustcDecodable, HashStable)] pub enum ProjectionElem { diff --git a/src/librustc/traits/query/dropck_outlives.rs b/src/librustc/traits/query/dropck_outlives.rs index 93f56804a9f4f..785b4122d0873 100644 --- a/src/librustc/traits/query/dropck_outlives.rs +++ b/src/librustc/traits/query/dropck_outlives.rs @@ -79,7 +79,7 @@ impl<'cx, 'tcx> At<'cx, 'tcx> { } } -#[derive(Clone, Debug, Default, TypeFoldable, Lift)] +#[derive(Clone, Debug, Default, HashStable, TypeFoldable, Lift)] pub struct DropckOutlivesResult<'tcx> { pub kinds: Vec>, pub overflows: Vec>, @@ -114,7 +114,7 @@ impl<'tcx> DropckOutlivesResult<'tcx> { /// A set of constraints that need to be satisfied in order for /// a type to be valid for destruction. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, HashStable)] pub struct DtorckConstraint<'tcx> { /// Types that are required to be alive in order for this /// type to be valid for destruction. @@ -152,15 +152,6 @@ impl<'tcx> FromIterator> for DtorckConstraint<'tcx> { result } } -impl_stable_hash_for!(struct DropckOutlivesResult<'tcx> { - kinds, overflows -}); - -impl_stable_hash_for!(struct DtorckConstraint<'tcx> { - outlives, - dtorck_types, - overflows -}); /// This returns true if the type `ty` is "trivial" for /// dropck-outlives -- that is, if it doesn't require any types to diff --git a/src/librustc/traits/query/method_autoderef.rs b/src/librustc/traits/query/method_autoderef.rs index 039dea1ffcd16..be846287e290c 100644 --- a/src/librustc/traits/query/method_autoderef.rs +++ b/src/librustc/traits/query/method_autoderef.rs @@ -2,7 +2,7 @@ use rustc_data_structures::sync::Lrc; use crate::infer::canonical::{Canonical, QueryResponse}; use crate::ty::Ty; -#[derive(Debug)] +#[derive(Debug, HashStable)] pub struct CandidateStep<'tcx> { pub self_ty: Canonical<'tcx, QueryResponse<'tcx, Ty<'tcx>>>, pub autoderefs: usize, @@ -15,7 +15,7 @@ pub struct CandidateStep<'tcx> { pub unsize: bool, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, HashStable)] pub struct MethodAutoderefStepsResult<'tcx> { /// The valid autoderef steps that could be find. pub steps: Lrc>>, @@ -26,20 +26,8 @@ pub struct MethodAutoderefStepsResult<'tcx> { pub reached_recursion_limit: bool, } -#[derive(Debug)] +#[derive(Debug, HashStable)] pub struct MethodAutoderefBadTy<'tcx> { pub reached_raw_pointer: bool, pub ty: Canonical<'tcx, QueryResponse<'tcx, Ty<'tcx>>>, } - -impl_stable_hash_for!(struct MethodAutoderefBadTy<'tcx> { - reached_raw_pointer, ty -}); - -impl_stable_hash_for!(struct MethodAutoderefStepsResult<'tcx> { - reached_recursion_limit, steps, opt_bad_ty -}); - -impl_stable_hash_for!(struct CandidateStep<'tcx> { - self_ty, autoderefs, from_unsafe_deref, unsize -}); diff --git a/src/librustc/traits/query/normalize.rs b/src/librustc/traits/query/normalize.rs index 30528dcebdae9..09c7f45c22b0a 100644 --- a/src/librustc/traits/query/normalize.rs +++ b/src/librustc/traits/query/normalize.rs @@ -66,7 +66,7 @@ impl<'cx, 'tcx> At<'cx, 'tcx> { } /// Result from the `normalize_projection_ty` query. -#[derive(Clone, Debug, TypeFoldable, Lift)] +#[derive(Clone, Debug, HashStable, TypeFoldable, Lift)] pub struct NormalizationResult<'tcx> { /// Result of normalization. pub normalized_ty: Ty<'tcx>, @@ -193,7 +193,3 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for QueryNormalizer<'cx, 'tcx> { constant.eval(self.infcx.tcx, self.param_env) } } - -impl_stable_hash_for!(struct NormalizationResult<'tcx> { - normalized_ty -}); From 781866f3a95da0e4a35151cc24523f186ce19c79 Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Sat, 9 Nov 2019 23:28:07 +0100 Subject: [PATCH 3/8] More HashStable. --- src/librustc/dep_graph/dep_node.rs | 6 +---- src/librustc/mir/mono.rs | 24 ++----------------- src/librustc/traits/query/mod.rs | 4 +--- .../traits/query/type_op/ascribe_user_type.rs | 8 +------ src/librustc/traits/query/type_op/eq.rs | 6 +---- .../query/type_op/implied_outlives_bounds.rs | 6 +---- .../traits/query/type_op/normalize.rs | 8 +------ src/librustc/traits/query/type_op/outlives.rs | 6 +---- .../traits/query/type_op/prove_predicate.rs | 6 +---- src/librustc/traits/query/type_op/subtype.rs | 6 +---- src/librustc/traits/select.rs | 15 ++---------- .../traits/specialize/specialization_graph.rs | 7 +----- src/librustc/ty/binding.rs | 7 +----- 13 files changed, 15 insertions(+), 94 deletions(-) diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs index cea790375fc3d..17ab0c187a2fc 100644 --- a/src/librustc/dep_graph/dep_node.rs +++ b/src/librustc/dep_graph/dep_node.rs @@ -578,7 +578,7 @@ impl<'tcx> DepNodeParams<'tcx> for HirId { /// the need to be mapped or unmapped. (This ensures we can serialize /// them even in the absence of a tcx.) #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, - RustcEncodable, RustcDecodable)] + RustcEncodable, RustcDecodable, HashStable)] pub struct WorkProductId { hash: Fingerprint } @@ -599,7 +599,3 @@ impl WorkProductId { } } } - -impl_stable_hash_for!(struct crate::dep_graph::WorkProductId { - hash -}); diff --git a/src/librustc/mir/mono.rs b/src/librustc/mir/mono.rs index a54635c3d51a3..34daf185b2952 100644 --- a/src/librustc/mir/mono.rs +++ b/src/librustc/mir/mono.rs @@ -251,7 +251,7 @@ pub struct CodegenUnit<'tcx> { size_estimate: Option, } -#[derive(Copy, Clone, PartialEq, Debug, RustcEncodable, RustcDecodable)] +#[derive(Copy, Clone, PartialEq, Debug, RustcEncodable, RustcDecodable, HashStable)] pub enum Linkage { External, AvailableExternally, @@ -266,33 +266,13 @@ pub enum Linkage { Common, } -impl_stable_hash_for!(enum self::Linkage { - External, - AvailableExternally, - LinkOnceAny, - LinkOnceODR, - WeakAny, - WeakODR, - Appending, - Internal, - Private, - ExternalWeak, - Common -}); - -#[derive(Copy, Clone, PartialEq, Debug)] +#[derive(Copy, Clone, PartialEq, Debug, HashStable)] pub enum Visibility { Default, Hidden, Protected, } -impl_stable_hash_for!(enum self::Visibility { - Default, - Hidden, - Protected -}); - impl<'tcx> CodegenUnit<'tcx> { pub fn new(name: Symbol) -> CodegenUnit<'tcx> { CodegenUnit { diff --git a/src/librustc/traits/query/mod.rs b/src/librustc/traits/query/mod.rs index f6ea77dc5cc68..66683cab95960 100644 --- a/src/librustc/traits/query/mod.rs +++ b/src/librustc/traits/query/mod.rs @@ -40,7 +40,7 @@ pub type CanonicalTypeOpProvePredicateGoal<'tcx> = pub type CanonicalTypeOpNormalizeGoal<'tcx, T> = Canonical<'tcx, ty::ParamEnvAnd<'tcx, type_op::normalize::Normalize>>; -#[derive(Clone, Debug)] +#[derive(Clone, Debug, HashStable)] pub struct NoSolution; pub type Fallible = Result; @@ -50,5 +50,3 @@ impl<'tcx> From> for NoSolution { NoSolution } } - -impl_stable_hash_for!(struct NoSolution { }); diff --git a/src/librustc/traits/query/type_op/ascribe_user_type.rs b/src/librustc/traits/query/type_op/ascribe_user_type.rs index 8b0ee5feed7bc..ee8b73f86a61a 100644 --- a/src/librustc/traits/query/type_op/ascribe_user_type.rs +++ b/src/librustc/traits/query/type_op/ascribe_user_type.rs @@ -4,7 +4,7 @@ use crate::hir::def_id::DefId; use crate::ty::{ParamEnvAnd, Ty, TyCtxt}; use crate::ty::subst::UserSubsts; -#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, TypeFoldable, Lift)] +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, HashStable, TypeFoldable, Lift)] pub struct AscribeUserType<'tcx> { pub mir_ty: Ty<'tcx>, pub def_id: DefId, @@ -38,9 +38,3 @@ impl<'tcx> super::QueryTypeOp<'tcx> for AscribeUserType<'tcx> { tcx.type_op_ascribe_user_type(canonicalized) } } - -impl_stable_hash_for! { - struct AscribeUserType<'tcx> { - mir_ty, def_id, user_substs - } -} diff --git a/src/librustc/traits/query/type_op/eq.rs b/src/librustc/traits/query/type_op/eq.rs index 5086994fbb6ed..8ea800cced213 100644 --- a/src/librustc/traits/query/type_op/eq.rs +++ b/src/librustc/traits/query/type_op/eq.rs @@ -2,7 +2,7 @@ use crate::infer::canonical::{Canonicalized, CanonicalizedQueryResponse}; use crate::traits::query::Fallible; use crate::ty::{ParamEnvAnd, Ty, TyCtxt}; -#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, TypeFoldable, Lift)] +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, HashStable, TypeFoldable, Lift)] pub struct Eq<'tcx> { pub a: Ty<'tcx>, pub b: Ty<'tcx>, @@ -35,7 +35,3 @@ impl<'tcx> super::QueryTypeOp<'tcx> for Eq<'tcx> { tcx.type_op_eq(canonicalized) } } - -impl_stable_hash_for! { - struct Eq<'tcx> { a, b } -} diff --git a/src/librustc/traits/query/type_op/implied_outlives_bounds.rs b/src/librustc/traits/query/type_op/implied_outlives_bounds.rs index f97b34f9e9a5a..6f45d76a8e9d7 100644 --- a/src/librustc/traits/query/type_op/implied_outlives_bounds.rs +++ b/src/librustc/traits/query/type_op/implied_outlives_bounds.rs @@ -3,7 +3,7 @@ use crate::traits::query::outlives_bounds::OutlivesBound; use crate::traits::query::Fallible; use crate::ty::{ParamEnvAnd, Ty, TyCtxt}; -#[derive(Clone, Debug, TypeFoldable, Lift)] +#[derive(Clone, Debug, HashStable, TypeFoldable, Lift)] pub struct ImpliedOutlivesBounds<'tcx> { pub ty: Ty<'tcx>, } @@ -39,7 +39,3 @@ impl<'tcx> super::QueryTypeOp<'tcx> for ImpliedOutlivesBounds<'tcx> { tcx.implied_outlives_bounds(canonicalized) } } - -impl_stable_hash_for! { - struct ImpliedOutlivesBounds<'tcx> { ty } -} diff --git a/src/librustc/traits/query/type_op/normalize.rs b/src/librustc/traits/query/type_op/normalize.rs index 798fc5224ccc6..f905d5a019ec8 100644 --- a/src/librustc/traits/query/type_op/normalize.rs +++ b/src/librustc/traits/query/type_op/normalize.rs @@ -4,7 +4,7 @@ use crate::traits::query::Fallible; use crate::ty::fold::TypeFoldable; use crate::ty::{self, Lift, ParamEnvAnd, Ty, TyCtxt}; -#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, TypeFoldable, Lift)] +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, HashStable, TypeFoldable, Lift)] pub struct Normalize { pub value: T, } @@ -82,9 +82,3 @@ impl Normalizable<'tcx> for ty::FnSig<'tcx> { tcx.type_op_normalize_fn_sig(canonicalized) } } - -impl_stable_hash_for! { - impl for struct Normalize { - value - } -} diff --git a/src/librustc/traits/query/type_op/outlives.rs b/src/librustc/traits/query/type_op/outlives.rs index d2a7fdc8946df..83d51b6d3ebf7 100644 --- a/src/librustc/traits/query/type_op/outlives.rs +++ b/src/librustc/traits/query/type_op/outlives.rs @@ -3,7 +3,7 @@ use crate::traits::query::dropck_outlives::{DropckOutlivesResult, trivial_dropck use crate::traits::query::Fallible; use crate::ty::{ParamEnvAnd, Ty, TyCtxt}; -#[derive(Copy, Clone, Debug, TypeFoldable, Lift)] +#[derive(Copy, Clone, Debug, HashStable, TypeFoldable, Lift)] pub struct DropckOutlives<'tcx> { dropped_ty: Ty<'tcx>, } @@ -53,7 +53,3 @@ impl super::QueryTypeOp<'tcx> for DropckOutlives<'tcx> { tcx.dropck_outlives(canonicalized) } } - -impl_stable_hash_for! { - struct DropckOutlives<'tcx> { dropped_ty } -} diff --git a/src/librustc/traits/query/type_op/prove_predicate.rs b/src/librustc/traits/query/type_op/prove_predicate.rs index cbf485fcfe02f..c0a0cbe9a3876 100644 --- a/src/librustc/traits/query/type_op/prove_predicate.rs +++ b/src/librustc/traits/query/type_op/prove_predicate.rs @@ -2,7 +2,7 @@ use crate::infer::canonical::{Canonicalized, CanonicalizedQueryResponse}; use crate::traits::query::Fallible; use crate::ty::{ParamEnvAnd, Predicate, TyCtxt}; -#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, TypeFoldable, Lift)] +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, HashStable, TypeFoldable, Lift)] pub struct ProvePredicate<'tcx> { pub predicate: Predicate<'tcx>, } @@ -44,7 +44,3 @@ impl<'tcx> super::QueryTypeOp<'tcx> for ProvePredicate<'tcx> { tcx.type_op_prove_predicate(canonicalized) } } - -impl_stable_hash_for! { - struct ProvePredicate<'tcx> { predicate } -} diff --git a/src/librustc/traits/query/type_op/subtype.rs b/src/librustc/traits/query/type_op/subtype.rs index bd53e234a6a49..76292f9dea085 100644 --- a/src/librustc/traits/query/type_op/subtype.rs +++ b/src/librustc/traits/query/type_op/subtype.rs @@ -2,7 +2,7 @@ use crate::infer::canonical::{Canonicalized, CanonicalizedQueryResponse}; use crate::traits::query::Fallible; use crate::ty::{ParamEnvAnd, Ty, TyCtxt}; -#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, TypeFoldable, Lift)] +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, HashStable, TypeFoldable, Lift)] pub struct Subtype<'tcx> { pub sub: Ty<'tcx>, pub sup: Ty<'tcx>, @@ -35,7 +35,3 @@ impl<'tcx> super::QueryTypeOp<'tcx> for Subtype<'tcx> { tcx.type_op_subtype(canonicalized) } } - -impl_stable_hash_for! { - struct Subtype<'tcx> { sub, sup } -} diff --git a/src/librustc/traits/select.rs b/src/librustc/traits/select.rs index 608883d609f47..ffc94cf2b125e 100644 --- a/src/librustc/traits/select.rs +++ b/src/librustc/traits/select.rs @@ -367,7 +367,6 @@ enum BuiltinImplConditions<'tcx> { Ambiguous, } -#[derive(Copy, Clone, Debug, PartialOrd, Ord, PartialEq, Eq)] /// The result of trait evaluation. The order is important /// here as the evaluation of a list is the maximum of the /// evaluations. @@ -380,6 +379,7 @@ enum BuiltinImplConditions<'tcx> { /// all the "potential success" candidates can potentially succeed, /// so they are noops when unioned with a definite error, and within /// the categories it's easy to see that the unions are correct. +#[derive(Copy, Clone, Debug, PartialOrd, Ord, PartialEq, Eq, HashStable)] pub enum EvaluationResult { /// Evaluation successful EvaluatedToOk, @@ -478,21 +478,10 @@ impl EvaluationResult { } } -impl_stable_hash_for!(enum self::EvaluationResult { - EvaluatedToOk, - EvaluatedToOkModuloRegions, - EvaluatedToAmbig, - EvaluatedToUnknown, - EvaluatedToRecur, - EvaluatedToErr -}); - -#[derive(Copy, Clone, Debug, PartialEq, Eq)] /// Indicates that trait evaluation caused overflow. +#[derive(Copy, Clone, Debug, PartialEq, Eq, HashStable)] pub struct OverflowError; -impl_stable_hash_for!(struct OverflowError {}); - impl<'tcx> From for SelectionError<'tcx> { fn from(OverflowError: OverflowError) -> SelectionError<'tcx> { SelectionError::Overflow diff --git a/src/librustc/traits/specialize/specialization_graph.rs b/src/librustc/traits/specialize/specialization_graph.rs index c64d6748ea97d..d945c756f6662 100644 --- a/src/librustc/traits/specialize/specialization_graph.rs +++ b/src/librustc/traits/specialize/specialization_graph.rs @@ -24,7 +24,7 @@ use crate::util::nodemap::{DefIdMap, FxHashMap}; /// parents of a given specializing impl, which is needed for extracting /// default items amongst other things. In the simple "chain" rule, every impl /// has at most one parent. -#[derive(RustcEncodable, RustcDecodable)] +#[derive(RustcEncodable, RustcDecodable, HashStable)] pub struct Graph { // All impls have a parent; the "root" impls have as their parent the `def_id` // of the trait. @@ -535,8 +535,3 @@ impl<'a> HashStable> for Children { ich::hash_stable_trait_impls(hcx, hasher, blanket_impls, nonblanket_impls); } } - -impl_stable_hash_for!(struct self::Graph { - parent, - children -}); diff --git a/src/librustc/ty/binding.rs b/src/librustc/ty/binding.rs index 905d7abb7828c..491e09dff0950 100644 --- a/src/librustc/ty/binding.rs +++ b/src/librustc/ty/binding.rs @@ -2,7 +2,7 @@ use crate::hir::BindingAnnotation::*; use crate::hir::BindingAnnotation; use crate::hir::Mutability; -#[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, Copy)] +#[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, Copy, HashStable)] pub enum BindingMode { BindByReference(Mutability), BindByValue(Mutability), @@ -20,8 +20,3 @@ impl BindingMode { } } } - -impl_stable_hash_for!(enum self::BindingMode { - BindByReference(mutability), - BindByValue(mutability) -}); From e1522fa1832a0e82d235e6fb9f15d9d2647ff5aa Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Sun, 10 Nov 2019 18:41:09 +0100 Subject: [PATCH 4/8] Derive HashStable more. --- src/librustc/hir/mod.rs | 2 +- src/librustc/ich/impls_hir.rs | 7 ------- src/librustc/ty/mod.rs | 23 ++++------------------- src/librustc/ty/sty.rs | 3 +-- 4 files changed, 6 insertions(+), 29 deletions(-) diff --git a/src/librustc/hir/mod.rs b/src/librustc/hir/mod.rs index bbd3b40e1be90..465673082e50a 100644 --- a/src/librustc/hir/mod.rs +++ b/src/librustc/hir/mod.rs @@ -1215,7 +1215,7 @@ impl UnOp { } /// A statement. -#[derive(RustcEncodable, RustcDecodable)] +#[derive(RustcEncodable, RustcDecodable, HashStable)] pub struct Stmt { pub hir_id: HirId, pub kind: StmtKind, diff --git a/src/librustc/ich/impls_hir.rs b/src/librustc/ich/impls_hir.rs index c0255e5b8a481..816e93698bce9 100644 --- a/src/librustc/ich/impls_hir.rs +++ b/src/librustc/ich/impls_hir.rs @@ -140,13 +140,6 @@ impl<'a> HashStable> for hir::Ty { impl_stable_hash_for_spanned!(hir::BinOpKind); -impl_stable_hash_for!(struct hir::Stmt { - hir_id, - kind, - span, -}); - - impl_stable_hash_for_spanned!(ast::Name); impl<'a> HashStable> for hir::Expr { diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index 541121928c79d..b115b5a699159 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -1589,13 +1589,12 @@ rustc_index::newtype_index! { /// declared, but a type name in a non-zero universe is a placeholder /// type -- an idealized representative of "types in general" that we /// use for checking generic functions. + #[derive(HashStable)] pub struct UniverseIndex { DEBUG_FORMAT = "U{}", } } -impl_stable_hash_for!(struct UniverseIndex { private }); - impl UniverseIndex { pub const ROOT: UniverseIndex = UniverseIndex::from_u32_const(0); @@ -1839,7 +1838,7 @@ bitflags! { } /// Definition of a variant -- a struct's fields or a enum variant. -#[derive(Debug)] +#[derive(Debug, HashStable)] pub struct VariantDef { /// `DefId` that identifies the variant itself. /// If this variant belongs to a struct or union, then this is a copy of its `DefId`. @@ -1848,6 +1847,7 @@ pub struct VariantDef { /// If this variant is a struct variant, then this is `None`. pub ctor_def_id: Option, /// Variant or struct name. + #[stable_hasher(project = name)] pub ident: Ident, /// Discriminant of this variant. pub discr: VariantDiscr, @@ -1927,17 +1927,6 @@ impl<'tcx> VariantDef { } } -impl_stable_hash_for!(struct VariantDef { - def_id, - ctor_def_id, - ident -> (ident.name), - discr, - fields, - ctor_kind, - flags, - recovered -}); - #[derive(Copy, Clone, Debug, PartialEq, Eq, RustcEncodable, RustcDecodable, HashStable)] pub enum VariantDiscr { /// Explicit value for this variant, i.e., `X = 123`. @@ -2061,7 +2050,7 @@ impl Into for AdtKind { } bitflags! { - #[derive(RustcEncodable, RustcDecodable, Default)] + #[derive(RustcEncodable, RustcDecodable, Default, HashStable)] pub struct ReprFlags: u8 { const IS_C = 1 << 0; const IS_SIMD = 1 << 1; @@ -2076,10 +2065,6 @@ bitflags! { } } -impl_stable_hash_for!(struct ReprFlags { - bits -}); - /// Represents the repr options provided by the user, #[derive(Copy, Clone, Debug, Eq, PartialEq, RustcEncodable, RustcDecodable, Default, HashStable)] diff --git a/src/librustc/ty/sty.rs b/src/librustc/ty/sty.rs index 858f9d7e34c6c..07258717cd9d4 100644 --- a/src/librustc/ty/sty.rs +++ b/src/librustc/ty/sty.rs @@ -1204,6 +1204,7 @@ rustc_index::newtype_index! { /// is the outer fn. /// /// [dbi]: http://en.wikipedia.org/wiki/De_Bruijn_index + #[derive(HashStable)] pub struct DebruijnIndex { DEBUG_FORMAT = "DebruijnIndex({})", const INNERMOST = 0, @@ -1517,8 +1518,6 @@ impl DebruijnIndex { } } -impl_stable_hash_for!(struct DebruijnIndex { private }); - /// Region utilities impl RegionKind { /// Is this region named by the user? From d9eaaf59733d29911e2882020931a77aa0178c32 Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Sun, 10 Nov 2019 19:30:19 +0100 Subject: [PATCH 5/8] Derive HashStable in librustc_mir. --- Cargo.lock | 1 + src/librustc_mir/Cargo.toml | 1 + src/librustc_mir/interpret/eval_context.rs | 28 +++++++++-- src/librustc_mir/interpret/operand.rs | 5 +- src/librustc_mir/interpret/place.rs | 5 +- src/librustc_mir/interpret/snapshot.rs | 54 ++-------------------- 6 files changed, 37 insertions(+), 57 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7eb5d4b464c06..5e0880da343a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3720,6 +3720,7 @@ dependencies = [ "rustc_errors", "rustc_index", "rustc_lexer", + "rustc_macros", "rustc_target", "serialize", "smallvec 1.0.0", diff --git a/src/librustc_mir/Cargo.toml b/src/librustc_mir/Cargo.toml index daa2617bd9e5e..9bc6d32b7cb38 100644 --- a/src/librustc_mir/Cargo.toml +++ b/src/librustc_mir/Cargo.toml @@ -22,6 +22,7 @@ rustc_data_structures = { path = "../librustc_data_structures" } rustc_index = { path = "../librustc_index" } rustc_errors = { path = "../librustc_errors" } rustc_lexer = { path = "../librustc_lexer" } +rustc_macros = { path = "../librustc_macros" } rustc_serialize = { path = "../libserialize", package = "serialize" } syntax = { path = "../libsyntax" } syntax_pos = { path = "../libsyntax_pos" } diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index 92358ad247e18..471227f74037e 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -3,6 +3,7 @@ use std::fmt::Write; use std::mem; use syntax::source_map::{self, Span, DUMMY_SP}; +use rustc::ich::StableHashingContext; use rustc::hir::def_id::DefId; use rustc::hir::def::DefKind; use rustc::mir; @@ -18,6 +19,8 @@ use rustc::mir::interpret::{ InterpResult, truncate, sign_extend, }; use rustc_data_structures::fx::FxHashMap; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use rustc_macros::HashStable; use super::{ Immediate, Operand, MemPlace, MPlaceTy, Place, PlaceTy, ScalarMaybeUndef, @@ -93,7 +96,7 @@ pub struct Frame<'mir, 'tcx, Tag=(), Extra=()> { pub stmt: usize, } -#[derive(Clone, Eq, PartialEq, Debug)] // Miri debug-prints these +#[derive(Clone, Eq, PartialEq, Debug, HashStable)] // Miri debug-prints these pub enum StackPopCleanup { /// Jump to the next block in the caller, or cause UB if None (that's a function /// that may never return). Also store layout of return place so @@ -109,15 +112,16 @@ pub enum StackPopCleanup { } /// State of a local variable including a memoized layout -#[derive(Clone, PartialEq, Eq)] +#[derive(Clone, PartialEq, Eq, HashStable)] pub struct LocalState<'tcx, Tag=(), Id=AllocId> { pub value: LocalValue, /// Don't modify if `Some`, this is only used to prevent computing the layout twice + #[stable_hasher(ignore)] pub layout: Cell>>, } /// Current value of a local variable -#[derive(Clone, PartialEq, Eq, Debug)] // Miri debug-prints these +#[derive(Clone, PartialEq, Eq, Debug, HashStable)] // Miri debug-prints these pub enum LocalValue { /// This local is not currently alive, and cannot be used at all. Dead, @@ -827,3 +831,21 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { frames } } + +impl<'ctx, 'mir, 'tcx, Tag, Extra> HashStable> +for Frame<'mir, 'tcx, Tag, Extra> + where Extra: HashStable>, + Tag: HashStable> +{ + fn hash_stable(&self, hcx: &mut StableHashingContext<'ctx>, hasher: &mut StableHasher) { + self.body.hash_stable(hcx, hasher); + self.instance.hash_stable(hcx, hasher); + self.span.hash_stable(hcx, hasher); + self.return_to_block.hash_stable(hcx, hasher); + self.return_place.as_ref().map(|r| &**r).hash_stable(hcx, hasher); + self.locals.hash_stable(hcx, hasher); + self.block.hash_stable(hcx, hasher); + self.stmt.hash_stable(hcx, hasher); + self.extra.hash_stable(hcx, hasher); + } +} diff --git a/src/librustc_mir/interpret/operand.rs b/src/librustc_mir/interpret/operand.rs index 4d2ccdc20da65..cfa70164cdce4 100644 --- a/src/librustc_mir/interpret/operand.rs +++ b/src/librustc_mir/interpret/operand.rs @@ -18,6 +18,7 @@ use super::{ MemPlace, MPlaceTy, PlaceTy, Place, }; pub use rustc::mir::interpret::ScalarMaybeUndef; +use rustc_macros::HashStable; /// An `Immediate` represents a single immediate self-contained Rust value. /// @@ -26,7 +27,7 @@ pub use rustc::mir::interpret::ScalarMaybeUndef; /// operations and fat pointers. This idea was taken from rustc's codegen. /// In particular, thanks to `ScalarPair`, arithmetic operations and casts can be entirely /// defined on `Immediate`, and do not have to work with a `Place`. -#[derive(Copy, Clone, Debug, PartialEq, Eq)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, HashStable)] pub enum Immediate { Scalar(ScalarMaybeUndef), ScalarPair(ScalarMaybeUndef, ScalarMaybeUndef), @@ -103,7 +104,7 @@ impl<'tcx, Tag> ::std::ops::Deref for ImmTy<'tcx, Tag> { /// An `Operand` is the result of computing a `mir::Operand`. It can be immediate, /// or still in memory. The latter is an optimization, to delay reading that chunk of /// memory and to avoid having to store arbitrary-sized data here. -#[derive(Copy, Clone, Debug, PartialEq, Eq)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, HashStable)] pub enum Operand { Immediate(Immediate), Indirect(MemPlace), diff --git a/src/librustc_mir/interpret/place.rs b/src/librustc_mir/interpret/place.rs index 0bd47edc04660..088fbe1695efd 100644 --- a/src/librustc_mir/interpret/place.rs +++ b/src/librustc_mir/interpret/place.rs @@ -12,6 +12,7 @@ use rustc::ty::layout::{ self, Size, Align, LayoutOf, TyLayout, HasDataLayout, VariantIdx, PrimitiveExt }; use rustc::ty::TypeFoldable; +use rustc_macros::HashStable; use super::{ GlobalId, AllocId, Allocation, Scalar, InterpResult, Pointer, PointerArithmetic, @@ -19,7 +20,7 @@ use super::{ RawConst, Immediate, ImmTy, ScalarMaybeUndef, Operand, OpTy, MemoryKind, LocalValue, }; -#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, HashStable)] pub struct MemPlace { /// A place may have an integral pointer for ZSTs, and since it might /// be turned back into a reference before ever being dereferenced. @@ -32,7 +33,7 @@ pub struct MemPlace { pub meta: Option>, } -#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, HashStable)] pub enum Place { /// A place referring to a value allocated in the `Memory` system. Ptr(MemPlace), diff --git a/src/librustc_mir/interpret/snapshot.rs b/src/librustc_mir/interpret/snapshot.rs index 7f3ea0283cda3..3ea00d6922186 100644 --- a/src/librustc_mir/interpret/snapshot.rs +++ b/src/librustc_mir/interpret/snapshot.rs @@ -19,6 +19,7 @@ use rustc::ty::layout::{Align, Size}; use rustc_data_structures::fx::FxHashSet; use rustc_index::vec::IndexVec; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use rustc_macros::HashStable; use syntax::ast::Mutability; use syntax::source_map::Span; @@ -197,21 +198,12 @@ impl_snapshot_for!(enum ScalarMaybeUndef { Undef, }); -impl_stable_hash_for!(struct crate::interpret::MemPlace { - ptr, - align, - meta, -}); impl_snapshot_for!(struct MemPlace { ptr, meta, align -> *align, // just copy alignment verbatim }); -impl_stable_hash_for!(enum crate::interpret::Place { - Ptr(mem_place), - Local { frame, local }, -}); impl<'a, Ctx> Snapshot<'a, Ctx> for Place where Ctx: SnapshotContext<'a>, { @@ -229,29 +221,16 @@ impl<'a, Ctx> Snapshot<'a, Ctx> for Place } } -impl_stable_hash_for!(enum crate::interpret::Immediate { - Scalar(x), - ScalarPair(x, y), -}); impl_snapshot_for!(enum Immediate { Scalar(s), ScalarPair(s, t), }); -impl_stable_hash_for!(enum crate::interpret::Operand { - Immediate(x), - Indirect(x), -}); impl_snapshot_for!(enum Operand { Immediate(v), Indirect(m), }); -impl_stable_hash_for!(enum crate::interpret::LocalValue { - Dead, - Uninitialized, - Live(x), -}); impl_snapshot_for!(enum LocalValue { Dead, Uninitialized, @@ -314,11 +293,6 @@ impl<'a, Ctx> Snapshot<'a, Ctx> for &'a Allocation } } -impl_stable_hash_for!(enum crate::interpret::eval_context::StackPopCleanup { - Goto { ret, unwind }, - None { cleanup }, -}); - #[derive(Eq, PartialEq)] struct FrameSnapshot<'a, 'tcx> { instance: ty::Instance<'tcx>, @@ -330,18 +304,6 @@ struct FrameSnapshot<'a, 'tcx> { stmt: usize, } -impl_stable_hash_for!(impl<> for struct Frame<'mir, 'tcx> { - body, - instance, - span, - return_to_block, - return_place -> (return_place.as_ref().map(|r| &**r)), - locals, - block, - stmt, - extra, -}); - impl<'a, 'mir, 'tcx, Ctx> Snapshot<'a, Ctx> for &'a Frame<'mir, 'tcx> where Ctx: SnapshotContext<'a>, { @@ -383,11 +345,6 @@ impl<'a, 'tcx, Ctx> Snapshot<'a, Ctx> for &'a LocalState<'tcx> } } -impl_stable_hash_for!(struct LocalState<'tcx> { - value, - layout -> _, -}); - impl<'b, 'mir, 'tcx> SnapshotContext<'b> for Memory<'mir, 'tcx, CompileTimeInterpreter<'mir, 'tcx>> { @@ -399,7 +356,10 @@ impl<'b, 'mir, 'tcx> SnapshotContext<'b> /// The virtual machine state during const-evaluation at a given point in time. /// We assume the `CompileTimeInterpreter` has no interesting extra state that /// is worth considering here. +#[derive(HashStable)] struct InterpSnapshot<'mir, 'tcx> { + // Not hashing memory: Avoid hashing memory all the time during execution + #[stable_hasher(ignore)] memory: Memory<'mir, 'tcx, CompileTimeInterpreter<'mir, 'tcx>>, stack: Vec>, } @@ -434,12 +394,6 @@ impl<'mir, 'tcx> Hash for InterpSnapshot<'mir, 'tcx> { } } -impl_stable_hash_for!(impl<> for struct InterpSnapshot<'mir, 'tcx> { - // Not hashing memory: Avoid hashing memory all the time during execution - memory -> _, - stack, -}); - impl<'mir, 'tcx> Eq for InterpSnapshot<'mir, 'tcx> {} impl<'mir, 'tcx> PartialEq for InterpSnapshot<'mir, 'tcx> { From 7db84e85047431d1b59bac6def3385454576710e Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Mon, 11 Nov 2019 09:39:23 +0100 Subject: [PATCH 6/8] Fix project syntax. --- src/librustc/ty/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index b115b5a699159..c9bdf22ca8ed5 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -1847,7 +1847,7 @@ pub struct VariantDef { /// If this variant is a struct variant, then this is `None`. pub ctor_def_id: Option, /// Variant or struct name. - #[stable_hasher(project = name)] + #[stable_hasher(project(name))] pub ident: Ident, /// Discriminant of this variant. pub discr: VariantDiscr, From 4da5fe7fdbb4b2a257f37fc725a756f01d2927fc Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Fri, 15 Nov 2019 21:23:34 +0100 Subject: [PATCH 7/8] Fix derive syntax. --- src/librustc/ty/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index c9bdf22ca8ed5..a54bf5079cac4 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -1589,8 +1589,8 @@ rustc_index::newtype_index! { /// declared, but a type name in a non-zero universe is a placeholder /// type -- an idealized representative of "types in general" that we /// use for checking generic functions. - #[derive(HashStable)] pub struct UniverseIndex { + derive [HashStable] DEBUG_FORMAT = "U{}", } } From 579625b9e738e606b91fa315c75ab4909fa090be Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Sat, 16 Nov 2019 00:11:02 +0100 Subject: [PATCH 8/8] Revert expansion of impl HashStable for Frame. --- src/librustc_mir/interpret/eval_context.rs | 20 -------------------- src/librustc_mir/interpret/snapshot.rs | 12 ++++++++++++ 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index 471227f74037e..08640476f7ab7 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -3,7 +3,6 @@ use std::fmt::Write; use std::mem; use syntax::source_map::{self, Span, DUMMY_SP}; -use rustc::ich::StableHashingContext; use rustc::hir::def_id::DefId; use rustc::hir::def::DefKind; use rustc::mir; @@ -19,7 +18,6 @@ use rustc::mir::interpret::{ InterpResult, truncate, sign_extend, }; use rustc_data_structures::fx::FxHashMap; -use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; use rustc_macros::HashStable; use super::{ @@ -831,21 +829,3 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { frames } } - -impl<'ctx, 'mir, 'tcx, Tag, Extra> HashStable> -for Frame<'mir, 'tcx, Tag, Extra> - where Extra: HashStable>, - Tag: HashStable> -{ - fn hash_stable(&self, hcx: &mut StableHashingContext<'ctx>, hasher: &mut StableHasher) { - self.body.hash_stable(hcx, hasher); - self.instance.hash_stable(hcx, hasher); - self.span.hash_stable(hcx, hasher); - self.return_to_block.hash_stable(hcx, hasher); - self.return_place.as_ref().map(|r| &**r).hash_stable(hcx, hasher); - self.locals.hash_stable(hcx, hasher); - self.block.hash_stable(hcx, hasher); - self.stmt.hash_stable(hcx, hasher); - self.extra.hash_stable(hcx, hasher); - } -} diff --git a/src/librustc_mir/interpret/snapshot.rs b/src/librustc_mir/interpret/snapshot.rs index 3ea00d6922186..b460badd1fdac 100644 --- a/src/librustc_mir/interpret/snapshot.rs +++ b/src/librustc_mir/interpret/snapshot.rs @@ -304,6 +304,18 @@ struct FrameSnapshot<'a, 'tcx> { stmt: usize, } +impl_stable_hash_for!(impl<> for struct Frame<'mir, 'tcx> { + body, + instance, + span, + return_to_block, + return_place -> (return_place.as_ref().map(|r| &**r)), + locals, + block, + stmt, + extra, +}); + impl<'a, 'mir, 'tcx, Ctx> Snapshot<'a, Ctx> for &'a Frame<'mir, 'tcx> where Ctx: SnapshotContext<'a>, {