From 89909c76a37d38aab57462ffdae5bed7172b02e3 Mon Sep 17 00:00:00 2001 From: Michael Woerister <michaelwoerister@posteo> Date: Wed, 25 Oct 2017 16:49:55 +0200 Subject: [PATCH] Fix 32 vs 64 bit platform instability in StableHasher. --- src/librustc_data_structures/stable_hasher.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/librustc_data_structures/stable_hasher.rs b/src/librustc_data_structures/stable_hasher.rs index 831e113016f..4849210aed3 100644 --- a/src/librustc_data_structures/stable_hasher.rs +++ b/src/librustc_data_structures/stable_hasher.rs @@ -132,8 +132,11 @@ impl<W> Hasher for StableHasher<W> { #[inline] fn write_usize(&mut self, i: usize) { - self.state.write_usize(i.to_le()); - self.bytes_hashed += ::std::mem::size_of::<usize>() as u64; + // Always treat usize as u64 so we get the same results on 32 and 64 bit + // platforms. This is important for symbol hashes when cross compiling, + // for example. + self.state.write_u64((i as u64).to_le()); + self.bytes_hashed += 8; } #[inline] @@ -168,8 +171,11 @@ impl<W> Hasher for StableHasher<W> { #[inline] fn write_isize(&mut self, i: isize) { - self.state.write_isize(i.to_le()); - self.bytes_hashed += ::std::mem::size_of::<isize>() as u64; + // Always treat isize as i64 so we get the same results on 32 and 64 bit + // platforms. This is important for symbol hashes when cross compiling, + // for example. + self.state.write_i64((i as i64).to_le()); + self.bytes_hashed += 8; } }