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;
     }
 }