From: Chris Lattner Date: Wed, 21 Jan 2009 07:21:56 +0000 (+0000) Subject: revert my previous patch, it assumed endianness. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=aff6ef8e7bc3c3739f984c390e0af693e60be064;p=clang revert my previous patch, it assumed endianness. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62671 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Lex/PTHLexer.cpp b/lib/Lex/PTHLexer.cpp index 6e449e4ba9..a341288b65 100644 --- a/lib/Lex/PTHLexer.cpp +++ b/lib/Lex/PTHLexer.cpp @@ -50,6 +50,38 @@ static inline uint16_t Read16(const unsigned char *&Data) { return V; } +static inline uint32_t Read24(const unsigned char *&Data) { +// Targets that directly support unaligned little-endian 16-bit loads can just +// use them. +#if defined(__i386__) || defined(__x86_64__) + uint32_t V = ((uint16_t*)Data)[0] | + ((uint32_t)Data[2] << 16); +#else + uint32_t V = ((uint32_t)Data[0] << 0) | + ((uint32_t)Data[1] << 8) | + ((uint32_t)Data[2] << 16); +#endif + + Data += 3; + return V; +} + +static inline uint32_t Read24(const unsigned char *&Data) { +// Targets that directly support unaligned little-endian 16-bit loads can just +// use them. +#if defined(__i386__) || defined(__x86_64__) + uint32_t V = ((uint16_t*)Data)[0] | + ((uint32_t)Data[2] << 16); +#else + uint32_t V = ((uint32_t)Data[0] << 0) | + ((uint32_t)Data[1] << 8) | + ((uint32_t)Data[2] << 16); +#endif + + Data += 3; + return V; +} + static inline uint32_t Read32(const unsigned char *&Data) { // Targets that directly support unaligned little-endian 32-bit loads can just // use them. @@ -88,18 +120,18 @@ LexNextToken: //===--------------------------------------==// // Shadow CurPtr into an automatic variable. - const unsigned *CurPtrShadow = (const unsigned *)CurPtr; + const unsigned char *CurPtrShadow = CurPtr; // Read in the data for the token. - unsigned Word0 = CurPtrShadow[0]; - unsigned IdentifierID = CurPtrShadow[1]; - unsigned FileOffset = CurPtrShadow[2]; + unsigned Word0 = Read32(CurPtrShadow); + uint32_t IdentifierID = Read32(CurPtrShadow); + uint32_t FileOffset = Read32(CurPtrShadow); tok::TokenKind TKind = (tok::TokenKind) (Word0 & 0xFF); Token::TokenFlags TFlags = (Token::TokenFlags) ((Word0 >> 8) & 0xFF); - unsigned Len = Word0 >> 16; + uint32_t Len = Word0 >> 16; - CurPtr = (const unsigned char*)(CurPtrShadow+3); + CurPtr = CurPtrShadow; //===--------------------------------------==// // Construct the token itself.