[MS Demangler] Demangle string literals.

When demangling string literals, Microsoft's undname
simply prints 'string'.  This patch implements string
literal demangling while doing a bit better than this
by decoding as much of the string as possible and
trying to faithfully reproduce the original string
literal definition.

This is a bit tricky because the different character
types char, char16_t, and char32_t are not uniquely
identified by the mangling, so we have to use a
heuristic to try to guess the character type.  But
it works pretty well, and many tests are added to
illustrate the behavior.

Differential Revision: https://reviews.llvm.org/D50806

llvm-svn: 339892
This commit is contained in:
Zachary Turner 2018-08-16 16:17:36 +00:00
parent 83313f8f54
commit 970fdc3236
2 changed files with 1156 additions and 3 deletions

View File

@ -213,7 +213,7 @@ enum NameBackrefBehavior : uint8_t {
NBB_Simple = 1 << 1, // save simple names.
};
enum class SymbolCategory { Function, Variable, Unknown };
enum class SymbolCategory { Unknown, Function, Variable, StringLiteral };
namespace {
@ -291,6 +291,11 @@ struct Name {
bool IsOperator = false;
bool IsBackReference = false;
bool IsConversionOperator = false;
bool IsStringLiteral = false;
bool IsLongStringLiteral = false;
// If IsStringLiteral is true, this is the character type.
PrimTy StringLiteralType = PrimTy::None;
// Name read from an MangledName string.
StringView Str;
@ -521,6 +526,30 @@ static void outputParameterList(OutputStream &OS, const FunctionParams &Params,
}
}
static void outputStringLiteral(OutputStream &OS, const Name &TheString) {
assert(TheString.IsStringLiteral);
switch (TheString.StringLiteralType) {
case PrimTy::Wchar:
OS << "const wchar_t * {L\"";
break;
case PrimTy::Char:
OS << "const char * {\"";
break;
case PrimTy::Char16:
OS << "const char16_t * {u\"";
break;
case PrimTy::Char32:
OS << "const char32_t * {U\"";
break;
default:
LLVM_BUILTIN_UNREACHABLE;
}
OS << TheString.Str << "\"";
if (TheString.IsLongStringLiteral)
OS << "...";
OS << "}";
}
static void outputName(OutputStream &OS, const Name *TheName, const Type *Ty,
NameResolver &Resolver);
@ -1009,6 +1038,7 @@ private:
Name *demangleSimpleName(StringView &MangledName, bool Memorize);
Name *demangleAnonymousNamespaceName(StringView &MangledName);
Name *demangleLocallyScopedNamePiece(StringView &MangledName);
Name *demangleStringLiteral(StringView &MangledName);
StringView demangleSimpleString(StringView &MangledName, bool Memorize);
@ -1017,6 +1047,8 @@ private:
StorageClass demangleVariableStorageClass(StringView &MangledName);
ReferenceKind demangleReferenceKind(StringView &MangledName);
void demangleThrowSpecification(StringView &MangledName);
wchar_t demangleWcharLiteral(StringView &MangledName);
uint8_t demangleCharLiteral(StringView &MangledName);
std::pair<Qualifiers, bool> demangleQualifiers(StringView &MangledName);
@ -1056,16 +1088,25 @@ Symbol *Demangler::parse(StringView &MangledName) {
S->Category = SymbolCategory::Unknown;
S->SymbolName = Arena.alloc<Name>();
S->SymbolName->Str = MangledName;
S->SymbolType = nullptr;
MangledName = StringView();
return S;
}
// MSVC-style mangled symbols must start with '?'.
if (!MangledName.consumeFront("?")) {
S->Category = SymbolCategory::Unknown;
S->SymbolName = Arena.alloc<Name>();
S->SymbolName->Str = MangledName;
S->SymbolType = Arena.alloc<Type>();
S->SymbolType->Prim = PrimTy::Unknown;
S->SymbolType = nullptr;
return S;
}
if (MangledName.consumeFront("?_C@_")) {
// This is a string literal. Just demangle it and return.
S->Category = SymbolCategory::StringLiteral;
S->SymbolName = demangleStringLiteral(MangledName);
S->SymbolType = nullptr;
return S;
}
@ -1325,6 +1366,32 @@ Name *Demangler::demangleOperatorName(StringView &MangledName) {
return "|=";
case '6':
return "^=";
// case '7': # vftable
// case '8': # vbtable
// case '9': # vcall
// case 'A': # typeof
// case 'B': # local static guard
// case 'D': # vbase destructor
// case 'E': # vector deleting destructor
// case 'F': # default constructor closure
// case 'G': # scalar deleting destructor
// case 'H': # vector constructor iterator
// case 'I': # vector destructor iterator
// case 'J': # vector vbase constructor iterator
// case 'K': # virtual displacement map
// case 'L': # eh vector constructor iterator
// case 'M': # eh vector destructor iterator
// case 'N': # eh vector vbase constructor iterator
// case 'O': # copy constructor closure
// case 'P<name>': # udt returning <name>
// case 'Q': # <unknown>
// case 'R0': # RTTI Type Descriptor
// case 'R1': # RTTI Base Class Descriptor at (a,b,c,d)
// case 'R2': # RTTI Base Class Array
// case 'R3': # RTTI Class Hierarchy Descriptor
// case 'R4': # RTTI Complete Object Locator
// case 'S': # local vftable
// case 'T': # local vftable constructor closure
case 'U':
return " new[]";
case 'V':
@ -1359,6 +1426,9 @@ Name *Demangler::demangleOperatorName(StringView &MangledName) {
} else {
Node->Str = NameString();
}
if (Error)
return nullptr;
Node->IsOperator = true;
return Node;
}
@ -1373,6 +1443,326 @@ Name *Demangler::demangleSimpleName(StringView &MangledName, bool Memorize) {
return Node;
}
static bool isRebasedHexDigit(char C) { return (C >= 'A' && C <= 'P'); }
static uint8_t rebasedHexDigitToNumber(char C) {
assert(isRebasedHexDigit(C));
return (C <= 'J') ? (C - 'A') : (10 + C - 'K');
}
uint8_t Demangler::demangleCharLiteral(StringView &MangledName) {
if (!MangledName.startsWith('?'))
return MangledName.popFront();
MangledName = MangledName.dropFront();
if (MangledName.empty())
goto CharLiteralError;
if (MangledName.consumeFront('$')) {
// Two hex digits
if (MangledName.size() < 2)
goto CharLiteralError;
StringView Nibbles = MangledName.substr(0, 2);
if (!isRebasedHexDigit(Nibbles[0]) || !isRebasedHexDigit(Nibbles[1]))
goto CharLiteralError;
// Don't append the null terminator.
uint8_t C1 = rebasedHexDigitToNumber(Nibbles[0]);
uint8_t C2 = rebasedHexDigitToNumber(Nibbles[1]);
MangledName = MangledName.dropFront(2);
return (C1 << 4) | C2;
}
if (startsWithDigit(MangledName)) {
const char *Lookup = ",/\\:. \n\t'-";
char C = Lookup[MangledName[0] - '0'];
MangledName = MangledName.dropFront();
return C;
}
if (MangledName[0] >= 'a' && MangledName[0] <= 'z') {
char Lookup[26] = {'\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7',
'\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE',
'\xEF', '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5',
'\xF6', '\xF7', '\xF8', '\xF9', '\xFA'};
char C = Lookup[MangledName[0] - 'a'];
MangledName = MangledName.dropFront();
return C;
}
if (MangledName[0] >= 'A' && MangledName[0] <= 'Z') {
char Lookup[26] = {'\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7',
'\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE',
'\xCF', '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5',
'\xD6', '\xD7', '\xD8', '\xD9', '\xDA'};
char C = Lookup[MangledName[0] - 'A'];
MangledName = MangledName.dropFront();
return C;
}
CharLiteralError:
Error = true;
return '\0';
}
wchar_t Demangler::demangleWcharLiteral(StringView &MangledName) {
uint8_t C1 = demangleCharLiteral(MangledName);
if (Error)
goto WCharLiteralError;
uint8_t C2 = demangleCharLiteral(MangledName);
if (Error)
goto WCharLiteralError;
return ((wchar_t)C1 << 8) | (wchar_t)C2;
WCharLiteralError:
Error = true;
return L'\0';
}
static void writeHexDigit(char *Buffer, uint8_t Digit) {
assert(Digit <= 15);
*Buffer = (Digit < 10) ? ('0' + Digit) : ('A' + Digit - 10);
}
static void outputHex(OutputStream &OS, unsigned C) {
if (C == 0) {
OS << "\\x00";
return;
}
// It's easier to do the math if we can work from right to left, but we need
// to print the numbers from left to right. So render this into a temporary
// buffer first, then output the temporary buffer. Each byte is of the form
// \xAB, which means that each byte needs 4 characters. Since there are at
// most 4 bytes, we need a 4*4+1 = 17 character temporary buffer.
char TempBuffer[17];
::memset(TempBuffer, 0, sizeof(TempBuffer));
constexpr int MaxPos = 15;
int Pos = MaxPos - 1;
while (C != 0) {
for (int I = 0; I < 2; ++I) {
writeHexDigit(&TempBuffer[Pos--], C % 16);
C /= 16;
}
TempBuffer[Pos--] = 'x';
TempBuffer[Pos--] = '\\';
assert(Pos >= 0);
}
OS << StringView(&TempBuffer[Pos + 1]);
}
static void outputEscapedChar(OutputStream &OS, unsigned C) {
switch (C) {
case '\'': // single quote
OS << "\\\'";
return;
case '\"': // double quote
OS << "\\\"";
return;
case '\\': // backslash
OS << "\\\\";
return;
case '\a': // bell
OS << "\\a";
return;
case '\b': // backspace
OS << "\\b";
return;
case '\f': // form feed
OS << "\\f";
return;
case '\n': // new line
OS << "\\n";
return;
case '\r': // carriage return
OS << "\\r";
return;
case '\t': // tab
OS << "\\t";
return;
case '\v': // vertical tab
OS << "\\v";
return;
default:
break;
}
if (C > 0x1F && C < 0x7F) {
// Standard ascii char.
OS << (char)C;
return;
}
outputHex(OS, C);
}
unsigned countTrailingNullBytes(const uint8_t *StringBytes, int Length) {
const uint8_t *End = StringBytes + Length - 1;
while (Length > 0 && *End == 0) {
--Length;
--End;
}
return End - StringBytes + 1;
}
unsigned countEmbeddedNulls(const uint8_t *StringBytes, unsigned Length) {
unsigned Result = 0;
for (unsigned I = 0; I < Length; ++I) {
if (*StringBytes++ == 0)
++Result;
}
return Result;
}
unsigned guessCharByteSize(const uint8_t *StringBytes, unsigned NumChars,
unsigned NumBytes) {
assert(NumBytes > 0);
// If the number of bytes is odd, this is guaranteed to be a char string.
if (NumBytes % 2 == 1)
return 1;
// All strings can encode at most 32 bytes of data. If it's less than that,
// then we encoded the entire string. In this case we check for a 1-byte,
// 2-byte, or 4-byte null terminator.
if (NumBytes < 32) {
unsigned TrailingNulls = countTrailingNullBytes(StringBytes, NumChars);
if (TrailingNulls >= 4)
return 4;
if (TrailingNulls >= 2)
return 2;
return 1;
}
// The whole string was not able to be encoded. Try to look at embedded null
// terminators to guess. The heuristic is that we count all embedded null
// terminators. If more than 2/3 are null, it's a char32. If more than 1/3
// are null, it's a char16. Otherwise it's a char8. This obviously isn't
// perfect and is biased towards languages that have ascii alphabets, but this
// was always going to be best effort since the encoding is lossy.
unsigned Nulls = countEmbeddedNulls(StringBytes, NumChars);
if (Nulls >= 2 * NumChars / 3)
return 4;
if (Nulls >= NumChars / 3)
return 2;
return 1;
}
static unsigned decodeMultiByteChar(const uint8_t *StringBytes,
unsigned CharIndex, unsigned CharBytes) {
assert(CharBytes == 1 || CharBytes == 2 || CharBytes == 4);
unsigned Offset = CharIndex * CharBytes;
unsigned Result = 0;
StringBytes = StringBytes + Offset;
for (unsigned I = 0; I < CharBytes; ++I) {
unsigned C = static_cast<unsigned>(StringBytes[I]);
Result |= C << (8 * I);
}
return Result;
}
Name *Demangler::demangleStringLiteral(StringView &MangledName) {
OutputStream OS;
StringView CRC;
Name *Result = Arena.alloc<Name>();
Result->IsStringLiteral = true;
// Prefix indicating the beginning of a string literal
if (MangledName.empty())
goto StringLiteralError;
// Char Type (regular or wchar_t)
bool IsWcharT = false;
switch (MangledName.popFront()) {
case '1':
IsWcharT = true;
LLVM_FALLTHROUGH;
case '0':
break;
default:
goto StringLiteralError;
}
// Encoded Length
uint64_t StringByteSize;
bool IsNegative;
std::tie(StringByteSize, IsNegative) = demangleNumber(MangledName);
if (Error || IsNegative)
goto StringLiteralError;
// CRC 32 (always 8 characters plus a terminator)
size_t CrcEndPos = MangledName.find('@');
if (CrcEndPos == StringView::npos)
goto StringLiteralError;
CRC = MangledName.substr(0, CrcEndPos);
MangledName = MangledName.dropFront(CrcEndPos + 1);
if (MangledName.empty())
goto StringLiteralError;
OS = OutputStream::create(nullptr, nullptr, 1024);
if (IsWcharT) {
Result->StringLiteralType = PrimTy::Wchar;
if (StringByteSize > 64)
Result->IsLongStringLiteral = true;
while (!MangledName.consumeFront('@')) {
assert(StringByteSize >= 2);
wchar_t W = demangleWcharLiteral(MangledName);
if (StringByteSize != 2 || Result->IsLongStringLiteral)
outputEscapedChar(OS, W);
StringByteSize -= 2;
if (Error)
goto StringLiteralError;
}
} else {
if (StringByteSize > 32)
Result->IsLongStringLiteral = true;
constexpr unsigned MaxStringByteLength = 32;
uint8_t StringBytes[MaxStringByteLength];
unsigned BytesDecoded = 0;
while (!MangledName.consumeFront('@')) {
assert(StringByteSize >= 1);
StringBytes[BytesDecoded++] = demangleCharLiteral(MangledName);
}
unsigned CharBytes =
guessCharByteSize(StringBytes, BytesDecoded, StringByteSize);
assert(StringByteSize % CharBytes == 0);
switch (CharBytes) {
case 1:
Result->StringLiteralType = PrimTy::Char;
break;
case 2:
Result->StringLiteralType = PrimTy::Char16;
break;
case 4:
Result->StringLiteralType = PrimTy::Char32;
break;
default:
LLVM_BUILTIN_UNREACHABLE;
}
const unsigned NumChars = BytesDecoded / CharBytes;
for (unsigned CharIndex = 0; CharIndex < NumChars; ++CharIndex) {
unsigned NextChar =
decodeMultiByteChar(StringBytes, CharIndex, CharBytes);
if (CharIndex + 1 < NumChars || Result->IsLongStringLiteral)
outputEscapedChar(OS, NextChar);
}
}
OS << '\0';
char *ResultBuffer = OS.getBuffer();
Result->Str = copyString(ResultBuffer);
return Result;
StringLiteralError:
Error = true;
return nullptr;
}
StringView Demangler::demangleSimpleString(StringView &MangledName,
bool Memorize) {
StringView S;
@ -2193,6 +2583,11 @@ void Demangler::output(const Symbol *S, OutputStream &OS) {
outputName(OS, S->SymbolName, S->SymbolType, *this);
return;
}
if (S->Category == SymbolCategory::StringLiteral) {
outputStringLiteral(OS, *S->SymbolName);
return;
}
// Converts an AST to a string.
//
// Converting an AST representing a C++ type to a string is tricky due

View File

@ -0,0 +1,758 @@
; RUN: llvm-undname < %s | FileCheck %s
; CHECK-NOT: Invalid mangled name
??_C@_01CNACBAHC@?$PP?$AA@
??_C@_01DEBJCBDD@?$PO?$AA@
??_C@_01BPDEHCPA@?$PN?$AA@
??_C@_01GCPEDLB@?$PM?$AA@
??_C@_01EJGONFHG@?$PL?$AA@
??_C@_01FAHFOEDH@?z?$AA@
??_C@_01HLFILHPE@?y?$AA@
??_C@_01GCEDIGLF@?x?$AA@
??_C@_01OFNLJKHK@?w?$AA@
??_C@_01PMMAKLDL@?v?$AA@
??_C@_01NHONPIPI@?u?$AA@
??_C@_01MOPGMJLJ@?t?$AA@
??_C@_01IBLHFPHO@?s?$AA@
??_C@_01JIKMGODP@?r?$AA@
??_C@_01LDIBDNPM@?q?$AA@
??_C@_01KKJKAMLN@?p?$AA@
??_C@_01GHMAACCD@?o?$AA@
??_C@_01HONLDDGC@?n?$AA@
??_C@_01FFPGGAKB@?m?$AA@
??_C@_01EMONFBOA@?l?$AA@
??_C@_01DKMMHCH@?k?$AA@
??_C@_01BKLHPGGG@?j?$AA@
??_C@_01DBJKKFKF@?i?$AA@
??_C@_01CIIBJEOE@?h?$AA@
??_C@_01KPBJIICL@?g?$AA@
??_C@_01LGACLJGK@?f?$AA@
??_C@_01JNCPOKKJ@?e?$AA@
??_C@_01IEDENLOI@?d?$AA@
??_C@_01MLHFENCP@?c?$AA@
??_C@_01NCGOHMGO@?b?$AA@
??_C@_01PJEDCPKN@?a?$AA@
??_C@_01OAFIBOOM@?$OA?$AA@
??_C@_01LIIGDENA@?$NP?$AA@
??_C@_01KBJNAFJB@?$NO?$AA@
??_C@_01IKLAFGFC@?$NN?$AA@
??_C@_01JDKLGHBD@?$NM?$AA@
??_C@_01NMOKPBNE@?$NL?$AA@
??_C@_01MFPBMAJF@?Z?$AA@
??_C@_01OONMJDFG@?Y?$AA@
??_C@_01PHMHKCBH@?X?$AA@
??_C@_01HAFPLONI@?W?$AA@
??_C@_01GJEEIPJJ@?V?$AA@
??_C@_01ECGJNMFK@?U?$AA@
??_C@_01FLHCONBL@?T?$AA@
??_C@_01BEDDHLNM@?S?$AA@
??_C@_01NCIEKJN@?R?$AA@
??_C@_01CGAFBJFO@?Q?$AA@
??_C@_01DPBOCIBP@?P?$AA@
??_C@_01PCEECGIB@?O?$AA@
??_C@_01OLFPBHMA@?N?$AA@
??_C@_01MAHCEEAD@?M?$AA@
??_C@_01NJGJHFEC@?L?$AA@
??_C@_01JGCIODIF@?K?$AA@
??_C@_01IPDDNCME@?J?$AA@
??_C@_01KEBOIBAH@?I?$AA@
??_C@_01LNAFLAEG@?H?$AA@
??_C@_01DKJNKMIJ@?G?$AA@
??_C@_01CDIGJNMI@?F?$AA@
??_C@_01IKLMOAL@?E?$AA@
??_C@_01BBLAPPEK@?D?$AA@
??_C@_01FOPBGJIN@?C?$AA@
??_C@_01EHOKFIMM@?B?$AA@
??_C@_01GMMHALAP@?A?$AA@
??_C@_01HFNMDKEO@?$MA?$AA@
??_C@_01NNHLFPHH@?$LP?$AA@
??_C@_01MEGAGODG@?$LO?$AA@
??_C@_01OPENDNPF@?$LN?$AA@
??_C@_01PGFGAMLE@?$LM?$AA@
??_C@_01LJBHJKHD@?$LL?$AA@
??_C@_01KAAMKLDC@?$LK?$AA@
??_C@_01ILCBPIPB@?$LJ?$AA@
??_C@_01JCDKMJLA@?$LI?$AA@
??_C@_01BFKCNFHP@?$LH?$AA@
??_C@_01MLJOEDO@?$LG?$AA@
??_C@_01CHJELHPN@?$LF?$AA@
??_C@_01DOIPIGLM@?$LE?$AA@
??_C@_01HBMOBAHL@?$LD?$AA@
??_C@_01GINFCBDK@?$LC?$AA@
??_C@_01EDPIHCPJ@?$LB?$AA@
??_C@_01FKODEDLI@?$LA?$AA@
??_C@_01JHLJENCG@?$KP?$AA@
??_C@_01IOKCHMGH@?$KO?$AA@
??_C@_01KFIPCPKE@?$KN?$AA@
??_C@_01LMJEBOOF@?$KM?$AA@
??_C@_01PDNFIICC@?$KL?$AA@
??_C@_01OKMOLJGD@?$KK?$AA@
??_C@_01MBODOKKA@?$KJ?$AA@
??_C@_01NIPINLOB@?$KI?$AA@
??_C@_01FPGAMHCO@?$KH?$AA@
??_C@_01EGHLPGGP@?$KG?$AA@
??_C@_01GNFGKFKM@?$KF?$AA@
??_C@_01HEENJEON@?$KE?$AA@
??_C@_01DLAMACCK@?$KD?$AA@
??_C@_01CCBHDDGL@?$KC?$AA@
??_C@_01JDKGAKI@?$KB?$AA@
??_C@_01BACBFBOJ@?$KA?$AA@
??_C@_01EIPPHLNF@?$JP?$AA@
??_C@_01FBOEEKJE@?$JO?$AA@
??_C@_01HKMJBJFH@?$JN?$AA@
??_C@_01GDNCCIBG@?$JM?$AA@
??_C@_01CMJDLONB@?$JL?$AA@
??_C@_01DFIIIPJA@?$JK?$AA@
??_C@_01BOKFNMFD@?$JJ?$AA@
??_C@_01HLOONBC@?$JI?$AA@
??_C@_01IACGPBNN@?$JH?$AA@
??_C@_01JJDNMAJM@?$JG?$AA@
??_C@_01LCBAJDFP@?$JF?$AA@
??_C@_01KLALKCBO@?$JE?$AA@
??_C@_01OEEKDENJ@?$JD?$AA@
??_C@_01PNFBAFJI@?$JC?$AA@
??_C@_01NGHMFGFL@?$JB?$AA@
??_C@_01MPGHGHBK@?$JA?$AA@
??_C@_01CDNGJIE@?$IP?$AA@
??_C@_01BLCGFIMF@?$IO?$AA@
??_C@_01DAALALAG@?$IN?$AA@
??_C@_01CJBADKEH@?$IM?$AA@
??_C@_01GGFBKMIA@?$IL?$AA@
??_C@_01HPEKJNMB@?$IK?$AA@
??_C@_01FEGHMOAC@?$IJ?$AA@
??_C@_01ENHMPPED@?$II?$AA@
??_C@_01MKOEODIM@?$IH?$AA@
??_C@_01NDPPNCMN@?$IG?$AA@
??_C@_01PINCIBAO@?$IF?$AA@
??_C@_01OBMJLAEP@?$IE?$AA@
??_C@_01KOIICGII@?$ID?$AA@
??_C@_01LHJDBHMJ@?$IC?$AA@
??_C@_01JMLOEEAK@?$IB?$AA@
??_C@_01IFKFHFEL@?$IA?$AA@
??_C@_01BGIBIIDJ@?$HP?$AA@
??_C@_01PJKLJHI@?$HO?$AA@
??_C@_01CELHOKLL@?$HN?$AA@
??_C@_01DNKMNLPK@?$HM?$AA@
??_C@_01HCONENDN@?$HL?$AA@
??_C@_01GLPGHMHM@z?$AA@
??_C@_01EANLCPLP@y?$AA@
??_C@_01FJMABOPO@x?$AA@
??_C@_01NOFIACDB@w?$AA@
??_C@_01MHEDDDHA@v?$AA@
??_C@_01OMGOGALD@u?$AA@
??_C@_01PFHFFBPC@t?$AA@
??_C@_01LKDEMHDF@s?$AA@
??_C@_01KDCPPGHE@r?$AA@
??_C@_01IIACKFLH@q?$AA@
??_C@_01JBBJJEPG@p?$AA@
??_C@_01FMEDJKGI@o?$AA@
??_C@_01EFFIKLCJ@n?$AA@
??_C@_01GOHFPIOK@m?$AA@
??_C@_01HHGOMJKL@l?$AA@
??_C@_01DICPFPGM@k?$AA@
??_C@_01CBDEGOCN@j?$AA@
??_C@_01KBJDNOO@i?$AA@
??_C@_01BDACAMKP@h?$AA@
??_C@_01JEJKBAGA@g?$AA@
??_C@_01INIBCBCB@f?$AA@
??_C@_01KGKMHCOC@e?$AA@
??_C@_01LPLHEDKD@d?$AA@
??_C@_01PAPGNFGE@c?$AA@
??_C@_01OJONOECF@b?$AA@
??_C@_01MCMALHOG@a?$AA@
??_C@_01NLNLIGKH@?$GA?$AA@
??_C@_01IDAFKMJL@_?$AA@
??_C@_01JKBOJNNK@?$FO?$AA@
??_C@_01LBDDMOBJ@?$FN?$AA@
??_C@_01KICIPPFI@?2?$AA@
??_C@_01OHGJGJJP@?$FL?$AA@
??_C@_01POHCFINO@Z?$AA@
??_C@_01NFFPALBN@Y?$AA@
??_C@_01MMEEDKFM@X?$AA@
??_C@_01ELNMCGJD@W?$AA@
??_C@_01FCMHBHNC@V?$AA@
??_C@_01HJOKEEBB@U?$AA@
??_C@_01GAPBHFFA@T?$AA@
??_C@_01CPLAODJH@S?$AA@
??_C@_01DGKLNCNG@R?$AA@
??_C@_01BNIGIBBF@Q?$AA@
??_C@_01EJNLAFE@P?$AA@
??_C@_01MJMHLOMK@O?$AA@
??_C@_01NANMIPIL@N?$AA@
??_C@_01PLPBNMEI@M?$AA@
??_C@_01OCOKONAJ@L?$AA@
??_C@_01KNKLHLMO@K?$AA@
??_C@_01LELAEKIP@J?$AA@
??_C@_01JPJNBJEM@I?$AA@
??_C@_01IGIGCIAN@H?$AA@
??_C@_01BBODEMC@G?$AA@
??_C@_01BIAFAFID@F?$AA@
??_C@_01DDCIFGEA@E?$AA@
??_C@_01CKDDGHAB@D?$AA@
??_C@_01GFHCPBMG@C?$AA@
??_C@_01HMGJMAIH@B?$AA@
??_C@_01FHEEJDEE@A?$AA@
??_C@_01EOFPKCAF@?$EA?$AA@
??_C@_01OGPIMHDM@?$DP?$AA@
??_C@_01PPODPGHN@?$DO?$AA@
??_C@_01NEMOKFLO@?$DN?$AA@
??_C@_01MNNFJEPP@?$DM?$AA@
??_C@_01ICJEACDI@?$DL?$AA@
??_C@_01JLIPDDHJ@?3?$AA@
??_C@_01LAKCGALK@9?$AA@
??_C@_01KJLJFBPL@8?$AA@
??_C@_01COCBENDE@7?$AA@
??_C@_01DHDKHMHF@6?$AA@
??_C@_01BMBHCPLG@5?$AA@
??_C@_01FAMBOPH@4?$AA@
??_C@_01EKENIIDA@3?$AA@
??_C@_01FDFGLJHB@2?$AA@
??_C@_01HIHLOKLC@1?$AA@
??_C@_01GBGANLPD@0?$AA@
??_C@_01KMDKNFGN@?1?$AA@
??_C@_01LFCBOECM@?4?$AA@
??_C@_01JOAMLHOP@?9?$AA@
??_C@_01IHBHIGKO@?0?$AA@
??_C@_01MIFGBAGJ@?$CL?$AA@
??_C@_01NBENCBCI@?$CK?$AA@
??_C@_01PKGAHCOL@?$CJ?$AA@
??_C@_01ODHLEDKK@?$CI?$AA@
??_C@_01GEODFPGF@?8?$AA@
??_C@_01HNPIGOCE@?$CG?$AA@
??_C@_01FGNFDNOH@?$CF?$AA@
??_C@_01EPMOAMKG@$?$AA@
??_C@_01IPJKGB@?$CD?$AA@
??_C@_01BJJEKLCA@?$CC?$AA@
??_C@_01DCLJPIOD@?$CB?$AA@
??_C@_01CLKCMJKC@?5?$AA@
??_C@_01HDHMODJO@?$BP?$AA@
??_C@_01GKGHNCNP@?$BO?$AA@
??_C@_01EBEKIBBM@?$BN?$AA@
??_C@_01FIFBLAFN@?$BM?$AA@
??_C@_01BHBACGJK@?$BL?$AA@
??_C@_01OALBHNL@?$BK?$AA@
??_C@_01CFCGEEBI@?$BJ?$AA@
??_C@_01DMDNHFFJ@?$BI?$AA@
??_C@_01LLKFGJJG@?$BH?$AA@
??_C@_01KCLOFINH@?$BG?$AA@
??_C@_01IJJDALBE@?$BF?$AA@
??_C@_01JAIIDKFF@?$BE?$AA@
??_C@_01NPMJKMJC@?$BD?$AA@
??_C@_01MGNCJNND@?$BC?$AA@
??_C@_01ONPPMOBA@?$BB?$AA@
??_C@_01PEOEPPFB@?$BA?$AA@
??_C@_01DJLOPBMP@?$AP?$AA@
??_C@_01CAKFMAIO@?$AO?$AA@
??_C@_01LIIJDEN@?$AN?$AA@
??_C@_01BCJDKCAM@?$AM?$AA@
??_C@_01FNNCDEML@?$AL?$AA@
??_C@_01EEMJAFIK@?6?$AA@
??_C@_01GPOEFGEJ@?7?$AA@
??_C@_01HGPPGHAI@?$AI?$AA@
??_C@_01PBGHHLMH@?$AH?$AA@
??_C@_01OIHMEKIG@?$AG?$AA@
??_C@_01MDFBBJEF@?$AF?$AA@
??_C@_01NKEKCIAE@?$AE?$AA@
??_C@_01JFALLOMD@?$AD?$AA@
??_C@_01IMBAIPIC@?$AC?$AA@
??_C@_01KHDNNMEB@?$AB?$AA@
??_C@_01LOCGONAA@?$AA?$AA@
; CHECK: const char * {"\xFF"}
; CHECK: const char * {"\xFE"}
; CHECK: const char * {"\xFD"}
; CHECK: const char * {"\xFC"}
; CHECK: const char * {"\xFB"}
; CHECK: const char * {"\xFA"}
; CHECK: const char * {"\xF9"}
; CHECK: const char * {"\xF8"}
; CHECK: const char * {"\xF7"}
; CHECK: const char * {"\xF6"}
; CHECK: const char * {"\xF5"}
; CHECK: const char * {"\xF4"}
; CHECK: const char * {"\xF3"}
; CHECK: const char * {"\xF2"}
; CHECK: const char * {"\xF1"}
; CHECK: const char * {"\xF0"}
; CHECK: const char * {"\xEF"}
; CHECK: const char * {"\xEE"}
; CHECK: const char * {"\xED"}
; CHECK: const char * {"\xEC"}
; CHECK: const char * {"\xEB"}
; CHECK: const char * {"\xEA"}
; CHECK: const char * {"\xE9"}
; CHECK: const char * {"\xE8"}
; CHECK: const char * {"\xE7"}
; CHECK: const char * {"\xE6"}
; CHECK: const char * {"\xE5"}
; CHECK: const char * {"\xE4"}
; CHECK: const char * {"\xE3"}
; CHECK: const char * {"\xE2"}
; CHECK: const char * {"\xE1"}
; CHECK: const char * {"\xE0"}
; CHECK: const char * {"\xDF"}
; CHECK: const char * {"\xDE"}
; CHECK: const char * {"\xDD"}
; CHECK: const char * {"\xDC"}
; CHECK: const char * {"\xDB"}
; CHECK: const char * {"\xDA"}
; CHECK: const char * {"\xD9"}
; CHECK: const char * {"\xD8"}
; CHECK: const char * {"\xD7"}
; CHECK: const char * {"\xD6"}
; CHECK: const char * {"\xD5"}
; CHECK: const char * {"\xD4"}
; CHECK: const char * {"\xD3"}
; CHECK: const char * {"\xD2"}
; CHECK: const char * {"\xD1"}
; CHECK: const char * {"\xD0"}
; CHECK: const char * {"\xCF"}
; CHECK: const char * {"\xCE"}
; CHECK: const char * {"\xCD"}
; CHECK: const char * {"\xCC"}
; CHECK: const char * {"\xCB"}
; CHECK: const char * {"\xCA"}
; CHECK: const char * {"\xC9"}
; CHECK: const char * {"\xC8"}
; CHECK: const char * {"\xC7"}
; CHECK: const char * {"\xC6"}
; CHECK: const char * {"\xC5"}
; CHECK: const char * {"\xC4"}
; CHECK: const char * {"\xC3"}
; CHECK: const char * {"\xC2"}
; CHECK: const char * {"\xC1"}
; CHECK: const char * {"\xC0"}
; CHECK: const char * {"\xBF"}
; CHECK: const char * {"\xBE"}
; CHECK: const char * {"\xBD"}
; CHECK: const char * {"\xBC"}
; CHECK: const char * {"\xBB"}
; CHECK: const char * {"\xBA"}
; CHECK: const char * {"\xB9"}
; CHECK: const char * {"\xB8"}
; CHECK: const char * {"\xB7"}
; CHECK: const char * {"\xB6"}
; CHECK: const char * {"\xB5"}
; CHECK: const char * {"\xB4"}
; CHECK: const char * {"\xB3"}
; CHECK: const char * {"\xB2"}
; CHECK: const char * {"\xB1"}
; CHECK: const char * {"\xB0"}
; CHECK: const char * {"\xAF"}
; CHECK: const char * {"\xAE"}
; CHECK: const char * {"\xAD"}
; CHECK: const char * {"\xAC"}
; CHECK: const char * {"\xAB"}
; CHECK: const char * {"\xAA"}
; CHECK: const char * {"\xA9"}
; CHECK: const char * {"\xA8"}
; CHECK: const char * {"\xA7"}
; CHECK: const char * {"\xA6"}
; CHECK: const char * {"\xA5"}
; CHECK: const char * {"\xA4"}
; CHECK: const char * {"\xA3"}
; CHECK: const char * {"\xA2"}
; CHECK: const char * {"\xA1"}
; CHECK: const char * {"\xA0"}
; CHECK: const char * {"\x9F"}
; CHECK: const char * {"\x9E"}
; CHECK: const char * {"\x9D"}
; CHECK: const char * {"\x9C"}
; CHECK: const char * {"\x9B"}
; CHECK: const char * {"\x9A"}
; CHECK: const char * {"\x99"}
; CHECK: const char * {"\x98"}
; CHECK: const char * {"\x97"}
; CHECK: const char * {"\x96"}
; CHECK: const char * {"\x95"}
; CHECK: const char * {"\x94"}
; CHECK: const char * {"\x93"}
; CHECK: const char * {"\x92"}
; CHECK: const char * {"\x91"}
; CHECK: const char * {"\x90"}
; CHECK: const char * {"\x8F"}
; CHECK: const char * {"\x8E"}
; CHECK: const char * {"\x8D"}
; CHECK: const char * {"\x8C"}
; CHECK: const char * {"\x8B"}
; CHECK: const char * {"\x8A"}
; CHECK: const char * {"\x89"}
; CHECK: const char * {"\x88"}
; CHECK: const char * {"\x87"}
; CHECK: const char * {"\x86"}
; CHECK: const char * {"\x85"}
; CHECK: const char * {"\x84"}
; CHECK: const char * {"\x83"}
; CHECK: const char * {"\x82"}
; CHECK: const char * {"\x81"}
; CHECK: const char * {"\x80"}
; CHECK: const char * {"\x7F"}
; CHECK: const char * {"~"}
; CHECK: const char * {"}"}
; CHECK: const char * {"|"}
; CHECK: const char * {"{"}
; CHECK: const char * {"z"}
; CHECK: const char * {"y"}
; CHECK: const char * {"x"}
; CHECK: const char * {"w"}
; CHECK: const char * {"v"}
; CHECK: const char * {"u"}
; CHECK: const char * {"t"}
; CHECK: const char * {"s"}
; CHECK: const char * {"r"}
; CHECK: const char * {"q"}
; CHECK: const char * {"p"}
; CHECK: const char * {"o"}
; CHECK: const char * {"n"}
; CHECK: const char * {"m"}
; CHECK: const char * {"l"}
; CHECK: const char * {"k"}
; CHECK: const char * {"j"}
; CHECK: const char * {"i"}
; CHECK: const char * {"h"}
; CHECK: const char * {"g"}
; CHECK: const char * {"f"}
; CHECK: const char * {"e"}
; CHECK: const char * {"d"}
; CHECK: const char * {"c"}
; CHECK: const char * {"b"}
; CHECK: const char * {"a"}
; CHECK: const char * {"`"}
; CHECK: const char * {"_"}
; CHECK: const char * {"^"}
; CHECK: const char * {"]"}
; CHECK: const char * {"\\"}
; CHECK: const char * {"["}
; CHECK: const char * {"Z"}
; CHECK: const char * {"Y"}
; CHECK: const char * {"X"}
; CHECK: const char * {"W"}
; CHECK: const char * {"V"}
; CHECK: const char * {"U"}
; CHECK: const char * {"T"}
; CHECK: const char * {"S"}
; CHECK: const char * {"R"}
; CHECK: const char * {"Q"}
; CHECK: const char * {"P"}
; CHECK: const char * {"O"}
; CHECK: const char * {"N"}
; CHECK: const char * {"M"}
; CHECK: const char * {"L"}
; CHECK: const char * {"K"}
; CHECK: const char * {"J"}
; CHECK: const char * {"I"}
; CHECK: const char * {"H"}
; CHECK: const char * {"G"}
; CHECK: const char * {"F"}
; CHECK: const char * {"E"}
; CHECK: const char * {"D"}
; CHECK: const char * {"C"}
; CHECK: const char * {"B"}
; CHECK: const char * {"A"}
; CHECK: const char * {"@"}
; CHECK: const char * {"?"}
; CHECK: const char * {">"}
; CHECK: const char * {"="}
; CHECK: const char * {"<"}
; CHECK: const char * {";"}
; CHECK: const char * {":"}
; CHECK: const char * {"9"}
; CHECK: const char * {"8"}
; CHECK: const char * {"7"}
; CHECK: const char * {"6"}
; CHECK: const char * {"5"}
; CHECK: const char * {"4"}
; CHECK: const char * {"3"}
; CHECK: const char * {"2"}
; CHECK: const char * {"1"}
; CHECK: const char * {"0"}
; CHECK: const char * {"/"}
; CHECK: const char * {"."}
; CHECK: const char * {"-"}
; CHECK: const char * {","}
; CHECK: const char * {"+"}
; CHECK: const char * {"*"}
; CHECK: const char * {")"}
; CHECK: const char * {"("}
; CHECK: const char * {"\'"}
; CHECK: const char * {"&"}
; CHECK: const char * {"%"}
; CHECK: const char * {"$"}
; CHECK: const char * {"#"}
; CHECK: const char * {"\""}
; CHECK: const char * {"!"}
; CHECK: const char * {" "}
; CHECK: const char * {"\x1F"}
; CHECK: const char * {"\x1E"}
; CHECK: const char * {"\x1D"}
; CHECK: const char * {"\x1C"}
; CHECK: const char * {"\x1B"}
; CHECK: const char * {"\x1A"}
; CHECK: const char * {"\x19"}
; CHECK: const char * {"\x18"}
; CHECK: const char * {"\x17"}
; CHECK: const char * {"\x16"}
; CHECK: const char * {"\x15"}
; CHECK: const char * {"\x14"}
; CHECK: const char * {"\x13"}
; CHECK: const char * {"\x12"}
; CHECK: const char * {"\x11"}
; CHECK: const char * {"\x10"}
; CHECK: const char * {"\x0F"}
; CHECK: const char * {"\x0E"}
; CHECK: const char * {"\r"}
; CHECK: const char * {"\f"}
; CHECK: const char * {"\v"}
; CHECK: const char * {"\n"}
; CHECK: const char * {"\t"}
; CHECK: const char * {"\b"}
; CHECK: const char * {"\a"}
; CHECK: const char * {"\x06"}
; CHECK: const char * {"\x05"}
; CHECK: const char * {"\x04"}
; CHECK: const char * {"\x03"}
; CHECK: const char * {"\x02"}
; CHECK: const char * {"\x01"}
; CHECK: const char * {"\x00"}
??_C@_13KDLDGPGJ@?$AA?7?$AA?$AA@
??_C@_13LBAGMAIH@?$AA?6?$AA?$AA@
??_C@_13JLKKHOC@?$AA?$AL?$AA?$AA@
??_C@_13HOIJIPNN@?$AA?5?$AA?$AA@
??_C@_13MGDFOILI@?$AA?$CB?$AA?$AA@
??_C@_13NEIAEHFG@?$AA?$CC?$AA?$AA@
??_C@_13GMDMCADD@?$AA?$CD?$AA?$AA@
??_C@_13PBOLBIIK@?$AA$?$AA?$AA@
??_C@_13EJFHHPOP@?$AA?$CF?$AA?$AA@
??_C@_13FLOCNAAB@?$AA?$CG?$AA?$AA@
??_C@_13ODFOLHGE@?$AA?8?$AA?$AA@
??_C@_13LLDNKHDC@?$AA?$CI?$AA?$AA@
??_C@_13DIBMAFH@?$AA?$CJ?$AA?$AA@
??_C@_13BBDEGPLJ@?$AA?$CK?$AA?$AA@
??_C@_13KJIIAINM@?$AA?$CL?$AA?$AA@
??_C@_13DEFPDAGF@?$AA?0?$AA?$AA@
??_C@_13IMODFHAA@?$AA?9?$AA?$AA@
??_C@_13JOFGPIOO@?$AA?4?$AA?$AA@
??_C@_13CGOKJPIL@?$AA?1?$AA?$AA@
??_C@_13COJANIEC@?$AA0?$AA?$AA@
??_C@_13JGCMLPCH@?$AA1?$AA?$AA@
??_C@_13IEJJBAMJ@?$AA2?$AA?$AA@
??_C@_13DMCFHHKM@?$AA3?$AA?$AA@
??_C@_13KBPCEPBF@?$AA4?$AA?$AA@
??_C@_13BJEOCIHA@?$AA5?$AA?$AA@
??_C@_13LPLIHJO@?$AA6?$AA?$AA@
??_C@_13LDEHOAPL@?$AA7?$AA?$AA@
??_C@_13OLCEPAKN@?$AA8?$AA?$AA@
??_C@_13FDJIJHMI@?$AA9?$AA?$AA@
??_C@_13EBCNDICG@?$AA?3?$AA?$AA@
??_C@_13PJJBFPED@?$AA?$DL?$AA?$AA@
??_C@_13GEEGGHPK@?$AA?$DM?$AA?$AA@
??_C@_13NMPKAAJP@?$AA?$DN?$AA?$AA@
??_C@_13MOEPKPHB@?$AA?$DO?$AA?$AA@
??_C@_13HGPDMIBE@?$AA?$DP?$AA?$AA@
??_C@_13EFKPHINO@?$AA?$EA?$AA?$AA@
??_C@_13PNBDBPLL@?$AAA?$AA?$AA@
??_C@_13OPKGLAFF@?$AAB?$AA?$AA@
??_C@_13FHBKNHDA@?$AAC?$AA?$AA@
??_C@_13MKMNOPIJ@?$AAD?$AA?$AA@
??_C@_13HCHBIIOM@?$AAE?$AA?$AA@
??_C@_13GAMECHAC@?$AAF?$AA?$AA@
??_C@_13NIHIEAGH@?$AAG?$AA?$AA@
??_C@_13IABLFADB@?$AAH?$AA?$AA@
??_C@_13DIKHDHFE@?$AAI?$AA?$AA@
??_C@_13CKBCJILK@?$AAJ?$AA?$AA@
??_C@_13JCKOPPNP@?$AAK?$AA?$AA@
??_C@_13PHJMHGG@?$AAL?$AA?$AA@
??_C@_13LHMFKAAD@?$AAM?$AA?$AA@
??_C@_13KFHAAPON@?$AAN?$AA?$AA@
??_C@_13BNMMGIII@?$AAO?$AA?$AA@
??_C@_13BFLGCPEB@?$AAP?$AA?$AA@
??_C@_13KNAKEICE@?$AAQ?$AA?$AA@
??_C@_13LPLPOHMK@?$AAR?$AA?$AA@
??_C@_13HADIAKP@?$AAS?$AA?$AA@
??_C@_13JKNELIBG@?$AAT?$AA?$AA@
??_C@_13CCGINPHD@?$AAU?$AA?$AA@
??_C@_13DANNHAJN@?$AAV?$AA?$AA@
??_C@_13IIGBBHPI@?$AAW?$AA?$AA@
??_C@_13NAACAHKO@?$AAX?$AA?$AA@
??_C@_13GILOGAML@?$AAY?$AA?$AA@
??_C@_13HKALMPCF@?$AAZ?$AA?$AA@
??_C@_13MCLHKIEA@?$AA?$FL?$AA?$AA@
??_C@_13FPGAJAPJ@?$AA?2?$AA?$AA@
??_C@_13OHNMPHJM@?$AA?$FN?$AA?$AA@
??_C@_13PFGJFIHC@?$AA?$FO?$AA?$AA@
??_C@_13ENNFDPBH@?$AA_?$AA?$AA@
??_C@_13OFJNNHOA@?$AA?$GA?$AA?$AA@
??_C@_13FNCBLAIF@?$AAa?$AA?$AA@
??_C@_13EPJEBPGL@?$AAb?$AA?$AA@
??_C@_13PHCIHIAO@?$AAc?$AA?$AA@
??_C@_13GKPPEALH@?$AAd?$AA?$AA@
??_C@_13NCEDCHNC@?$AAe?$AA?$AA@
??_C@_13MAPGIIDM@?$AAf?$AA?$AA@
??_C@_13HIEKOPFJ@?$AAg?$AA?$AA@
??_C@_13CACJPPAP@?$AAh?$AA?$AA@
??_C@_13JIJFJIGK@?$AAi?$AA?$AA@
??_C@_13IKCADHIE@?$AAj?$AA?$AA@
??_C@_13DCJMFAOB@?$AAk?$AA?$AA@
??_C@_13KPELGIFI@?$AAl?$AA?$AA@
??_C@_13BHPHAPDN@?$AAm?$AA?$AA@
??_C@_13FECKAND@?$AAn?$AA?$AA@
??_C@_13LNPOMHLG@?$AAo?$AA?$AA@
??_C@_13LFIEIAHP@?$AAp?$AA?$AA@
??_C@_13NDIOHBK@?$AAq?$AA?$AA@
??_C@_13BPINEIPE@?$AAr?$AA?$AA@
??_C@_13KHDBCPJB@?$AAs?$AA?$AA@
??_C@_13DKOGBHCI@?$AAt?$AA?$AA@
??_C@_13ICFKHAEN@?$AAu?$AA?$AA@
??_C@_13JAOPNPKD@?$AAv?$AA?$AA@
??_C@_13CIFDLIMG@?$AAw?$AA?$AA@
??_C@_13HADAKIJA@?$AAx?$AA?$AA@
??_C@_13MIIMMPPF@?$AAy?$AA?$AA@
??_C@_13NKDJGABL@?$AAz?$AA?$AA@
??_C@_13GCIFAHHO@?$AA?$HL?$AA?$AA@
??_C@_13PPFCDPMH@?$AA?$HM?$AA?$AA@
??_C@_13EHOOFIKC@?$AA?$HN?$AA?$AA@
??_C@_13FFFLPHEM@?$AA?$HO?$AA?$AA@
; CHECK: const wchar_t * {L"\t"}
; CHECK: const wchar_t * {L"\n"}
; CHECK: const wchar_t * {L"\v"}
; CHECK: const wchar_t * {L" "}
; CHECK: const wchar_t * {L"!"}
; CHECK: const wchar_t * {L"\""}
; CHECK: const wchar_t * {L"#"}
; CHECK: const wchar_t * {L"$"}
; CHECK: const wchar_t * {L"%"}
; CHECK: const wchar_t * {L"&"}
; CHECK: const wchar_t * {L"\'"}
; CHECK: const wchar_t * {L"("}
; CHECK: const wchar_t * {L")"}
; CHECK: const wchar_t * {L"*"}
; CHECK: const wchar_t * {L"+"}
; CHECK: const wchar_t * {L","}
; CHECK: const wchar_t * {L"-"}
; CHECK: const wchar_t * {L"."}
; CHECK: const wchar_t * {L"/"}
; CHECK: const wchar_t * {L"0"}
; CHECK: const wchar_t * {L"1"}
; CHECK: const wchar_t * {L"2"}
; CHECK: const wchar_t * {L"3"}
; CHECK: const wchar_t * {L"4"}
; CHECK: const wchar_t * {L"5"}
; CHECK: const wchar_t * {L"6"}
; CHECK: const wchar_t * {L"7"}
; CHECK: const wchar_t * {L"8"}
; CHECK: const wchar_t * {L"9"}
; CHECK: const wchar_t * {L":"}
; CHECK: const wchar_t * {L";"}
; CHECK: const wchar_t * {L"<"}
; CHECK: const wchar_t * {L"="}
; CHECK: const wchar_t * {L">"}
; CHECK: const wchar_t * {L"?"}
; CHECK: const wchar_t * {L"@"}
; CHECK: const wchar_t * {L"A"}
; CHECK: const wchar_t * {L"B"}
; CHECK: const wchar_t * {L"C"}
; CHECK: const wchar_t * {L"D"}
; CHECK: const wchar_t * {L"E"}
; CHECK: const wchar_t * {L"F"}
; CHECK: const wchar_t * {L"G"}
; CHECK: const wchar_t * {L"H"}
; CHECK: const wchar_t * {L"I"}
; CHECK: const wchar_t * {L"J"}
; CHECK: const wchar_t * {L"K"}
; CHECK: const wchar_t * {L"L"}
; CHECK: const wchar_t * {L"M"}
; CHECK: const wchar_t * {L"N"}
; CHECK: const wchar_t * {L"O"}
; CHECK: const wchar_t * {L"P"}
; CHECK: const wchar_t * {L"Q"}
; CHECK: const wchar_t * {L"R"}
; CHECK: const wchar_t * {L"S"}
; CHECK: const wchar_t * {L"T"}
; CHECK: const wchar_t * {L"U"}
; CHECK: const wchar_t * {L"V"}
; CHECK: const wchar_t * {L"W"}
; CHECK: const wchar_t * {L"X"}
; CHECK: const wchar_t * {L"Y"}
; CHECK: const wchar_t * {L"Z"}
; CHECK: const wchar_t * {L"["}
; CHECK: const wchar_t * {L"\\"}
; CHECK: const wchar_t * {L"]"}
; CHECK: const wchar_t * {L"^"}
; CHECK: const wchar_t * {L"_"}
; CHECK: const wchar_t * {L"`"}
; CHECK: const wchar_t * {L"a"}
; CHECK: const wchar_t * {L"b"}
; CHECK: const wchar_t * {L"c"}
; CHECK: const wchar_t * {L"d"}
; CHECK: const wchar_t * {L"e"}
; CHECK: const wchar_t * {L"f"}
; CHECK: const wchar_t * {L"g"}
; CHECK: const wchar_t * {L"h"}
; CHECK: const wchar_t * {L"i"}
; CHECK: const wchar_t * {L"j"}
; CHECK: const wchar_t * {L"k"}
; CHECK: const wchar_t * {L"l"}
; CHECK: const wchar_t * {L"m"}
; CHECK: const wchar_t * {L"n"}
; CHECK: const wchar_t * {L"o"}
; CHECK: const wchar_t * {L"p"}
; CHECK: const wchar_t * {L"q"}
; CHECK: const wchar_t * {L"r"}
; CHECK: const wchar_t * {L"s"}
; CHECK: const wchar_t * {L"t"}
; CHECK: const wchar_t * {L"u"}
; CHECK: const wchar_t * {L"v"}
; CHECK: const wchar_t * {L"w"}
; CHECK: const wchar_t * {L"x"}
; CHECK: const wchar_t * {L"y"}
; CHECK: const wchar_t * {L"z"}
; CHECK: const wchar_t * {L"{"}
; CHECK: const wchar_t * {L"|"}
; CHECK: const wchar_t * {L"}"}
; CHECK: const wchar_t * {L"~"}
??_C@_0CF@LABBIIMO@012345678901234567890123456789AB@
; CHECK: const char * {"012345678901234567890123456789AB"...}
??_C@_1EK@KFPEBLPK@?$AA0?$AA1?$AA2?$AA3?$AA4?$AA5?$AA6?$AA7?$AA8?$AA9?$AA0?$AA1?$AA2?$AA3?$AA4?$AA5?$AA6?$AA7?$AA8?$AA9?$AA0?$AA1?$AA2?$AA3?$AA4?$AA5?$AA6?$AA7?$AA8?$AA9?$AAA?$AAB@
; CHECK: const wchar_t * {L"012345678901234567890123456789AB"...}
??_C@_13IIHIAFKH@?W?$PP?$AA?$AA@
; CHECK: const wchar_t * {L"\xD7\xFF"}
??_C@_02PCEFGMJL@hi?$AA@
; CHECK: const char * {"hi"}
??_C@_05OMLEGLOC@h?$AAi?$AA?$AA?$AA@
; CHECK: const char16_t * {u"hi"}
??_C@_0EK@FEAOBHPP@o?$AA1?$AA2?$AA3?$AA4?$AA5?$AA6?$AA7?$AA8?$AA9?$AA0?$AA1?$AA2?$AA3?$AA4?$AA5?$AA@
; CHECK: const char16_t * {u"o123456789012345"...}
??_C@_0M@GFNAJIPG@h?$AA?$AA?$AAi?$AA?$AA?$AA?$AA?$AA?$AA?$AA@
; CHECK: const char32_t * {U"hi"}
??_C@_0JE@IMHFEDAA@0?$AA?$AA?$AA1?$AA?$AA?$AA2?$AA?$AA?$AA3?$AA?$AA?$AA4?$AA?$AA?$AA5?$AA?$AA?$AA6?$AA?$AA?$AA7?$AA?$AA?$AA@
; CHECK: const char32_t * {U"01234567"...}
; These all have just the right length that the trailing 0 just fits.
??_C@_0CA@NMANGEKF@012345678901234567890123456789A?$AA@
; CHECK: const char * {"012345678901234567890123456789A"}
??_C@_1EA@LJAFPILO@?$AA0?$AA1?$AA2?$AA3?$AA4?$AA5?$AA6?$AA7?$AA8?$AA9?$AA0?$AA1?$AA2?$AA3?$AA4?$AA5?$AA6?$AA7?$AA8?$AA9?$AA0?$AA1?$AA2?$AA3?$AA4?$AA5?$AA6?$AA7?$AA8?$AA9?$AAA?$AA?$AA@
; CHECK: const wchar_t * {L"012345678901234567890123456789A"}
??_C@_0CA@NMANGEKF@012345678901234567890123456789A?$AA@
; CHECK: const char * {"012345678901234567890123456789A"}
??_C@_0CA@NFEFHIFO@0?$AA1?$AA2?$AA3?$AA4?$AA5?$AA6?$AA7?$AA8?$AA9?$AA0?$AA1?$AA2?$AA3?$AA4?$AA?$AA?$AA@
; CHECK: const char16_t * {u"012345678901234"}
??_C@_0CA@KFPHPCC@0?$AA?$AA?$AA1?$AA?$AA?$AA2?$AA?$AA?$AA3?$AA?$AA?$AA4?$AA?$AA?$AA5?$AA?$AA?$AA6?$AA?$AA?$AA?$AA?$AA?$AA?$AA@
; CHECK: const char32_t * {U"0123456"}