diff options
Diffstat (limited to 'lib/Support/FoldingSet.cpp')
| -rw-r--r-- | lib/Support/FoldingSet.cpp | 29 | 
1 files changed, 22 insertions, 7 deletions
diff --git a/lib/Support/FoldingSet.cpp b/lib/Support/FoldingSet.cpp index 29b595220887..a4f80a90d6d0 100644 --- a/lib/Support/FoldingSet.cpp +++ b/lib/Support/FoldingSet.cpp @@ -18,6 +18,7 @@  #include "llvm/Support/Allocator.h"  #include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/MathExtras.h" +#include "llvm/Support/Host.h"  #include <cassert>  #include <cstring>  using namespace llvm; @@ -110,18 +111,32 @@ void FoldingSetNodeID::AddString(StringRef String) {      Pos = (Units + 1) * 4;    } else {      // Otherwise do it the hard way. -    for (Pos += 4; Pos <= Size; Pos += 4) { -      unsigned V = ((unsigned char)String[Pos - 4] << 24) | -                   ((unsigned char)String[Pos - 3] << 16) | -                   ((unsigned char)String[Pos - 2] << 8) | -                    (unsigned char)String[Pos - 1]; -      Bits.push_back(V); +    // To be compatible with above bulk transfer, we need to take endianness +    // into account. +    if (sys::isBigEndianHost()) { +      for (Pos += 4; Pos <= Size; Pos += 4) { +        unsigned V = ((unsigned char)String[Pos - 4] << 24) | +                     ((unsigned char)String[Pos - 3] << 16) | +                     ((unsigned char)String[Pos - 2] << 8) | +                      (unsigned char)String[Pos - 1]; +        Bits.push_back(V); +      } +    } else { +      assert(sys::isLittleEndianHost() && "Unexpected host endianness"); +      for (Pos += 4; Pos <= Size; Pos += 4) { +        unsigned V = ((unsigned char)String[Pos - 1] << 24) | +                     ((unsigned char)String[Pos - 2] << 16) | +                     ((unsigned char)String[Pos - 3] << 8) | +                      (unsigned char)String[Pos - 4]; +        Bits.push_back(V); +      }      }    }    // With the leftover bits.    unsigned V = 0; -  // Pos will have overshot size by 4 - #bytes left over.  +  // Pos will have overshot size by 4 - #bytes left over. +  // No need to take endianness into account here - this is always executed.    switch (Pos - Size) {    case 1: V = (V << 8) | (unsigned char)String[Size - 3]; // Fall thru.    case 2: V = (V << 8) | (unsigned char)String[Size - 2]; // Fall thru.  | 
