Auto merge of #142903 - cjgillot:local-def-path-hash, r=compiler-errors
Only inherit local hash for paths `DefPathHash`, as the counterpart of `DefId` that is stable across compiler invocations, is comprised of 2 parts. The first one is the `StableCrateId`, stable form of `CrateNum`. The second is 64 complementary bits to identify the crate-local definition. The current implementation always hashes the full 128 bits when (1) trying to create a new child `DefPathHash` or (2) hashing a `CrateNum` or a `LocalDefId`. But we only need half that information: `LocalDefId` means that the `StableCrateId` is always the current crate's ; `CrateNum` means that we do not care about the local part. As stable hashing is very hot in the query system, in particular hashing definitions, this is a big deal. We still want the local part to change when the `StableCrateId` changes, to make incr-compilation errors less painful, ie. increase the likelihood that if will magically disappear by changing some code. This PR sprinkles some `#[inline]` attributes on small functions that appeared in profiles.
This commit is contained in:
@@ -140,7 +140,9 @@ impl DefKey {
|
||||
pub(crate) fn compute_stable_hash(&self, parent: DefPathHash) -> DefPathHash {
|
||||
let mut hasher = StableHasher::new();
|
||||
|
||||
parent.hash(&mut hasher);
|
||||
// The new path is in the same crate as `parent`, and will contain the stable_crate_id.
|
||||
// Therefore, we only need to include information of the parent's local hash.
|
||||
parent.local_hash().hash(&mut hasher);
|
||||
|
||||
let DisambiguatedDefPathData { ref data, disambiguator } = self.disambiguated_data;
|
||||
|
||||
@@ -355,8 +357,16 @@ impl Definitions {
|
||||
},
|
||||
};
|
||||
|
||||
let parent_hash = DefPathHash::new(stable_crate_id, Hash64::ZERO);
|
||||
let def_path_hash = key.compute_stable_hash(parent_hash);
|
||||
// We want *both* halves of a DefPathHash to depend on the crate-id of the defining crate.
|
||||
// The crate-id can be more easily changed than the DefPath of an item, so, in the case of
|
||||
// a crate-local DefPathHash collision, the user can simply "roll the dice again" for all
|
||||
// DefPathHashes in the crate by changing the crate disambiguator (e.g. via bumping the
|
||||
// crate's version number).
|
||||
//
|
||||
// Children paths will only hash the local portion, and still inherit the change to the
|
||||
// root hash.
|
||||
let def_path_hash =
|
||||
DefPathHash::new(stable_crate_id, Hash64::new(stable_crate_id.as_u64()));
|
||||
|
||||
// Create the root definition.
|
||||
let mut table = DefPathTable::new(stable_crate_id);
|
||||
|
||||
Reference in New Issue
Block a user