From 1f5bb1e781ce0721c02544dcfa4d2319e987998b Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Thu, 8 Mar 2012 07:42:18 +0000 Subject: [PATCH] [ADT] Change the trivial FoldingSetNodeID::Add* methods to be inline, reapplied with a fix for the longstanding over-read of 32-bit pointer values. llvm-svn: 152300 --- include/llvm/ADT/FoldingSet.h | 51 +++++++++++++++++++++++++++++++++++ lib/Support/FoldingSet.cpp | 44 +----------------------------- 2 files changed, 52 insertions(+), 43 deletions(-) diff --git a/include/llvm/ADT/FoldingSet.h b/include/llvm/ADT/FoldingSet.h index d2e0b8f91b2..028f2df9cac 100644 --- a/include/llvm/ADT/FoldingSet.h +++ b/include/llvm/ADT/FoldingSet.h @@ -17,6 +17,7 @@ #define LLVM_ADT_FOLDINGSET_H #include "llvm/Support/DataTypes.h" +#include "llvm/Support/ErrorHandling.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" @@ -310,6 +311,7 @@ public: void AddInteger(unsigned long long I); void AddBoolean(bool B) { AddInteger(B ? 1U : 0U); } void AddString(StringRef String); + /// AddNodeID - Adds the Bit data of another ID to *this. void AddNodeID(const FoldingSetNodeID &ID); template @@ -675,6 +677,55 @@ template struct FoldingSetTrait { ID.AddPointer(X); } }; + +//===----------------------------------------------------------------------===// +// FoldingSetNodeID Inline function definitions + +/// Add* - Add various data types to Bit data. +/// +inline void FoldingSetNodeID::AddPointer(const void *Ptr) { + // Note: this adds pointers to the hash using sizes and endianness that + // depend on the host. It doesn't matter however, because hashing on + // pointer values in inherently unstable. Nothing should depend on the + // ordering of nodes in the folding set. + if (sizeof(void*) == sizeof(unsigned)) + AddInteger((unsigned) (unsigned long long) Ptr); + else if (sizeof(void*) == sizeof(unsigned long long)) { + AddInteger((unsigned long long) Ptr); + } else { + llvm_unreachable("unexpected sizeof(void*)"); + } +} +inline void FoldingSetNodeID::AddInteger(signed I) { + Bits.push_back(I); +} +inline void FoldingSetNodeID::AddInteger(unsigned I) { + Bits.push_back(I); +} +inline void FoldingSetNodeID::AddInteger(long I) { + AddInteger((unsigned long)I); +} +inline void FoldingSetNodeID::AddInteger(unsigned long I) { + if (sizeof(long) == sizeof(int)) + AddInteger(unsigned(I)); + else if (sizeof(long) == sizeof(long long)) { + AddInteger((unsigned long long)I); + } else { + llvm_unreachable("unexpected sizeof(long)"); + } +} +inline void FoldingSetNodeID::AddInteger(long long I) { + AddInteger((unsigned long long)I); +} +inline void FoldingSetNodeID::AddInteger(unsigned long long I) { + AddInteger(unsigned(I)); + if ((uint64_t)(unsigned)I != I) + Bits.push_back(unsigned(I >> 32)); +} +inline void FoldingSetNodeID::AddNodeID(const FoldingSetNodeID &ID) { + Bits.append(ID.Bits.begin(), ID.Bits.end()); +} + } // End of namespace llvm. #endif diff --git a/lib/Support/FoldingSet.cpp b/lib/Support/FoldingSet.cpp index e029970b586..d182d480354 100644 --- a/lib/Support/FoldingSet.cpp +++ b/lib/Support/FoldingSet.cpp @@ -41,43 +41,6 @@ bool FoldingSetNodeIDRef::operator==(FoldingSetNodeIDRef RHS) const { //===----------------------------------------------------------------------===// // FoldingSetNodeID Implementation -/// Add* - Add various data types to Bit data. -/// -void FoldingSetNodeID::AddPointer(const void *Ptr) { - // Note: this adds pointers to the hash using sizes and endianness that - // depend on the host. It doesn't matter however, because hashing on - // pointer values in inherently unstable. Nothing should depend on the - // ordering of nodes in the folding set. - Bits.append(reinterpret_cast(&Ptr), - reinterpret_cast(&Ptr+1)); -} -void FoldingSetNodeID::AddInteger(signed I) { - Bits.push_back(I); -} -void FoldingSetNodeID::AddInteger(unsigned I) { - Bits.push_back(I); -} -void FoldingSetNodeID::AddInteger(long I) { - AddInteger((unsigned long)I); -} -void FoldingSetNodeID::AddInteger(unsigned long I) { - if (sizeof(long) == sizeof(int)) - AddInteger(unsigned(I)); - else if (sizeof(long) == sizeof(long long)) { - AddInteger((unsigned long long)I); - } else { - llvm_unreachable("unexpected sizeof(long)"); - } -} -void FoldingSetNodeID::AddInteger(long long I) { - AddInteger((unsigned long long)I); -} -void FoldingSetNodeID::AddInteger(unsigned long long I) { - AddInteger(unsigned(I)); - if ((uint64_t)(unsigned)I != I) - Bits.push_back(unsigned(I >> 32)); -} - void FoldingSetNodeID::AddString(StringRef String) { unsigned Size = String.size(); Bits.push_back(Size); @@ -129,12 +92,7 @@ void FoldingSetNodeID::AddString(StringRef String) { Bits.push_back(V); } -// AddNodeID - Adds the Bit data of another ID to *this. -void FoldingSetNodeID::AddNodeID(const FoldingSetNodeID &ID) { - Bits.append(ID.Bits.begin(), ID.Bits.end()); -} - -/// ComputeHash - Compute a strong hash value for this FoldingSetNodeID, used to +/// ComputeHash - Compute a strong hash value for this FoldingSetNodeID, used to /// lookup the node in the FoldingSetImpl. unsigned FoldingSetNodeID::ComputeHash() const { return FoldingSetNodeIDRef(Bits.data(), Bits.size()).ComputeHash();