aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2012-03-02 11:16:10 +0000
committerChandler Carruth <chandlerc@gmail.com>2012-03-02 11:16:10 +0000
commitdc62a9069648e86846f9f5a8eed7ad29de6f4163 (patch)
tree3856cad701003a52a575130ecec6d91ab7fb5bfb
parent1c1448984d43f1f02c0235d35ebe8460c9b57afd (diff)
downloadexternal_llvm-dc62a9069648e86846f9f5a8eed7ad29de6f4163.tar.gz
external_llvm-dc62a9069648e86846f9f5a8eed7ad29de6f4163.tar.bz2
external_llvm-dc62a9069648e86846f9f5a8eed7ad29de6f4163.zip
Make the hashing algorithm Endian neutral. This is a bit annoying, but
folks who know something about PPC tell me that the byte swap is crazy fast and without this the bit mixture would actually be different. It might not be worse, but I've not measured it and so I'd rather not trust it. This way, the algorithm is identical on both endianness hosts. I'll look into any performance issues etc stemming from this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151892 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/ADT/Hashing.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/include/llvm/ADT/Hashing.h b/include/llvm/ADT/Hashing.h
index 7fbe5bb0ca..2c270e4ffc 100644
--- a/include/llvm/ADT/Hashing.h
+++ b/include/llvm/ADT/Hashing.h
@@ -47,6 +47,8 @@
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/DataTypes.h"
+#include "llvm/Support/Host.h"
+#include "llvm/Support/SwapByteOrder.h"
#include "llvm/Support/type_traits.h"
#include <algorithm>
#include <cassert>
@@ -149,12 +151,16 @@ namespace detail {
inline uint64_t fetch64(const char *p) {
uint64_t result;
memcpy(&result, p, sizeof(result));
+ if (sys::isBigEndianHost())
+ return sys::SwapByteOrder(result);
return result;
}
inline uint32_t fetch32(const char *p) {
uint32_t result;
memcpy(&result, p, sizeof(result));
+ if (sys::isBigEndianHost())
+ return sys::SwapByteOrder(result);
return result;
}