[cfe-commits] r143585 - /cfe/trunk/lib/Lex/LiteralSupport.cpp

Nico Weber thakis at chromium.org
Sun Nov 13 21:21:04 PST 2011


Hi Eli,

On Wed, Nov 2, 2011 at 4:06 PM, Eli Friedman <eli.friedman at gmail.com> wrote:
> Author: efriedma
> Date: Wed Nov  2 18:06:23 2011
> New Revision: 143585
>
> URL: http://llvm.org/viewvc/llvm-project?rev=143585&view=rev
> Log:
> Use native endianness for writing out character escapes to the result buffer for string literal parsing.  No functional change on little-endian architectures; should fix test failures on PPC.
>
>
> Modified:
>    cfe/trunk/lib/Lex/LiteralSupport.cpp
>
> Modified: cfe/trunk/lib/Lex/LiteralSupport.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/LiteralSupport.cpp?rev=143585&r1=143584&r2=143585&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Lex/LiteralSupport.cpp (original)
> +++ cfe/trunk/lib/Lex/LiteralSupport.cpp Wed Nov  2 18:06:23 2011
> @@ -253,31 +253,32 @@
>   assert((UcnLen== 4 || UcnLen== 8) && "only ucn length of 4 or 8 supported");
>
>   if (CharByteWidth == 4) {
> -    // Note: our internal rep of wide char tokens is always little-endian.
> -    *ResultBuf++ = (UcnVal & 0x000000FF);
> -    *ResultBuf++ = (UcnVal & 0x0000FF00) >> 8;
> -    *ResultBuf++ = (UcnVal & 0x00FF0000) >> 16;
> -    *ResultBuf++ = (UcnVal & 0xFF000000) >> 24;
> +    // FIXME: Make the type of the result buffer correct instead of
> +    // using reinterpret_cast.
> +    UTF32 *ResultPtr = reinterpret_cast<UTF32*>(ResultBuf);
> +    *ResultPtr = UcnVal;
> +    ResultBuf += 4;
>     return;
>   }
>
>   if (CharByteWidth == 2) {
> -    // Convert to UTF16.
> +    // FIXME: Make the type of the result buffer correct instead of
> +    // using reinterpret_cast.
> +    UTF16 *ResultPtr = reinterpret_cast<UTF16*>(ResultBuf);
> +
>     if (UcnVal < (UTF32)0xFFFF) {
> -      *ResultBuf++ = (UcnVal & 0x000000FF);
> -      *ResultBuf++ = (UcnVal & 0x0000FF00) >> 8;
> +      *ResultPtr = UcnVal;
> +      ResultBuf += 2;
>       return;
>     }
> +    // FIXME: We shouldn't print a diagnostic for UTF-16 mode.
>     if (Diags) Diags->Report(Loc, diag::warn_ucn_escape_too_large);
>
> -    typedef uint16_t UTF16;
> +    // Convert to UTF16.
>     UcnVal -= 0x10000;
> -    UTF16 surrogate1 = 0xD800 + (UcnVal >> 10);
> -    UTF16 surrogate2 = 0xDC00 + (UcnVal & 0x3FF);
> -    *ResultBuf++ = (surrogate1 & 0x000000FF);
> -    *ResultBuf++ = (surrogate1 & 0x0000FF00) >> 8;
> -    *ResultBuf++ = (surrogate2 & 0x000000FF);
> -    *ResultBuf++ = (surrogate2 & 0x0000FF00) >> 8;
> +    *ResultPtr     = 0xD800 + (UcnVal >> 10);
> +    *(ResultPtr+1) = 0xDC00 + (UcnVal & 0x3FF);
> +    ResultBuf += 4;
>     return;
>   }
>
> @@ -1090,11 +1091,22 @@
>                             FullSourceLoc(StringToks[i].getLocation(), SM),
>                             CharByteWidth*8, Diags);
>
> -        // Note: our internal rep of wide char tokens is always little-endian.
> -        *ResultPtr++ = ResultChar & 0xFF;
> -
> -        for (unsigned i = 1, e = CharByteWidth; i != e; ++i)
> -          *ResultPtr++ = ResultChar >> i*8;
> +        if (CharByteWidth == 4) {
> +          // FIXME: Make the type of the result buffer correct instead of
> +          // using reinterpret_cast.
> +          UTF32 *ResultWidePtr = reinterpret_cast<UTF32*>(ResultPtr);
> +          *ResultWidePtr = ResultChar & 0xFF;
> +          ResultPtr += 4;
> +        } else if (CharByteWidth == 2) {
> +          // FIXME: Make the type of the result buffer correct instead of
> +          // using reinterpret_cast.
> +          UTF16 *ResultWidePtr = reinterpret_cast<UTF16*>(ResultPtr);
> +          *ResultWidePtr = ResultChar & 0xFF;
> +          ResultPtr += 2;

This caused PR11369. I tried to fix it in r144521.

Nico

> +        } else {
> +          assert(CharByteWidth == 1 && "Unexpected char width");
> +          *ResultPtr++ = ResultChar & 0xFF;
> +        }
>       }
>     }
>   }
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>




More information about the cfe-commits mailing list