<div dir="ltr">I suspect this leak <a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/22422">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/22422</a> is from the patch<br></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Aug 16, 2018 at 9:18 AM Zachary Turner via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: zturner<br>
Date: Thu Aug 16 09:17:36 2018<br>
New Revision: 339892<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=339892&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=339892&view=rev</a><br>
Log:<br>
[MS Demangler] Demangle string literals.<br>
<br>
When demangling string literals, Microsoft's undname<br>
simply prints 'string'.  This patch implements string<br>
literal demangling while doing a bit better than this<br>
by decoding as much of the string as possible and<br>
trying to faithfully reproduce the original string<br>
literal definition.<br>
<br>
This is a bit tricky because the different character<br>
types char, char16_t, and char32_t are not uniquely<br>
identified by the mangling, so we have to use a<br>
heuristic to try to guess the character type.  But<br>
it works pretty well, and many tests are added to<br>
illustrate the behavior.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D50806" rel="noreferrer" target="_blank">https://reviews.llvm.org/D50806</a><br>
<br>
Added:<br>
    llvm/trunk/test/Demangle/ms-string-literals.test<br>
Modified:<br>
    llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp<br>
<br>
Modified: llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp?rev=339892&r1=339891&r2=339892&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp?rev=339892&r1=339891&r2=339892&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp (original)<br>
+++ llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp Thu Aug 16 09:17:36 2018<br>
@@ -213,7 +213,7 @@ enum NameBackrefBehavior : uint8_t {<br>
   NBB_Simple = 1 << 1,   // save simple names.<br>
 };<br>
<br>
-enum class SymbolCategory { Function, Variable, Unknown };<br>
+enum class SymbolCategory { Unknown, Function, Variable, StringLiteral };<br>
<br>
 namespace {<br>
<br>
@@ -291,6 +291,11 @@ struct Name {<br>
   bool IsOperator = false;<br>
   bool IsBackReference = false;<br>
   bool IsConversionOperator = false;<br>
+  bool IsStringLiteral = false;<br>
+  bool IsLongStringLiteral = false;<br>
+<br>
+  // If IsStringLiteral is true, this is the character type.<br>
+  PrimTy StringLiteralType = PrimTy::None;<br>
<br>
   // Name read from an MangledName string.<br>
   StringView Str;<br>
@@ -521,6 +526,30 @@ static void outputParameterList(OutputSt<br>
   }<br>
 }<br>
<br>
+static void outputStringLiteral(OutputStream &OS, const Name &TheString) {<br>
+  assert(TheString.IsStringLiteral);<br>
+  switch (TheString.StringLiteralType) {<br>
+  case PrimTy::Wchar:<br>
+    OS << "const wchar_t * {L\"";<br>
+    break;<br>
+  case PrimTy::Char:<br>
+    OS << "const char * {\"";<br>
+    break;<br>
+  case PrimTy::Char16:<br>
+    OS << "const char16_t * {u\"";<br>
+    break;<br>
+  case PrimTy::Char32:<br>
+    OS << "const char32_t * {U\"";<br>
+    break;<br>
+  default:<br>
+    LLVM_BUILTIN_UNREACHABLE;<br>
+  }<br>
+  OS << TheString.Str << "\"";<br>
+  if (TheString.IsLongStringLiteral)<br>
+    OS << "...";<br>
+  OS << "}";<br>
+}<br>
+<br>
 static void outputName(OutputStream &OS, const Name *TheName, const Type *Ty,<br>
                        NameResolver &Resolver);<br>
<br>
@@ -1009,6 +1038,7 @@ private:<br>
   Name *demangleSimpleName(StringView &MangledName, bool Memorize);<br>
   Name *demangleAnonymousNamespaceName(StringView &MangledName);<br>
   Name *demangleLocallyScopedNamePiece(StringView &MangledName);<br>
+  Name *demangleStringLiteral(StringView &MangledName);<br>
<br>
   StringView demangleSimpleString(StringView &MangledName, bool Memorize);<br>
<br>
@@ -1017,6 +1047,8 @@ private:<br>
   StorageClass demangleVariableStorageClass(StringView &MangledName);<br>
   ReferenceKind demangleReferenceKind(StringView &MangledName);<br>
   void demangleThrowSpecification(StringView &MangledName);<br>
+  wchar_t demangleWcharLiteral(StringView &MangledName);<br>
+  uint8_t demangleCharLiteral(StringView &MangledName);<br>
<br>
   std::pair<Qualifiers, bool> demangleQualifiers(StringView &MangledName);<br>
<br>
@@ -1056,16 +1088,25 @@ Symbol *Demangler::parse(StringView &Man<br>
     S->Category = SymbolCategory::Unknown;<br>
     S->SymbolName = Arena.alloc<Name>();<br>
     S->SymbolName->Str = MangledName;<br>
+    S->SymbolType = nullptr;<br>
     MangledName = StringView();<br>
     return S;<br>
   }<br>
<br>
   // MSVC-style mangled symbols must start with '?'.<br>
   if (!MangledName.consumeFront("?")) {<br>
+    S->Category = SymbolCategory::Unknown;<br>
     S->SymbolName = Arena.alloc<Name>();<br>
     S->SymbolName->Str = MangledName;<br>
-    S->SymbolType = Arena.alloc<Type>();<br>
-    S->SymbolType->Prim = PrimTy::Unknown;<br>
+    S->SymbolType = nullptr;<br>
+    return S;<br>
+  }<br>
+<br>
+  if (MangledName.consumeFront("?_C@_")) {<br>
+    // This is a string literal.  Just demangle it and return.<br>
+    S->Category = SymbolCategory::StringLiteral;<br>
+    S->SymbolName = demangleStringLiteral(MangledName);<br>
+    S->SymbolType = nullptr;<br>
     return S;<br>
   }<br>
<br>
@@ -1325,6 +1366,32 @@ Name *Demangler::demangleOperatorName(St<br>
         return "|=";<br>
       case '6':<br>
         return "^=";<br>
+      // case '7': # vftable<br>
+      // case '8': # vbtable<br>
+      // case '9': # vcall<br>
+      // case 'A': # typeof<br>
+      // case 'B': # local static guard<br>
+      // case 'D': # vbase destructor<br>
+      // case 'E': # vector deleting destructor<br>
+      // case 'F': # default constructor closure<br>
+      // case 'G': # scalar deleting destructor<br>
+      // case 'H': # vector constructor iterator<br>
+      // case 'I': # vector destructor iterator<br>
+      // case 'J': # vector vbase constructor iterator<br>
+      // case 'K': # virtual displacement map<br>
+      // case 'L': # eh vector constructor iterator<br>
+      // case 'M': # eh vector destructor iterator<br>
+      // case 'N': # eh vector vbase constructor iterator<br>
+      // case 'O': # copy constructor closure<br>
+      // case 'P<name>': # udt returning <name><br>
+      // case 'Q': # <unknown><br>
+      // case 'R0': # RTTI Type Descriptor<br>
+      // case 'R1': # RTTI Base Class Descriptor at (a,b,c,d)<br>
+      // case 'R2': # RTTI Base Class Array<br>
+      // case 'R3': # RTTI Class Hierarchy Descriptor<br>
+      // case 'R4': # RTTI Complete Object Locator<br>
+      // case 'S': # local vftable<br>
+      // case 'T': # local vftable constructor closure<br>
       case 'U':<br>
         return " new[]";<br>
       case 'V':<br>
@@ -1359,6 +1426,9 @@ Name *Demangler::demangleOperatorName(St<br>
   } else {<br>
     Node->Str = NameString();<br>
   }<br>
+  if (Error)<br>
+    return nullptr;<br>
+<br>
   Node->IsOperator = true;<br>
   return Node;<br>
 }<br>
@@ -1373,6 +1443,326 @@ Name *Demangler::demangleSimpleName(Stri<br>
   return Node;<br>
 }<br>
<br>
+static bool isRebasedHexDigit(char C) { return (C >= 'A' && C <= 'P'); }<br>
+<br>
+static uint8_t rebasedHexDigitToNumber(char C) {<br>
+  assert(isRebasedHexDigit(C));<br>
+  return (C <= 'J') ? (C - 'A') : (10 + C - 'K');<br>
+}<br>
+<br>
+uint8_t Demangler::demangleCharLiteral(StringView &MangledName) {<br>
+  if (!MangledName.startsWith('?'))<br>
+    return MangledName.popFront();<br>
+<br>
+  MangledName = MangledName.dropFront();<br>
+  if (MangledName.empty())<br>
+    goto CharLiteralError;<br>
+<br>
+  if (MangledName.consumeFront('$')) {<br>
+    // Two hex digits<br>
+    if (MangledName.size() < 2)<br>
+      goto CharLiteralError;<br>
+    StringView Nibbles = MangledName.substr(0, 2);<br>
+    if (!isRebasedHexDigit(Nibbles[0]) || !isRebasedHexDigit(Nibbles[1]))<br>
+      goto CharLiteralError;<br>
+    // Don't append the null terminator.<br>
+    uint8_t C1 = rebasedHexDigitToNumber(Nibbles[0]);<br>
+    uint8_t C2 = rebasedHexDigitToNumber(Nibbles[1]);<br>
+    MangledName = MangledName.dropFront(2);<br>
+    return (C1 << 4) | C2;<br>
+  }<br>
+<br>
+  if (startsWithDigit(MangledName)) {<br>
+    const char *Lookup = ",/\\:. \n\t'-";<br>
+    char C = Lookup[MangledName[0] - '0'];<br>
+    MangledName = MangledName.dropFront();<br>
+    return C;<br>
+  }<br>
+<br>
+  if (MangledName[0] >= 'a' && MangledName[0] <= 'z') {<br>
+    char Lookup[26] = {'\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7',<br>
+                       '\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE',<br>
+                       '\xEF', '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5',<br>
+                       '\xF6', '\xF7', '\xF8', '\xF9', '\xFA'};<br>
+    char C = Lookup[MangledName[0] - 'a'];<br>
+    MangledName = MangledName.dropFront();<br>
+    return C;<br>
+  }<br>
+<br>
+  if (MangledName[0] >= 'A' && MangledName[0] <= 'Z') {<br>
+    char Lookup[26] = {'\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7',<br>
+                       '\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE',<br>
+                       '\xCF', '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5',<br>
+                       '\xD6', '\xD7', '\xD8', '\xD9', '\xDA'};<br>
+    char C = Lookup[MangledName[0] - 'A'];<br>
+    MangledName = MangledName.dropFront();<br>
+    return C;<br>
+  }<br>
+<br>
+CharLiteralError:<br>
+  Error = true;<br>
+  return '\0';<br>
+}<br>
+<br>
+wchar_t Demangler::demangleWcharLiteral(StringView &MangledName) {<br>
+  uint8_t C1 = demangleCharLiteral(MangledName);<br>
+  if (Error)<br>
+    goto WCharLiteralError;<br>
+  uint8_t C2 = demangleCharLiteral(MangledName);<br>
+  if (Error)<br>
+    goto WCharLiteralError;<br>
+<br>
+  return ((wchar_t)C1 << 8) | (wchar_t)C2;<br>
+<br>
+WCharLiteralError:<br>
+  Error = true;<br>
+  return L'\0';<br>
+}<br>
+<br>
+static void writeHexDigit(char *Buffer, uint8_t Digit) {<br>
+  assert(Digit <= 15);<br>
+  *Buffer = (Digit < 10) ? ('0' + Digit) : ('A' + Digit - 10);<br>
+}<br>
+<br>
+static void outputHex(OutputStream &OS, unsigned C) {<br>
+  if (C == 0) {<br>
+    OS << "\\x00";<br>
+    return;<br>
+  }<br>
+  // It's easier to do the math if we can work from right to left, but we need<br>
+  // to print the numbers from left to right.  So render this into a temporary<br>
+  // buffer first, then output the temporary buffer.  Each byte is of the form<br>
+  // \xAB, which means that each byte needs 4 characters.  Since there are at<br>
+  // most 4 bytes, we need a 4*4+1 = 17 character temporary buffer.<br>
+  char TempBuffer[17];<br>
+<br>
+  ::memset(TempBuffer, 0, sizeof(TempBuffer));<br>
+  constexpr int MaxPos = 15;<br>
+<br>
+  int Pos = MaxPos - 1;<br>
+  while (C != 0) {<br>
+    for (int I = 0; I < 2; ++I) {<br>
+      writeHexDigit(&TempBuffer[Pos--], C % 16);<br>
+      C /= 16;<br>
+    }<br>
+    TempBuffer[Pos--] = 'x';<br>
+    TempBuffer[Pos--] = '\\';<br>
+    assert(Pos >= 0);<br>
+  }<br>
+  OS << StringView(&TempBuffer[Pos + 1]);<br>
+}<br>
+<br>
+static void outputEscapedChar(OutputStream &OS, unsigned C) {<br>
+  switch (C) {<br>
+  case '\'': // single quote<br>
+    OS << "\\\'";<br>
+    return;<br>
+  case '\"': // double quote<br>
+    OS << "\\\"";<br>
+    return;<br>
+  case '\\': // backslash<br>
+    OS << "\\\\";<br>
+    return;<br>
+  case '\a': // bell<br>
+    OS << "\\a";<br>
+    return;<br>
+  case '\b': // backspace<br>
+    OS << "\\b";<br>
+    return;<br>
+  case '\f': // form feed<br>
+    OS << "\\f";<br>
+    return;<br>
+  case '\n': // new line<br>
+    OS << "\\n";<br>
+    return;<br>
+  case '\r': // carriage return<br>
+    OS << "\\r";<br>
+    return;<br>
+  case '\t': // tab<br>
+    OS << "\\t";<br>
+    return;<br>
+  case '\v': // vertical tab<br>
+    OS << "\\v";<br>
+    return;<br>
+  default:<br>
+    break;<br>
+  }<br>
+<br>
+  if (C > 0x1F && C < 0x7F) {<br>
+    // Standard ascii char.<br>
+    OS << (char)C;<br>
+    return;<br>
+  }<br>
+<br>
+  outputHex(OS, C);<br>
+}<br>
+<br>
+unsigned countTrailingNullBytes(const uint8_t *StringBytes, int Length) {<br>
+  const uint8_t *End = StringBytes + Length - 1;<br>
+  while (Length > 0 && *End == 0) {<br>
+    --Length;<br>
+    --End;<br>
+  }<br>
+  return End - StringBytes + 1;<br>
+}<br>
+<br>
+unsigned countEmbeddedNulls(const uint8_t *StringBytes, unsigned Length) {<br>
+  unsigned Result = 0;<br>
+  for (unsigned I = 0; I < Length; ++I) {<br>
+    if (*StringBytes++ == 0)<br>
+      ++Result;<br>
+  }<br>
+  return Result;<br>
+}<br>
+<br>
+unsigned guessCharByteSize(const uint8_t *StringBytes, unsigned NumChars,<br>
+                           unsigned NumBytes) {<br>
+  assert(NumBytes > 0);<br>
+<br>
+  // If the number of bytes is odd, this is guaranteed to be a char string.<br>
+  if (NumBytes % 2 == 1)<br>
+    return 1;<br>
+<br>
+  // All strings can encode at most 32 bytes of data.  If it's less than that,<br>
+  // then we encoded the entire string.  In this case we check for a 1-byte,<br>
+  // 2-byte, or 4-byte null terminator.<br>
+  if (NumBytes < 32) {<br>
+    unsigned TrailingNulls = countTrailingNullBytes(StringBytes, NumChars);<br>
+    if (TrailingNulls >= 4)<br>
+      return 4;<br>
+    if (TrailingNulls >= 2)<br>
+      return 2;<br>
+    return 1;<br>
+  }<br>
+<br>
+  // The whole string was not able to be encoded.  Try to look at embedded null<br>
+  // terminators to guess.  The heuristic is that we count all embedded null<br>
+  // terminators.  If more than 2/3 are null, it's a char32.  If more than 1/3<br>
+  // are null, it's a char16.  Otherwise it's a char8.  This obviously isn't<br>
+  // perfect and is biased towards languages that have ascii alphabets, but this<br>
+  // was always going to be best effort since the encoding is lossy.<br>
+  unsigned Nulls = countEmbeddedNulls(StringBytes, NumChars);<br>
+  if (Nulls >= 2 * NumChars / 3)<br>
+    return 4;<br>
+  if (Nulls >= NumChars / 3)<br>
+    return 2;<br>
+  return 1;<br>
+}<br>
+<br>
+static unsigned decodeMultiByteChar(const uint8_t *StringBytes,<br>
+                                    unsigned CharIndex, unsigned CharBytes) {<br>
+  assert(CharBytes == 1 || CharBytes == 2 || CharBytes == 4);<br>
+  unsigned Offset = CharIndex * CharBytes;<br>
+  unsigned Result = 0;<br>
+  StringBytes = StringBytes + Offset;<br>
+  for (unsigned I = 0; I < CharBytes; ++I) {<br>
+    unsigned C = static_cast<unsigned>(StringBytes[I]);<br>
+    Result |= C << (8 * I);<br>
+  }<br>
+  return Result;<br>
+}<br>
+<br>
+Name *Demangler::demangleStringLiteral(StringView &MangledName) {<br>
+  OutputStream OS;<br>
+  StringView CRC;<br>
+  Name *Result = Arena.alloc<Name>();<br>
+  Result->IsStringLiteral = true;<br>
+<br>
+  // Prefix indicating the beginning of a string literal<br>
+  if (MangledName.empty())<br>
+    goto StringLiteralError;<br>
+<br>
+  // Char Type (regular or wchar_t)<br>
+  bool IsWcharT = false;<br>
+  switch (MangledName.popFront()) {<br>
+  case '1':<br>
+    IsWcharT = true;<br>
+    LLVM_FALLTHROUGH;<br>
+  case '0':<br>
+    break;<br>
+  default:<br>
+    goto StringLiteralError;<br>
+  }<br>
+<br>
+  // Encoded Length<br>
+  uint64_t StringByteSize;<br>
+  bool IsNegative;<br>
+  std::tie(StringByteSize, IsNegative) = demangleNumber(MangledName);<br>
+  if (Error || IsNegative)<br>
+    goto StringLiteralError;<br>
+<br>
+  // CRC 32 (always 8 characters plus a terminator)<br>
+  size_t CrcEndPos = MangledName.find('@');<br>
+  if (CrcEndPos == StringView::npos)<br>
+    goto StringLiteralError;<br>
+  CRC = MangledName.substr(0, CrcEndPos);<br>
+  MangledName = MangledName.dropFront(CrcEndPos + 1);<br>
+  if (MangledName.empty())<br>
+    goto StringLiteralError;<br>
+<br>
+  OS = OutputStream::create(nullptr, nullptr, 1024);<br>
+  if (IsWcharT) {<br>
+    Result->StringLiteralType = PrimTy::Wchar;<br>
+    if (StringByteSize > 64)<br>
+      Result->IsLongStringLiteral = true;<br>
+<br>
+    while (!MangledName.consumeFront('@')) {<br>
+      assert(StringByteSize >= 2);<br>
+      wchar_t W = demangleWcharLiteral(MangledName);<br>
+      if (StringByteSize != 2 || Result->IsLongStringLiteral)<br>
+        outputEscapedChar(OS, W);<br>
+      StringByteSize -= 2;<br>
+      if (Error)<br>
+        goto StringLiteralError;<br>
+    }<br>
+  } else {<br>
+    if (StringByteSize > 32)<br>
+      Result->IsLongStringLiteral = true;<br>
+<br>
+    constexpr unsigned MaxStringByteLength = 32;<br>
+    uint8_t StringBytes[MaxStringByteLength];<br>
+<br>
+    unsigned BytesDecoded = 0;<br>
+    while (!MangledName.consumeFront('@')) {<br>
+      assert(StringByteSize >= 1);<br>
+      StringBytes[BytesDecoded++] = demangleCharLiteral(MangledName);<br>
+    }<br>
+<br>
+    unsigned CharBytes =<br>
+        guessCharByteSize(StringBytes, BytesDecoded, StringByteSize);<br>
+    assert(StringByteSize % CharBytes == 0);<br>
+    switch (CharBytes) {<br>
+    case 1:<br>
+      Result->StringLiteralType = PrimTy::Char;<br>
+      break;<br>
+    case 2:<br>
+      Result->StringLiteralType = PrimTy::Char16;<br>
+      break;<br>
+    case 4:<br>
+      Result->StringLiteralType = PrimTy::Char32;<br>
+      break;<br>
+    default:<br>
+      LLVM_BUILTIN_UNREACHABLE;<br>
+    }<br>
+    const unsigned NumChars = BytesDecoded / CharBytes;<br>
+    for (unsigned CharIndex = 0; CharIndex < NumChars; ++CharIndex) {<br>
+      unsigned NextChar =<br>
+          decodeMultiByteChar(StringBytes, CharIndex, CharBytes);<br>
+      if (CharIndex + 1 < NumChars || Result->IsLongStringLiteral)<br>
+        outputEscapedChar(OS, NextChar);<br>
+    }<br>
+  }<br>
+<br>
+  OS << '\0';<br>
+  char *ResultBuffer = OS.getBuffer();<br>
+  Result->Str = copyString(ResultBuffer);<br>
+  return Result;<br>
+<br>
+StringLiteralError:<br>
+  Error = true;<br>
+  return nullptr;<br>
+}<br>
+<br>
 StringView Demangler::demangleSimpleString(StringView &MangledName,<br>
                                            bool Memorize) {<br>
   StringView S;<br>
@@ -2193,6 +2583,11 @@ void Demangler::output(const Symbol *S,<br>
     outputName(OS, S->SymbolName, S->SymbolType, *this);<br>
     return;<br>
   }<br>
+  if (S->Category == SymbolCategory::StringLiteral) {<br>
+    outputStringLiteral(OS, *S->SymbolName);<br>
+    return;<br>
+  }<br>
+<br>
   // Converts an AST to a string.<br>
   //<br>
   // Converting an AST representing a C++ type to a string is tricky due<br>
<br>
Added: llvm/trunk/test/Demangle/ms-string-literals.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Demangle/ms-string-literals.test?rev=339892&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Demangle/ms-string-literals.test?rev=339892&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Demangle/ms-string-literals.test (added)<br>
+++ llvm/trunk/test/Demangle/ms-string-literals.test Thu Aug 16 09:17:36 2018<br>
@@ -0,0 +1,758 @@<br>
+; RUN: llvm-undname < %s | FileCheck %s<br>
+<br>
+; CHECK-NOT: Invalid mangled name<br>
+<br>
+??_C@_01CNACBAHC@?$PP?$AA@<br>
+??_C@_01DEBJCBDD@?$PO?$AA@<br>
+??_C@_01BPDEHCPA@?$PN?$AA@<br>
+??_C@_01GCPEDLB@?$PM?$AA@<br>
+??_C@_01EJGONFHG@?$PL?$AA@<br>
+??_C@_01FAHFOEDH@?z?$AA@<br>
+??_C@_01HLFILHPE@?y?$AA@<br>
+??_C@_01GCEDIGLF@?x?$AA@<br>
+??_C@_01OFNLJKHK@?w?$AA@<br>
+??_C@_01PMMAKLDL@?v?$AA@<br>
+??_C@_01NHONPIPI@?u?$AA@<br>
+??_C@_01MOPGMJLJ@?t?$AA@<br>
+??_C@_01IBLHFPHO@?s?$AA@<br>
+??_C@_01JIKMGODP@?r?$AA@<br>
+??_C@_01LDIBDNPM@?q?$AA@<br>
+??_C@_01KKJKAMLN@?p?$AA@<br>
+??_C@_01GHMAACCD@?o?$AA@<br>
+??_C@_01HONLDDGC@?n?$AA@<br>
+??_C@_01FFPGGAKB@?m?$AA@<br>
+??_C@_01EMONFBOA@?l?$AA@<br>
+??_C@_01DKMMHCH@?k?$AA@<br>
+??_C@_01BKLHPGGG@?j?$AA@<br>
+??_C@_01DBJKKFKF@?i?$AA@<br>
+??_C@_01CIIBJEOE@?h?$AA@<br>
+??_C@_01KPBJIICL@?g?$AA@<br>
+??_C@_01LGACLJGK@?f?$AA@<br>
+??_C@_01JNCPOKKJ@?e?$AA@<br>
+??_C@_01IEDENLOI@?d?$AA@<br>
+??_C@_01MLHFENCP@?c?$AA@<br>
+??_C@_01NCGOHMGO@?b?$AA@<br>
+??_C@_01PJEDCPKN@?a?$AA@<br>
+??_C@_01OAFIBOOM@?$OA?$AA@<br>
+??_C@_01LIIGDENA@?$NP?$AA@<br>
+??_C@_01KBJNAFJB@?$NO?$AA@<br>
+??_C@_01IKLAFGFC@?$NN?$AA@<br>
+??_C@_01JDKLGHBD@?$NM?$AA@<br>
+??_C@_01NMOKPBNE@?$NL?$AA@<br>
+??_C@_01MFPBMAJF@?Z?$AA@<br>
+??_C@_01OONMJDFG@?Y?$AA@<br>
+??_C@_01PHMHKCBH@?X?$AA@<br>
+??_C@_01HAFPLONI@?W?$AA@<br>
+??_C@_01GJEEIPJJ@?V?$AA@<br>
+??_C@_01ECGJNMFK@?U?$AA@<br>
+??_C@_01FLHCONBL@?T?$AA@<br>
+??_C@_01BEDDHLNM@?S?$AA@<br>
+??_C@_01NCIEKJN@?R?$AA@<br>
+??_C@_01CGAFBJFO@?Q?$AA@<br>
+??_C@_01DPBOCIBP@?P?$AA@<br>
+??_C@_01PCEECGIB@?O?$AA@<br>
+??_C@_01OLFPBHMA@?N?$AA@<br>
+??_C@_01MAHCEEAD@?M?$AA@<br>
+??_C@_01NJGJHFEC@?L?$AA@<br>
+??_C@_01JGCIODIF@?K?$AA@<br>
+??_C@_01IPDDNCME@?J?$AA@<br>
+??_C@_01KEBOIBAH@?I?$AA@<br>
+??_C@_01LNAFLAEG@?H?$AA@<br>
+??_C@_01DKJNKMIJ@?G?$AA@<br>
+??_C@_01CDIGJNMI@?F?$AA@<br>
+??_C@_01IKLMOAL@?E?$AA@<br>
+??_C@_01BBLAPPEK@?D?$AA@<br>
+??_C@_01FOPBGJIN@?C?$AA@<br>
+??_C@_01EHOKFIMM@?B?$AA@<br>
+??_C@_01GMMHALAP@?A?$AA@<br>
+??_C@_01HFNMDKEO@?$MA?$AA@<br>
+??_C@_01NNHLFPHH@?$LP?$AA@<br>
+??_C@_01MEGAGODG@?$LO?$AA@<br>
+??_C@_01OPENDNPF@?$LN?$AA@<br>
+??_C@_01PGFGAMLE@?$LM?$AA@<br>
+??_C@_01LJBHJKHD@?$LL?$AA@<br>
+??_C@_01KAAMKLDC@?$LK?$AA@<br>
+??_C@_01ILCBPIPB@?$LJ?$AA@<br>
+??_C@_01JCDKMJLA@?$LI?$AA@<br>
+??_C@_01BFKCNFHP@?$LH?$AA@<br>
+??_C@_01MLJOEDO@?$LG?$AA@<br>
+??_C@_01CHJELHPN@?$LF?$AA@<br>
+??_C@_01DOIPIGLM@?$LE?$AA@<br>
+??_C@_01HBMOBAHL@?$LD?$AA@<br>
+??_C@_01GINFCBDK@?$LC?$AA@<br>
+??_C@_01EDPIHCPJ@?$LB?$AA@<br>
+??_C@_01FKODEDLI@?$LA?$AA@<br>
+??_C@_01JHLJENCG@?$KP?$AA@<br>
+??_C@_01IOKCHMGH@?$KO?$AA@<br>
+??_C@_01KFIPCPKE@?$KN?$AA@<br>
+??_C@_01LMJEBOOF@?$KM?$AA@<br>
+??_C@_01PDNFIICC@?$KL?$AA@<br>
+??_C@_01OKMOLJGD@?$KK?$AA@<br>
+??_C@_01MBODOKKA@?$KJ?$AA@<br>
+??_C@_01NIPINLOB@?$KI?$AA@<br>
+??_C@_01FPGAMHCO@?$KH?$AA@<br>
+??_C@_01EGHLPGGP@?$KG?$AA@<br>
+??_C@_01GNFGKFKM@?$KF?$AA@<br>
+??_C@_01HEENJEON@?$KE?$AA@<br>
+??_C@_01DLAMACCK@?$KD?$AA@<br>
+??_C@_01CCBHDDGL@?$KC?$AA@<br>
+??_C@_01JDKGAKI@?$KB?$AA@<br>
+??_C@_01BACBFBOJ@?$KA?$AA@<br>
+??_C@_01EIPPHLNF@?$JP?$AA@<br>
+??_C@_01FBOEEKJE@?$JO?$AA@<br>
+??_C@_01HKMJBJFH@?$JN?$AA@<br>
+??_C@_01GDNCCIBG@?$JM?$AA@<br>
+??_C@_01CMJDLONB@?$JL?$AA@<br>
+??_C@_01DFIIIPJA@?$JK?$AA@<br>
+??_C@_01BOKFNMFD@?$JJ?$AA@<br>
+??_C@_01HLOONBC@?$JI?$AA@<br>
+??_C@_01IACGPBNN@?$JH?$AA@<br>
+??_C@_01JJDNMAJM@?$JG?$AA@<br>
+??_C@_01LCBAJDFP@?$JF?$AA@<br>
+??_C@_01KLALKCBO@?$JE?$AA@<br>
+??_C@_01OEEKDENJ@?$JD?$AA@<br>
+??_C@_01PNFBAFJI@?$JC?$AA@<br>
+??_C@_01NGHMFGFL@?$JB?$AA@<br>
+??_C@_01MPGHGHBK@?$JA?$AA@<br>
+??_C@_01CDNGJIE@?$IP?$AA@<br>
+??_C@_01BLCGFIMF@?$IO?$AA@<br>
+??_C@_01DAALALAG@?$IN?$AA@<br>
+??_C@_01CJBADKEH@?$IM?$AA@<br>
+??_C@_01GGFBKMIA@?$IL?$AA@<br>
+??_C@_01HPEKJNMB@?$IK?$AA@<br>
+??_C@_01FEGHMOAC@?$IJ?$AA@<br>
+??_C@_01ENHMPPED@?$II?$AA@<br>
+??_C@_01MKOEODIM@?$IH?$AA@<br>
+??_C@_01NDPPNCMN@?$IG?$AA@<br>
+??_C@_01PINCIBAO@?$IF?$AA@<br>
+??_C@_01OBMJLAEP@?$IE?$AA@<br>
+??_C@_01KOIICGII@?$ID?$AA@<br>
+??_C@_01LHJDBHMJ@?$IC?$AA@<br>
+??_C@_01JMLOEEAK@?$IB?$AA@<br>
+??_C@_01IFKFHFEL@?$IA?$AA@<br>
+??_C@_01BGIBIIDJ@?$HP?$AA@<br>
+??_C@_01PJKLJHI@?$HO?$AA@<br>
+??_C@_01CELHOKLL@?$HN?$AA@<br>
+??_C@_01DNKMNLPK@?$HM?$AA@<br>
+??_C@_01HCONENDN@?$HL?$AA@<br>
+??_C@_01GLPGHMHM@z?$AA@<br>
+??_C@_01EANLCPLP@y?$AA@<br>
+??_C@_01FJMABOPO@x?$AA@<br>
+??_C@_01NOFIACDB@w?$AA@<br>
+??_C@_01MHEDDDHA@v?$AA@<br>
+??_C@_01OMGOGALD@u?$AA@<br>
+??_C@_01PFHFFBPC@t?$AA@<br>
+??_C@_01LKDEMHDF@s?$AA@<br>
+??_C@_01KDCPPGHE@r?$AA@<br>
+??_C@_01IIACKFLH@q?$AA@<br>
+??_C@_01JBBJJEPG@p?$AA@<br>
+??_C@_01FMEDJKGI@o?$AA@<br>
+??_C@_01EFFIKLCJ@n?$AA@<br>
+??_C@_01GOHFPIOK@m?$AA@<br>
+??_C@_01HHGOMJKL@l?$AA@<br>
+??_C@_01DICPFPGM@k?$AA@<br>
+??_C@_01CBDEGOCN@j?$AA@<br>
+??_C@_01KBJDNOO@i?$AA@<br>
+??_C@_01BDACAMKP@h?$AA@<br>
+??_C@_01JEJKBAGA@g?$AA@<br>
+??_C@_01INIBCBCB@f?$AA@<br>
+??_C@_01KGKMHCOC@e?$AA@<br>
+??_C@_01LPLHEDKD@d?$AA@<br>
+??_C@_01PAPGNFGE@c?$AA@<br>
+??_C@_01OJONOECF@b?$AA@<br>
+??_C@_01MCMALHOG@a?$AA@<br>
+??_C@_01NLNLIGKH@?$GA?$AA@<br>
+??_C@_01IDAFKMJL@_?$AA@<br>
+??_C@_01JKBOJNNK@?$FO?$AA@<br>
+??_C@_01LBDDMOBJ@?$FN?$AA@<br>
+??_C@_01KICIPPFI@?2?$AA@<br>
+??_C@_01OHGJGJJP@?$FL?$AA@<br>
+??_C@_01POHCFINO@Z?$AA@<br>
+??_C@_01NFFPALBN@Y?$AA@<br>
+??_C@_01MMEEDKFM@X?$AA@<br>
+??_C@_01ELNMCGJD@W?$AA@<br>
+??_C@_01FCMHBHNC@V?$AA@<br>
+??_C@_01HJOKEEBB@U?$AA@<br>
+??_C@_01GAPBHFFA@T?$AA@<br>
+??_C@_01CPLAODJH@S?$AA@<br>
+??_C@_01DGKLNCNG@R?$AA@<br>
+??_C@_01BNIGIBBF@Q?$AA@<br>
+??_C@_01EJNLAFE@P?$AA@<br>
+??_C@_01MJMHLOMK@O?$AA@<br>
+??_C@_01NANMIPIL@N?$AA@<br>
+??_C@_01PLPBNMEI@M?$AA@<br>
+??_C@_01OCOKONAJ@L?$AA@<br>
+??_C@_01KNKLHLMO@K?$AA@<br>
+??_C@_01LELAEKIP@J?$AA@<br>
+??_C@_01JPJNBJEM@I?$AA@<br>
+??_C@_01IGIGCIAN@H?$AA@<br>
+??_C@_01BBODEMC@G?$AA@<br>
+??_C@_01BIAFAFID@F?$AA@<br>
+??_C@_01DDCIFGEA@E?$AA@<br>
+??_C@_01CKDDGHAB@D?$AA@<br>
+??_C@_01GFHCPBMG@C?$AA@<br>
+??_C@_01HMGJMAIH@B?$AA@<br>
+??_C@_01FHEEJDEE@A?$AA@<br>
+??_C@_01EOFPKCAF@?$EA?$AA@<br>
+??_C@_01OGPIMHDM@?$DP?$AA@<br>
+??_C@_01PPODPGHN@?$DO?$AA@<br>
+??_C@_01NEMOKFLO@?$DN?$AA@<br>
+??_C@_01MNNFJEPP@?$DM?$AA@<br>
+??_C@_01ICJEACDI@?$DL?$AA@<br>
+??_C@_01JLIPDDHJ@?3?$AA@<br>
+??_C@_01LAKCGALK@9?$AA@<br>
+??_C@_01KJLJFBPL@8?$AA@<br>
+??_C@_01COCBENDE@7?$AA@<br>
+??_C@_01DHDKHMHF@6?$AA@<br>
+??_C@_01BMBHCPLG@5?$AA@<br>
+??_C@_01FAMBOPH@4?$AA@<br>
+??_C@_01EKENIIDA@3?$AA@<br>
+??_C@_01FDFGLJHB@2?$AA@<br>
+??_C@_01HIHLOKLC@1?$AA@<br>
+??_C@_01GBGANLPD@0?$AA@<br>
+??_C@_01KMDKNFGN@?1?$AA@<br>
+??_C@_01LFCBOECM@?4?$AA@<br>
+??_C@_01JOAMLHOP@?9?$AA@<br>
+??_C@_01IHBHIGKO@?0?$AA@<br>
+??_C@_01MIFGBAGJ@?$CL?$AA@<br>
+??_C@_01NBENCBCI@?$CK?$AA@<br>
+??_C@_01PKGAHCOL@?$CJ?$AA@<br>
+??_C@_01ODHLEDKK@?$CI?$AA@<br>
+??_C@_01GEODFPGF@?8?$AA@<br>
+??_C@_01HNPIGOCE@?$CG?$AA@<br>
+??_C@_01FGNFDNOH@?$CF?$AA@<br>
+??_C@_01EPMOAMKG@$?$AA@<br>
+??_C@_01IPJKGB@?$CD?$AA@<br>
+??_C@_01BJJEKLCA@?$CC?$AA@<br>
+??_C@_01DCLJPIOD@?$CB?$AA@<br>
+??_C@_01CLKCMJKC@?5?$AA@<br>
+??_C@_01HDHMODJO@?$BP?$AA@<br>
+??_C@_01GKGHNCNP@?$BO?$AA@<br>
+??_C@_01EBEKIBBM@?$BN?$AA@<br>
+??_C@_01FIFBLAFN@?$BM?$AA@<br>
+??_C@_01BHBACGJK@?$BL?$AA@<br>
+??_C@_01OALBHNL@?$BK?$AA@<br>
+??_C@_01CFCGEEBI@?$BJ?$AA@<br>
+??_C@_01DMDNHFFJ@?$BI?$AA@<br>
+??_C@_01LLKFGJJG@?$BH?$AA@<br>
+??_C@_01KCLOFINH@?$BG?$AA@<br>
+??_C@_01IJJDALBE@?$BF?$AA@<br>
+??_C@_01JAIIDKFF@?$BE?$AA@<br>
+??_C@_01NPMJKMJC@?$BD?$AA@<br>
+??_C@_01MGNCJNND@?$BC?$AA@<br>
+??_C@_01ONPPMOBA@?$BB?$AA@<br>
+??_C@_01PEOEPPFB@?$BA?$AA@<br>
+??_C@_01DJLOPBMP@?$AP?$AA@<br>
+??_C@_01CAKFMAIO@?$AO?$AA@<br>
+??_C@_01LIIJDEN@?$AN?$AA@<br>
+??_C@_01BCJDKCAM@?$AM?$AA@<br>
+??_C@_01FNNCDEML@?$AL?$AA@<br>
+??_C@_01EEMJAFIK@?6?$AA@<br>
+??_C@_01GPOEFGEJ@?7?$AA@<br>
+??_C@_01HGPPGHAI@?$AI?$AA@<br>
+??_C@_01PBGHHLMH@?$AH?$AA@<br>
+??_C@_01OIHMEKIG@?$AG?$AA@<br>
+??_C@_01MDFBBJEF@?$AF?$AA@<br>
+??_C@_01NKEKCIAE@?$AE?$AA@<br>
+??_C@_01JFALLOMD@?$AD?$AA@<br>
+??_C@_01IMBAIPIC@?$AC?$AA@<br>
+??_C@_01KHDNNMEB@?$AB?$AA@<br>
+??_C@_01LOCGONAA@?$AA?$AA@<br>
+<br>
+; CHECK: const char * {"\xFF"}<br>
+; CHECK: const char * {"\xFE"}<br>
+; CHECK: const char * {"\xFD"}<br>
+; CHECK: const char * {"\xFC"}<br>
+; CHECK: const char * {"\xFB"}<br>
+; CHECK: const char * {"\xFA"}<br>
+; CHECK: const char * {"\xF9"}<br>
+; CHECK: const char * {"\xF8"}<br>
+; CHECK: const char * {"\xF7"}<br>
+; CHECK: const char * {"\xF6"}<br>
+; CHECK: const char * {"\xF5"}<br>
+; CHECK: const char * {"\xF4"}<br>
+; CHECK: const char * {"\xF3"}<br>
+; CHECK: const char * {"\xF2"}<br>
+; CHECK: const char * {"\xF1"}<br>
+; CHECK: const char * {"\xF0"}<br>
+; CHECK: const char * {"\xEF"}<br>
+; CHECK: const char * {"\xEE"}<br>
+; CHECK: const char * {"\xED"}<br>
+; CHECK: const char * {"\xEC"}<br>
+; CHECK: const char * {"\xEB"}<br>
+; CHECK: const char * {"\xEA"}<br>
+; CHECK: const char * {"\xE9"}<br>
+; CHECK: const char * {"\xE8"}<br>
+; CHECK: const char * {"\xE7"}<br>
+; CHECK: const char * {"\xE6"}<br>
+; CHECK: const char * {"\xE5"}<br>
+; CHECK: const char * {"\xE4"}<br>
+; CHECK: const char * {"\xE3"}<br>
+; CHECK: const char * {"\xE2"}<br>
+; CHECK: const char * {"\xE1"}<br>
+; CHECK: const char * {"\xE0"}<br>
+; CHECK: const char * {"\xDF"}<br>
+; CHECK: const char * {"\xDE"}<br>
+; CHECK: const char * {"\xDD"}<br>
+; CHECK: const char * {"\xDC"}<br>
+; CHECK: const char * {"\xDB"}<br>
+; CHECK: const char * {"\xDA"}<br>
+; CHECK: const char * {"\xD9"}<br>
+; CHECK: const char * {"\xD8"}<br>
+; CHECK: const char * {"\xD7"}<br>
+; CHECK: const char * {"\xD6"}<br>
+; CHECK: const char * {"\xD5"}<br>
+; CHECK: const char * {"\xD4"}<br>
+; CHECK: const char * {"\xD3"}<br>
+; CHECK: const char * {"\xD2"}<br>
+; CHECK: const char * {"\xD1"}<br>
+; CHECK: const char * {"\xD0"}<br>
+; CHECK: const char * {"\xCF"}<br>
+; CHECK: const char * {"\xCE"}<br>
+; CHECK: const char * {"\xCD"}<br>
+; CHECK: const char * {"\xCC"}<br>
+; CHECK: const char * {"\xCB"}<br>
+; CHECK: const char * {"\xCA"}<br>
+; CHECK: const char * {"\xC9"}<br>
+; CHECK: const char * {"\xC8"}<br>
+; CHECK: const char * {"\xC7"}<br>
+; CHECK: const char * {"\xC6"}<br>
+; CHECK: const char * {"\xC5"}<br>
+; CHECK: const char * {"\xC4"}<br>
+; CHECK: const char * {"\xC3"}<br>
+; CHECK: const char * {"\xC2"}<br>
+; CHECK: const char * {"\xC1"}<br>
+; CHECK: const char * {"\xC0"}<br>
+; CHECK: const char * {"\xBF"}<br>
+; CHECK: const char * {"\xBE"}<br>
+; CHECK: const char * {"\xBD"}<br>
+; CHECK: const char * {"\xBC"}<br>
+; CHECK: const char * {"\xBB"}<br>
+; CHECK: const char * {"\xBA"}<br>
+; CHECK: const char * {"\xB9"}<br>
+; CHECK: const char * {"\xB8"}<br>
+; CHECK: const char * {"\xB7"}<br>
+; CHECK: const char * {"\xB6"}<br>
+; CHECK: const char * {"\xB5"}<br>
+; CHECK: const char * {"\xB4"}<br>
+; CHECK: const char * {"\xB3"}<br>
+; CHECK: const char * {"\xB2"}<br>
+; CHECK: const char * {"\xB1"}<br>
+; CHECK: const char * {"\xB0"}<br>
+; CHECK: const char * {"\xAF"}<br>
+; CHECK: const char * {"\xAE"}<br>
+; CHECK: const char * {"\xAD"}<br>
+; CHECK: const char * {"\xAC"}<br>
+; CHECK: const char * {"\xAB"}<br>
+; CHECK: const char * {"\xAA"}<br>
+; CHECK: const char * {"\xA9"}<br>
+; CHECK: const char * {"\xA8"}<br>
+; CHECK: const char * {"\xA7"}<br>
+; CHECK: const char * {"\xA6"}<br>
+; CHECK: const char * {"\xA5"}<br>
+; CHECK: const char * {"\xA4"}<br>
+; CHECK: const char * {"\xA3"}<br>
+; CHECK: const char * {"\xA2"}<br>
+; CHECK: const char * {"\xA1"}<br>
+; CHECK: const char * {"\xA0"}<br>
+; CHECK: const char * {"\x9F"}<br>
+; CHECK: const char * {"\x9E"}<br>
+; CHECK: const char * {"\x9D"}<br>
+; CHECK: const char * {"\x9C"}<br>
+; CHECK: const char * {"\x9B"}<br>
+; CHECK: const char * {"\x9A"}<br>
+; CHECK: const char * {"\x99"}<br>
+; CHECK: const char * {"\x98"}<br>
+; CHECK: const char * {"\x97"}<br>
+; CHECK: const char * {"\x96"}<br>
+; CHECK: const char * {"\x95"}<br>
+; CHECK: const char * {"\x94"}<br>
+; CHECK: const char * {"\x93"}<br>
+; CHECK: const char * {"\x92"}<br>
+; CHECK: const char * {"\x91"}<br>
+; CHECK: const char * {"\x90"}<br>
+; CHECK: const char * {"\x8F"}<br>
+; CHECK: const char * {"\x8E"}<br>
+; CHECK: const char * {"\x8D"}<br>
+; CHECK: const char * {"\x8C"}<br>
+; CHECK: const char * {"\x8B"}<br>
+; CHECK: const char * {"\x8A"}<br>
+; CHECK: const char * {"\x89"}<br>
+; CHECK: const char * {"\x88"}<br>
+; CHECK: const char * {"\x87"}<br>
+; CHECK: const char * {"\x86"}<br>
+; CHECK: const char * {"\x85"}<br>
+; CHECK: const char * {"\x84"}<br>
+; CHECK: const char * {"\x83"}<br>
+; CHECK: const char * {"\x82"}<br>
+; CHECK: const char * {"\x81"}<br>
+; CHECK: const char * {"\x80"}<br>
+; CHECK: const char * {"\x7F"}<br>
+; CHECK: const char * {"~"}<br>
+; CHECK: const char * {"}"}<br>
+; CHECK: const char * {"|"}<br>
+; CHECK: const char * {"{"}<br>
+; CHECK: const char * {"z"}<br>
+; CHECK: const char * {"y"}<br>
+; CHECK: const char * {"x"}<br>
+; CHECK: const char * {"w"}<br>
+; CHECK: const char * {"v"}<br>
+; CHECK: const char * {"u"}<br>
+; CHECK: const char * {"t"}<br>
+; CHECK: const char * {"s"}<br>
+; CHECK: const char * {"r"}<br>
+; CHECK: const char * {"q"}<br>
+; CHECK: const char * {"p"}<br>
+; CHECK: const char * {"o"}<br>
+; CHECK: const char * {"n"}<br>
+; CHECK: const char * {"m"}<br>
+; CHECK: const char * {"l"}<br>
+; CHECK: const char * {"k"}<br>
+; CHECK: const char * {"j"}<br>
+; CHECK: const char * {"i"}<br>
+; CHECK: const char * {"h"}<br>
+; CHECK: const char * {"g"}<br>
+; CHECK: const char * {"f"}<br>
+; CHECK: const char * {"e"}<br>
+; CHECK: const char * {"d"}<br>
+; CHECK: const char * {"c"}<br>
+; CHECK: const char * {"b"}<br>
+; CHECK: const char * {"a"}<br>
+; CHECK: const char * {"`"}<br>
+; CHECK: const char * {"_"}<br>
+; CHECK: const char * {"^"}<br>
+; CHECK: const char * {"]"}<br>
+; CHECK: const char * {"\\"}<br>
+; CHECK: const char * {"["}<br>
+; CHECK: const char * {"Z"}<br>
+; CHECK: const char * {"Y"}<br>
+; CHECK: const char * {"X"}<br>
+; CHECK: const char * {"W"}<br>
+; CHECK: const char * {"V"}<br>
+; CHECK: const char * {"U"}<br>
+; CHECK: const char * {"T"}<br>
+; CHECK: const char * {"S"}<br>
+; CHECK: const char * {"R"}<br>
+; CHECK: const char * {"Q"}<br>
+; CHECK: const char * {"P"}<br>
+; CHECK: const char * {"O"}<br>
+; CHECK: const char * {"N"}<br>
+; CHECK: const char * {"M"}<br>
+; CHECK: const char * {"L"}<br>
+; CHECK: const char * {"K"}<br>
+; CHECK: const char * {"J"}<br>
+; CHECK: const char * {"I"}<br>
+; CHECK: const char * {"H"}<br>
+; CHECK: const char * {"G"}<br>
+; CHECK: const char * {"F"}<br>
+; CHECK: const char * {"E"}<br>
+; CHECK: const char * {"D"}<br>
+; CHECK: const char * {"C"}<br>
+; CHECK: const char * {"B"}<br>
+; CHECK: const char * {"A"}<br>
+; CHECK: const char * {"@"}<br>
+; CHECK: const char * {"?"}<br>
+; CHECK: const char * {">"}<br>
+; CHECK: const char * {"="}<br>
+; CHECK: const char * {"<"}<br>
+; CHECK: const char * {";"}<br>
+; CHECK: const char * {":"}<br>
+; CHECK: const char * {"9"}<br>
+; CHECK: const char * {"8"}<br>
+; CHECK: const char * {"7"}<br>
+; CHECK: const char * {"6"}<br>
+; CHECK: const char * {"5"}<br>
+; CHECK: const char * {"4"}<br>
+; CHECK: const char * {"3"}<br>
+; CHECK: const char * {"2"}<br>
+; CHECK: const char * {"1"}<br>
+; CHECK: const char * {"0"}<br>
+; CHECK: const char * {"/"}<br>
+; CHECK: const char * {"."}<br>
+; CHECK: const char * {"-"}<br>
+; CHECK: const char * {","}<br>
+; CHECK: const char * {"+"}<br>
+; CHECK: const char * {"*"}<br>
+; CHECK: const char * {")"}<br>
+; CHECK: const char * {"("}<br>
+; CHECK: const char * {"\'"}<br>
+; CHECK: const char * {"&"}<br>
+; CHECK: const char * {"%"}<br>
+; CHECK: const char * {"$"}<br>
+; CHECK: const char * {"#"}<br>
+; CHECK: const char * {"\""}<br>
+; CHECK: const char * {"!"}<br>
+; CHECK: const char * {" "}<br>
+; CHECK: const char * {"\x1F"}<br>
+; CHECK: const char * {"\x1E"}<br>
+; CHECK: const char * {"\x1D"}<br>
+; CHECK: const char * {"\x1C"}<br>
+; CHECK: const char * {"\x1B"}<br>
+; CHECK: const char * {"\x1A"}<br>
+; CHECK: const char * {"\x19"}<br>
+; CHECK: const char * {"\x18"}<br>
+; CHECK: const char * {"\x17"}<br>
+; CHECK: const char * {"\x16"}<br>
+; CHECK: const char * {"\x15"}<br>
+; CHECK: const char * {"\x14"}<br>
+; CHECK: const char * {"\x13"}<br>
+; CHECK: const char * {"\x12"}<br>
+; CHECK: const char * {"\x11"}<br>
+; CHECK: const char * {"\x10"}<br>
+; CHECK: const char * {"\x0F"}<br>
+; CHECK: const char * {"\x0E"}<br>
+; CHECK: const char * {"\r"}<br>
+; CHECK: const char * {"\f"}<br>
+; CHECK: const char * {"\v"}<br>
+; CHECK: const char * {"\n"}<br>
+; CHECK: const char * {"\t"}<br>
+; CHECK: const char * {"\b"}<br>
+; CHECK: const char * {"\a"}<br>
+; CHECK: const char * {"\x06"}<br>
+; CHECK: const char * {"\x05"}<br>
+; CHECK: const char * {"\x04"}<br>
+; CHECK: const char * {"\x03"}<br>
+; CHECK: const char * {"\x02"}<br>
+; CHECK: const char * {"\x01"}<br>
+; CHECK: const char * {"\x00"}<br>
+<br>
+<br>
+??_C@_13KDLDGPGJ@?$AA?7?$AA?$AA@<br>
+??_C@_13LBAGMAIH@?$AA?6?$AA?$AA@<br>
+??_C@_13JLKKHOC@?$AA?$AL?$AA?$AA@<br>
+??_C@_13HOIJIPNN@?$AA?5?$AA?$AA@<br>
+??_C@_13MGDFOILI@?$AA?$CB?$AA?$AA@<br>
+??_C@_13NEIAEHFG@?$AA?$CC?$AA?$AA@<br>
+??_C@_13GMDMCADD@?$AA?$CD?$AA?$AA@<br>
+??_C@_13PBOLBIIK@?$AA$?$AA?$AA@<br>
+??_C@_13EJFHHPOP@?$AA?$CF?$AA?$AA@<br>
+??_C@_13FLOCNAAB@?$AA?$CG?$AA?$AA@<br>
+??_C@_13ODFOLHGE@?$AA?8?$AA?$AA@<br>
+??_C@_13LLDNKHDC@?$AA?$CI?$AA?$AA@<br>
+??_C@_13DIBMAFH@?$AA?$CJ?$AA?$AA@<br>
+??_C@_13BBDEGPLJ@?$AA?$CK?$AA?$AA@<br>
+??_C@_13KJIIAINM@?$AA?$CL?$AA?$AA@<br>
+??_C@_13DEFPDAGF@?$AA?0?$AA?$AA@<br>
+??_C@_13IMODFHAA@?$AA?9?$AA?$AA@<br>
+??_C@_13JOFGPIOO@?$AA?4?$AA?$AA@<br>
+??_C@_13CGOKJPIL@?$AA?1?$AA?$AA@<br>
+??_C@_13COJANIEC@?$AA0?$AA?$AA@<br>
+??_C@_13JGCMLPCH@?$AA1?$AA?$AA@<br>
+??_C@_13IEJJBAMJ@?$AA2?$AA?$AA@<br>
+??_C@_13DMCFHHKM@?$AA3?$AA?$AA@<br>
+??_C@_13KBPCEPBF@?$AA4?$AA?$AA@<br>
+??_C@_13BJEOCIHA@?$AA5?$AA?$AA@<br>
+??_C@_13LPLIHJO@?$AA6?$AA?$AA@<br>
+??_C@_13LDEHOAPL@?$AA7?$AA?$AA@<br>
+??_C@_13OLCEPAKN@?$AA8?$AA?$AA@<br>
+??_C@_13FDJIJHMI@?$AA9?$AA?$AA@<br>
+??_C@_13EBCNDICG@?$AA?3?$AA?$AA@<br>
+??_C@_13PJJBFPED@?$AA?$DL?$AA?$AA@<br>
+??_C@_13GEEGGHPK@?$AA?$DM?$AA?$AA@<br>
+??_C@_13NMPKAAJP@?$AA?$DN?$AA?$AA@<br>
+??_C@_13MOEPKPHB@?$AA?$DO?$AA?$AA@<br>
+??_C@_13HGPDMIBE@?$AA?$DP?$AA?$AA@<br>
+??_C@_13EFKPHINO@?$AA?$EA?$AA?$AA@<br>
+??_C@_13PNBDBPLL@?$AAA?$AA?$AA@<br>
+??_C@_13OPKGLAFF@?$AAB?$AA?$AA@<br>
+??_C@_13FHBKNHDA@?$AAC?$AA?$AA@<br>
+??_C@_13MKMNOPIJ@?$AAD?$AA?$AA@<br>
+??_C@_13HCHBIIOM@?$AAE?$AA?$AA@<br>
+??_C@_13GAMECHAC@?$AAF?$AA?$AA@<br>
+??_C@_13NIHIEAGH@?$AAG?$AA?$AA@<br>
+??_C@_13IABLFADB@?$AAH?$AA?$AA@<br>
+??_C@_13DIKHDHFE@?$AAI?$AA?$AA@<br>
+??_C@_13CKBCJILK@?$AAJ?$AA?$AA@<br>
+??_C@_13JCKOPPNP@?$AAK?$AA?$AA@<br>
+??_C@_13PHJMHGG@?$AAL?$AA?$AA@<br>
+??_C@_13LHMFKAAD@?$AAM?$AA?$AA@<br>
+??_C@_13KFHAAPON@?$AAN?$AA?$AA@<br>
+??_C@_13BNMMGIII@?$AAO?$AA?$AA@<br>
+??_C@_13BFLGCPEB@?$AAP?$AA?$AA@<br>
+??_C@_13KNAKEICE@?$AAQ?$AA?$AA@<br>
+??_C@_13LPLPOHMK@?$AAR?$AA?$AA@<br>
+??_C@_13HADIAKP@?$AAS?$AA?$AA@<br>
+??_C@_13JKNELIBG@?$AAT?$AA?$AA@<br>
+??_C@_13CCGINPHD@?$AAU?$AA?$AA@<br>
+??_C@_13DANNHAJN@?$AAV?$AA?$AA@<br>
+??_C@_13IIGBBHPI@?$AAW?$AA?$AA@<br>
+??_C@_13NAACAHKO@?$AAX?$AA?$AA@<br>
+??_C@_13GILOGAML@?$AAY?$AA?$AA@<br>
+??_C@_13HKALMPCF@?$AAZ?$AA?$AA@<br>
+??_C@_13MCLHKIEA@?$AA?$FL?$AA?$AA@<br>
+??_C@_13FPGAJAPJ@?$AA?2?$AA?$AA@<br>
+??_C@_13OHNMPHJM@?$AA?$FN?$AA?$AA@<br>
+??_C@_13PFGJFIHC@?$AA?$FO?$AA?$AA@<br>
+??_C@_13ENNFDPBH@?$AA_?$AA?$AA@<br>
+??_C@_13OFJNNHOA@?$AA?$GA?$AA?$AA@<br>
+??_C@_13FNCBLAIF@?$AAa?$AA?$AA@<br>
+??_C@_13EPJEBPGL@?$AAb?$AA?$AA@<br>
+??_C@_13PHCIHIAO@?$AAc?$AA?$AA@<br>
+??_C@_13GKPPEALH@?$AAd?$AA?$AA@<br>
+??_C@_13NCEDCHNC@?$AAe?$AA?$AA@<br>
+??_C@_13MAPGIIDM@?$AAf?$AA?$AA@<br>
+??_C@_13HIEKOPFJ@?$AAg?$AA?$AA@<br>
+??_C@_13CACJPPAP@?$AAh?$AA?$AA@<br>
+??_C@_13JIJFJIGK@?$AAi?$AA?$AA@<br>
+??_C@_13IKCADHIE@?$AAj?$AA?$AA@<br>
+??_C@_13DCJMFAOB@?$AAk?$AA?$AA@<br>
+??_C@_13KPELGIFI@?$AAl?$AA?$AA@<br>
+??_C@_13BHPHAPDN@?$AAm?$AA?$AA@<br>
+??_C@_13FECKAND@?$AAn?$AA?$AA@<br>
+??_C@_13LNPOMHLG@?$AAo?$AA?$AA@<br>
+??_C@_13LFIEIAHP@?$AAp?$AA?$AA@<br>
+??_C@_13NDIOHBK@?$AAq?$AA?$AA@<br>
+??_C@_13BPINEIPE@?$AAr?$AA?$AA@<br>
+??_C@_13KHDBCPJB@?$AAs?$AA?$AA@<br>
+??_C@_13DKOGBHCI@?$AAt?$AA?$AA@<br>
+??_C@_13ICFKHAEN@?$AAu?$AA?$AA@<br>
+??_C@_13JAOPNPKD@?$AAv?$AA?$AA@<br>
+??_C@_13CIFDLIMG@?$AAw?$AA?$AA@<br>
+??_C@_13HADAKIJA@?$AAx?$AA?$AA@<br>
+??_C@_13MIIMMPPF@?$AAy?$AA?$AA@<br>
+??_C@_13NKDJGABL@?$AAz?$AA?$AA@<br>
+??_C@_13GCIFAHHO@?$AA?$HL?$AA?$AA@<br>
+??_C@_13PPFCDPMH@?$AA?$HM?$AA?$AA@<br>
+??_C@_13EHOOFIKC@?$AA?$HN?$AA?$AA@<br>
+??_C@_13FFFLPHEM@?$AA?$HO?$AA?$AA@<br>
+<br>
+; CHECK: const wchar_t * {L"\t"}<br>
+; CHECK: const wchar_t * {L"\n"}<br>
+; CHECK: const wchar_t * {L"\v"}<br>
+; CHECK: const wchar_t * {L" "}<br>
+; CHECK: const wchar_t * {L"!"}<br>
+; CHECK: const wchar_t * {L"\""}<br>
+; CHECK: const wchar_t * {L"#"}<br>
+; CHECK: const wchar_t * {L"$"}<br>
+; CHECK: const wchar_t * {L"%"}<br>
+; CHECK: const wchar_t * {L"&"}<br>
+; CHECK: const wchar_t * {L"\'"}<br>
+; CHECK: const wchar_t * {L"("}<br>
+; CHECK: const wchar_t * {L")"}<br>
+; CHECK: const wchar_t * {L"*"}<br>
+; CHECK: const wchar_t * {L"+"}<br>
+; CHECK: const wchar_t * {L","}<br>
+; CHECK: const wchar_t * {L"-"}<br>
+; CHECK: const wchar_t * {L"."}<br>
+; CHECK: const wchar_t * {L"/"}<br>
+; CHECK: const wchar_t * {L"0"}<br>
+; CHECK: const wchar_t * {L"1"}<br>
+; CHECK: const wchar_t * {L"2"}<br>
+; CHECK: const wchar_t * {L"3"}<br>
+; CHECK: const wchar_t * {L"4"}<br>
+; CHECK: const wchar_t * {L"5"}<br>
+; CHECK: const wchar_t * {L"6"}<br>
+; CHECK: const wchar_t * {L"7"}<br>
+; CHECK: const wchar_t * {L"8"}<br>
+; CHECK: const wchar_t * {L"9"}<br>
+; CHECK: const wchar_t * {L":"}<br>
+; CHECK: const wchar_t * {L";"}<br>
+; CHECK: const wchar_t * {L"<"}<br>
+; CHECK: const wchar_t * {L"="}<br>
+; CHECK: const wchar_t * {L">"}<br>
+; CHECK: const wchar_t * {L"?"}<br>
+; CHECK: const wchar_t * {L"@"}<br>
+; CHECK: const wchar_t * {L"A"}<br>
+; CHECK: const wchar_t * {L"B"}<br>
+; CHECK: const wchar_t * {L"C"}<br>
+; CHECK: const wchar_t * {L"D"}<br>
+; CHECK: const wchar_t * {L"E"}<br>
+; CHECK: const wchar_t * {L"F"}<br>
+; CHECK: const wchar_t * {L"G"}<br>
+; CHECK: const wchar_t * {L"H"}<br>
+; CHECK: const wchar_t * {L"I"}<br>
+; CHECK: const wchar_t * {L"J"}<br>
+; CHECK: const wchar_t * {L"K"}<br>
+; CHECK: const wchar_t * {L"L"}<br>
+; CHECK: const wchar_t * {L"M"}<br>
+; CHECK: const wchar_t * {L"N"}<br>
+; CHECK: const wchar_t * {L"O"}<br>
+; CHECK: const wchar_t * {L"P"}<br>
+; CHECK: const wchar_t * {L"Q"}<br>
+; CHECK: const wchar_t * {L"R"}<br>
+; CHECK: const wchar_t * {L"S"}<br>
+; CHECK: const wchar_t * {L"T"}<br>
+; CHECK: const wchar_t * {L"U"}<br>
+; CHECK: const wchar_t * {L"V"}<br>
+; CHECK: const wchar_t * {L"W"}<br>
+; CHECK: const wchar_t * {L"X"}<br>
+; CHECK: const wchar_t * {L"Y"}<br>
+; CHECK: const wchar_t * {L"Z"}<br>
+; CHECK: const wchar_t * {L"["}<br>
+; CHECK: const wchar_t * {L"\\"}<br>
+; CHECK: const wchar_t * {L"]"}<br>
+; CHECK: const wchar_t * {L"^"}<br>
+; CHECK: const wchar_t * {L"_"}<br>
+; CHECK: const wchar_t * {L"`"}<br>
+; CHECK: const wchar_t * {L"a"}<br>
+; CHECK: const wchar_t * {L"b"}<br>
+; CHECK: const wchar_t * {L"c"}<br>
+; CHECK: const wchar_t * {L"d"}<br>
+; CHECK: const wchar_t * {L"e"}<br>
+; CHECK: const wchar_t * {L"f"}<br>
+; CHECK: const wchar_t * {L"g"}<br>
+; CHECK: const wchar_t * {L"h"}<br>
+; CHECK: const wchar_t * {L"i"}<br>
+; CHECK: const wchar_t * {L"j"}<br>
+; CHECK: const wchar_t * {L"k"}<br>
+; CHECK: const wchar_t * {L"l"}<br>
+; CHECK: const wchar_t * {L"m"}<br>
+; CHECK: const wchar_t * {L"n"}<br>
+; CHECK: const wchar_t * {L"o"}<br>
+; CHECK: const wchar_t * {L"p"}<br>
+; CHECK: const wchar_t * {L"q"}<br>
+; CHECK: const wchar_t * {L"r"}<br>
+; CHECK: const wchar_t * {L"s"}<br>
+; CHECK: const wchar_t * {L"t"}<br>
+; CHECK: const wchar_t * {L"u"}<br>
+; CHECK: const wchar_t * {L"v"}<br>
+; CHECK: const wchar_t * {L"w"}<br>
+; CHECK: const wchar_t * {L"x"}<br>
+; CHECK: const wchar_t * {L"y"}<br>
+; CHECK: const wchar_t * {L"z"}<br>
+; CHECK: const wchar_t * {L"{"}<br>
+; CHECK: const wchar_t * {L"|"}<br>
+; CHECK: const wchar_t * {L"}"}<br>
+; CHECK: const wchar_t * {L"~"}<br>
+<br>
+<br>
+<br>
+??_C@_0CF@LABBIIMO@012345678901234567890123456789AB@<br>
+; CHECK: const char * {"012345678901234567890123456789AB"...}<br>
+<br>
+??_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@<br>
+; CHECK: const wchar_t * {L"012345678901234567890123456789AB"...}<br>
+<br>
+??_C@_13IIHIAFKH@?W?$PP?$AA?$AA@<br>
+; CHECK: const wchar_t * {L"\xD7\xFF"}<br>
+<br>
+??_C@_02PCEFGMJL@hi?$AA@<br>
+; CHECK: const char * {"hi"}<br>
+<br>
+??_C@_05OMLEGLOC@h?$AAi?$AA?$AA?$AA@<br>
+; CHECK: const char16_t * {u"hi"}<br>
+<br>
+??_C@_0EK@FEAOBHPP@o?$AA1?$AA2?$AA3?$AA4?$AA5?$AA6?$AA7?$AA8?$AA9?$AA0?$AA1?$AA2?$AA3?$AA4?$AA5?$AA@<br>
+; CHECK: const char16_t * {u"o123456789012345"...}<br>
+<br>
+??_C@_0M@GFNAJIPG@h?$AA?$AA?$AAi?$AA?$AA?$AA?$AA?$AA?$AA?$AA@<br>
+; CHECK: const char32_t * {U"hi"}<br>
+<br>
+??_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@<br>
+; CHECK: const char32_t * {U"01234567"...}<br>
+<br>
+; These all have just the right length that the trailing 0 just fits.<br>
+??_C@_0CA@NMANGEKF@012345678901234567890123456789A?$AA@<br>
+; CHECK: const char * {"012345678901234567890123456789A"}<br>
+<br>
+??_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@<br>
+; CHECK: const wchar_t * {L"012345678901234567890123456789A"}<br>
+<br>
+??_C@_0CA@NMANGEKF@012345678901234567890123456789A?$AA@<br>
+; CHECK: const char * {"012345678901234567890123456789A"}<br>
+<br>
+??_C@_0CA@NFEFHIFO@0?$AA1?$AA2?$AA3?$AA4?$AA5?$AA6?$AA7?$AA8?$AA9?$AA0?$AA1?$AA2?$AA3?$AA4?$AA?$AA?$AA@<br>
+; CHECK: const char16_t * {u"012345678901234"}<br>
+<br>
+??_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@<br>
+; CHECK: const char32_t * {U"0123456"}<br>
\ No newline at end of file<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>