about summary refs log tree commit diff
path: root/compiler/rustc_query_system/src/ich
AgeCommit message (Collapse)AuthorLines
2022-01-05Address review commentsAaron Hill-3/+6
2022-01-05Adjust assert_default_hashing_controlsAaron Hill-0/+7
2022-01-05Ensure that `Fingerprint` caching respects hashing configurationAaron Hill-23/+28
Fixes #92266 In some `HashStable` impls, we use a cache to avoid re-computing the same `Fingerprint` from the same structure (e.g. an `AdtDef`). However, the `StableHashingContext` used can be configured to perform hashing in different ways (e.g. skipping `Span`s). This configuration information is not included in the cache key, which will cause an incorrect `Fingerprint` to be used if we hash the same structure with different `StableHashingContext` settings. To fix this, the configuration settings of `StableHashingContext` are split out into a separate `HashingControls` struct. This struct is used as part of the cache key, ensuring that our caches always produce the correct result for the given settings. With this in place, we now turn off `Span` hashing during the entire process of computing the hash included in legacy symbols. This current has no effect, but will matter when a future PR starts hashing more `Span`s that we currently skip.
2021-12-24Remove special-cased stable hashing for HIR moduleAaron Hill-24/+1
All other 'containers' (e.g. `impl` blocks) hashed their contents in the normal, order-dependent way. However, `Mod` was hashing its contents in a (sort-of) order-independent way. However, the exact order is exposed to consumers through `Mod.item_ids`, and through query results like `hir_module_items`. Therefore, stable hashing needs to take the order of items into account, to avoid fingerprint ICEs. Unforuntately, I was unable to directly build a reproducer for the ICE, due to the behavior of `Fingerprint::combine_commutative`. This operation swaps the upper and lower `u64` when constructing the result, which makes the function non-associative. Since we start the hashing of module items by combining `Fingerprint::ZERO` with the first item, it's difficult to actually build an example where changing the order of module items leaves the final hash unchanged. However, this appears to have been hit in practice in #92218 While we're not able to reproduce it, the fact that proc-macros are involved (which can give an entire module the same span, preventing any span-related invalidations) makes me confident that the root cause of that issue is our method of hashing module items. This PR removes all of the special handling for `Mod`, instead deriving a `HashStable` implementation. This makes `Mod` consistent with other 'contains' like `Impl`, which hash their contents through the typical derive of `HashStable`.
2021-10-21Use SortedMap in HIR.Camille GILLOT-4/+4
2021-10-10Compute full HIR hash during lowering.Camille GILLOT-26/+10
2021-10-09Forbid hashing HIR outside of indexing.Camille GILLOT-30/+44
2021-10-03Add some inlining.Camille GILLOT-0/+8
2021-10-03Move ICH to rustc_query_system.Camille GILLOT-0/+524