[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