Auto merge of #89836 - pierwill:fix-85142-crate-hash, r=wesleywiser
Include rustc version in `rustc_span::StableCrateId` `rustc_span::def_id::StableCrateId` is a hash of various data about a crate during compilation. This PR includes the version of `rustc` in the input when computing this hash. From a cursory reading of [RFC 2603](https://rust-lang.github.io/rfcs/2603-rust-symbol-name-mangling-v0.html), this appears to be acceptable within that design. In order to pass the `mir-opt` and `ui` test suites, this adds new [normalization for hashes and symbol names in `compiletest`](https://github.com/rust-lang/rust/pull/89836/files#diff-03a0567fa80ca04ed5a55f9ac5c711b4f84659be2d0ac4a984196d581c04f76b). These are enabled by default, but we might prefer it to be configurable. In the UI tests, I had to truncate a significant amount of error annotations in v0 symbols (and maybe some legacy) in order to get the normalization to work correctly. (See https://github.com/rust-lang/rust/issues/90116.) Closes #85142.
This commit is contained in:
commit
9e1aff82e6
53 changed files with 333 additions and 205 deletions
|
@ -127,14 +127,17 @@ impl Borrow<Fingerprint> for DefPathHash {
|
|||
}
|
||||
}
|
||||
|
||||
/// A [StableCrateId] is a 64 bit hash of the crate name combined with all
|
||||
/// `-Cmetadata` arguments. It is to [CrateNum] what [DefPathHash] is to
|
||||
/// [DefId]. It is stable across compilation sessions.
|
||||
/// A [`StableCrateId`] is a 64-bit hash of a crate name, together with all
|
||||
/// `-Cmetadata` arguments, and some other data. It is to [`CrateNum`] what [`DefPathHash`] is to
|
||||
/// [`DefId`]. It is stable across compilation sessions.
|
||||
///
|
||||
/// Since the ID is a hash value there is a (very small) chance that two crates
|
||||
/// end up with the same [StableCrateId]. The compiler will check for such
|
||||
/// Since the ID is a hash value, there is a small chance that two crates
|
||||
/// end up with the same [`StableCrateId`]. The compiler will check for such
|
||||
/// collisions when loading crates and abort compilation in order to avoid
|
||||
/// further trouble.
|
||||
///
|
||||
/// See the discussion in [`DefId`] for more information
|
||||
/// on the possibility of hash collisions in rustc,
|
||||
#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Debug)]
|
||||
#[derive(HashStable_Generic, Encodable, Decodable)]
|
||||
pub struct StableCrateId(pub(crate) u64);
|
||||
|
@ -150,7 +153,7 @@ impl StableCrateId {
|
|||
let mut hasher = StableHasher::new();
|
||||
crate_name.hash(&mut hasher);
|
||||
|
||||
// We don't want the stable crate id to dependent on the order
|
||||
// We don't want the stable crate ID to depend on the order of
|
||||
// -C metadata arguments, so sort them:
|
||||
metadata.sort();
|
||||
// Every distinct -C metadata value is only incorporated once:
|
||||
|
@ -169,6 +172,18 @@ impl StableCrateId {
|
|||
// linking against a library of the same name, if this is an executable.
|
||||
hasher.write(if is_exe { b"exe" } else { b"lib" });
|
||||
|
||||
// Also incorporate the rustc version. Otherwise, with -Zsymbol-mangling-version=v0
|
||||
// and no -Cmetadata, symbols from the same crate compiled with different versions of
|
||||
// rustc are named the same.
|
||||
//
|
||||
// RUSTC_FORCE_INCR_COMP_ARTIFACT_HEADER is used to inject rustc version information
|
||||
// during testing.
|
||||
if let Some(val) = std::env::var_os("RUSTC_FORCE_INCR_COMP_ARTIFACT_HEADER") {
|
||||
hasher.write(val.to_string_lossy().into_owned().as_bytes())
|
||||
} else {
|
||||
hasher.write(option_env!("CFG_VERSION").unwrap_or("unknown version").as_bytes());
|
||||
}
|
||||
|
||||
StableCrateId(hasher.finish())
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue