r204675 - MS ABI: Eliminate Duplicate Strings

David Majnemer david.majnemer at gmail.com
Mon Mar 24 14:43:37 PDT 2014


Author: majnemer
Date: Mon Mar 24 16:43:36 2014
New Revision: 204675

URL: http://llvm.org/viewvc/llvm-project?rev=204675&view=rev
Log:
MS ABI: Eliminate Duplicate Strings

COFF doesn't have mergeable sections so LLVM/clang's normal tactics for
string deduplication will not have any effect.

To remedy this we place each string inside it's own section and mark
the section as IMAGE_COMDAT_SELECT_ANY.  However, we can only do this if the
string has an external name that we can generate from it's contents.

To be compatible with MSVC, we must use their scheme.  Otherwise identical
strings in translation units from clang may not be deduplicated with
translation units in MSVC.

This fixes PR18248.

N.B. We will not attempt to do anything with a string literal which is not of
type 'char' or 'wchar_t' because their compiler does not support unicode
string literals as of this date.  Further, we avoid doing this if
either -fwritable-strings or -fsanitize=address are present.

This reverts commit r204596.

Added:
    cfe/trunk/test/CodeGenCXX/mangle-ms-string-literals.cpp
Modified:
    cfe/trunk/include/clang/AST/Mangle.h
    cfe/trunk/lib/AST/ItaniumMangle.cpp
    cfe/trunk/lib/AST/MicrosoftMangle.cpp
    cfe/trunk/lib/CodeGen/CodeGenModule.cpp
    cfe/trunk/lib/CodeGen/CodeGenModule.h
    cfe/trunk/test/CodeGen/c-strings.c
    cfe/trunk/test/CodeGen/string-literal-short-wstring.c
    cfe/trunk/test/CodeGen/wchar-const.c

Modified: cfe/trunk/include/clang/AST/Mangle.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Mangle.h?rev=204675&r1=204674&r2=204675&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Mangle.h (original)
+++ cfe/trunk/include/clang/AST/Mangle.h Mon Mar 24 16:43:36 2014
@@ -31,9 +31,10 @@ namespace clang {
   class FunctionDecl;
   class NamedDecl;
   class ObjCMethodDecl;
-  class VarDecl;
+  class StringLiteral;
   struct ThisAdjustment;
   struct ThunkInfo;
+  class VarDecl;
 
 /// MangleBuffer - a convenient class for storing a name which is
 /// either the result of a mangling or is a constant string with
@@ -117,6 +118,7 @@ public:
 
   bool shouldMangleDeclName(const NamedDecl *D);
   virtual bool shouldMangleCXXName(const NamedDecl *D) = 0;
+  virtual bool shouldMangleStringLiteral(const StringLiteral *SL) = 0;
 
   // FIXME: consider replacing raw_ostream & with something like SmallString &.
   void mangleName(const NamedDecl *D, raw_ostream &);
@@ -135,6 +137,7 @@ public:
                              raw_ostream &) = 0;
   virtual void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type,
                              raw_ostream &) = 0;
+  virtual void mangleStringLiteral(const StringLiteral *SL, raw_ostream &) = 0;
 
   void mangleGlobalBlock(const BlockDecl *BD,
                          const NamedDecl *ID,

Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=204675&r1=204674&r2=204675&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ItaniumMangle.cpp (original)
+++ cfe/trunk/lib/AST/ItaniumMangle.cpp Mon Mar 24 16:43:36 2014
@@ -21,6 +21,7 @@
 #include "clang/AST/DeclCXX.h"
 #include "clang/AST/DeclObjC.h"
 #include "clang/AST/DeclTemplate.h"
+#include "clang/AST/Expr.h"
 #include "clang/AST/ExprCXX.h"
 #include "clang/AST/ExprObjC.h"
 #include "clang/AST/TypeLoc.h"
@@ -126,6 +127,9 @@ public:
   /// @{
 
   bool shouldMangleCXXName(const NamedDecl *D) override;
+  bool shouldMangleStringLiteral(const StringLiteral *) override {
+    return false;
+  }
   void mangleCXXName(const NamedDecl *D, raw_ostream &) override;
   void mangleThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk,
                    raw_ostream &) override;
@@ -153,6 +157,8 @@ public:
   void mangleItaniumThreadLocalWrapper(const VarDecl *D,
                                        raw_ostream &) override;
 
+  void mangleStringLiteral(const StringLiteral *, raw_ostream &) override;
+
   bool getNextDiscriminator(const NamedDecl *ND, unsigned &disc) {
     // Lambda closure types are already numbered.
     if (isLambda(ND))
@@ -3774,6 +3780,10 @@ void ItaniumMangleContextImpl::mangleTyp
   mangleCXXRTTIName(Ty, Out);
 }
 
+void ItaniumMangleContextImpl::mangleStringLiteral(const StringLiteral *, raw_ostream &) {
+  llvm_unreachable("Can't mangle string literals");
+}
+
 ItaniumMangleContext *
 ItaniumMangleContext::create(ASTContext &Context, DiagnosticsEngine &Diags) {
   return new ItaniumMangleContextImpl(Context, Diags);

Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=204675&r1=204674&r2=204675&view=diff
==============================================================================
--- cfe/trunk/lib/AST/MicrosoftMangle.cpp (original)
+++ cfe/trunk/lib/AST/MicrosoftMangle.cpp Mon Mar 24 16:43:36 2014
@@ -20,6 +20,7 @@
 #include "clang/AST/DeclCXX.h"
 #include "clang/AST/DeclObjC.h"
 #include "clang/AST/DeclTemplate.h"
+#include "clang/AST/Expr.h"
 #include "clang/AST/ExprCXX.h"
 #include "clang/AST/VTableBuilder.h"
 #include "clang/Basic/ABI.h"
@@ -27,6 +28,7 @@
 #include "clang/Basic/TargetInfo.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringMap.h"
+#include "llvm/Support/MathExtras.h"
 
 using namespace clang;
 
@@ -93,6 +95,7 @@ public:
   MicrosoftMangleContextImpl(ASTContext &Context, DiagnosticsEngine &Diags)
       : MicrosoftMangleContext(Context, Diags) {}
   bool shouldMangleCXXName(const NamedDecl *D) override;
+  bool shouldMangleStringLiteral(const StringLiteral *SL) override;
   void mangleCXXName(const NamedDecl *D, raw_ostream &Out) override;
   void mangleVirtualMemPtrThunk(const CXXMethodDecl *MD, raw_ostream &) override;
   void mangleThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk,
@@ -118,6 +121,7 @@ public:
   void mangleDynamicInitializer(const VarDecl *D, raw_ostream &Out) override;
   void mangleDynamicAtExitDestructor(const VarDecl *D,
                                      raw_ostream &Out) override;
+  void mangleStringLiteral(const StringLiteral *SL, raw_ostream &Out) override;
   bool getNextDiscriminator(const NamedDecl *ND, unsigned &disc) {
     // Lambda closure types are already numbered.
     if (isLambda(ND))
@@ -321,6 +325,13 @@ bool MicrosoftMangleContextImpl::shouldM
   return true;
 }
 
+bool
+MicrosoftMangleContextImpl::shouldMangleStringLiteral(const StringLiteral *SL) {
+  return SL->isAscii() || SL->isWide();
+  // TODO: This needs to be updated when MSVC gains support for Unicode
+  // literals.
+}
+
 void MicrosoftCXXNameMangler::mangle(const NamedDecl *D,
                                      StringRef Prefix) {
   // MSVC doesn't mangle C++ names the same way it mangles extern "C" names.
@@ -2315,6 +2326,169 @@ MicrosoftMangleContextImpl::mangleDynami
   mangleInitFiniStub(D, Out, 'F');
 }
 
+void MicrosoftMangleContextImpl::mangleStringLiteral(const StringLiteral *SL,
+                                                     raw_ostream &Out) {
+  // <char-type> ::= 0   # char
+  //             ::= 1   # wchar_t
+  //             ::= ??? # char16_t/char32_t will need a mangling too...
+  //
+  // <literal-length> ::= <non-negative integer>  # the length of the literal
+  //
+  // <encoded-crc>    ::= <hex digit>+ @          # crc of the literal including
+  //                                              # null-terminator
+  //
+  // <encoded-string> ::= <simple character>           # uninteresting character
+  //                  ::= '?$' <hex digit> <hex digit> # these two nibbles
+  //                                                   # encode the byte for the
+  //                                                   # character
+  //                  ::= '?' [a-z]                    # \xe1 - \xfa
+  //                  ::= '?' [A-Z]                    # \xc1 - \xda
+  //                  ::= '?' [0-9]                    # [,/\:. \n\t'-]
+  //
+  // <literal> ::= '??_C at _' <char-type> <literal-length> <encoded-crc>
+  //               <encoded-string> '@'
+  MicrosoftCXXNameMangler Mangler(*this, Out);
+  Mangler.getStream() << "\01??_C at _";
+
+  // <char-type>: The "kind" of string literal is encoded into the mangled name.
+  // TODO: This needs to be updated when MSVC gains support for unicode
+  // literals.
+  if (SL->isAscii())
+    Mangler.getStream() << '0';
+  else if (SL->isWide())
+    Mangler.getStream() << '1';
+  else
+    llvm_unreachable("unexpected string literal kind!");
+
+  // <literal-length>: The next part of the mangled name consists of the length
+  // of the string.
+  // The StringLiteral does not consider the NUL terminator byte(s) but the
+  // mangling does.
+  // N.B. The length is in terms of bytes, not characters.
+  Mangler.mangleNumber(SL->getByteLength() + SL->getCharByteWidth());
+
+  // We will use the "Rocksoft^tm Model CRC Algorithm" to describe the
+  // properties of our CRC:
+  //   Width  : 32
+  //   Poly   : 04C11DB7
+  //   Init   : FFFFFFFF
+  //   RefIn  : True
+  //   RefOut : True
+  //   XorOut : 00000000
+  //   Check  : 340BC6D9
+  uint32_t CRC = 0xFFFFFFFFU;
+
+  auto UpdateCRC = [&CRC](char Byte) {
+    for (unsigned i = 0; i < 8; ++i) {
+      bool Bit = CRC & 0x80000000U;
+      if (Byte & (1U << i))
+        Bit = !Bit;
+      CRC <<= 1;
+      if (Bit)
+        CRC ^= 0x04C11DB7U;
+    }
+  };
+
+  // CRC all the bytes of the StringLiteral.
+  for (char Byte : SL->getBytes())
+    UpdateCRC(Byte);
+
+  // The NUL terminator byte(s) were not present earlier,
+  // we need to manually process those bytes into the CRC.
+  for (unsigned NullTerminator = 0; NullTerminator < SL->getCharByteWidth();
+       ++NullTerminator)
+    UpdateCRC('\x00');
+
+  // The literature refers to the process of reversing the bits in the final CRC
+  // output as "reflection".
+  CRC = llvm::reverseBits(CRC);
+
+  // <encoded-crc>: The CRC is encoded utilizing the standard number mangling
+  // scheme.
+  Mangler.mangleNumber(CRC);
+
+  // <encoded-crc>: The mangled name also contains the first 32 _characters_
+  // (including null-terminator bytes) of the StringLiteral.
+  // Each character is encoded by splitting them into bytes and then encoding
+  // the constituent bytes.
+  auto MangleByte = [&Mangler](char Byte) {
+    // There are five different manglings for characters:
+    // - [a-zA-Z0-9_$]: A one-to-one mapping.
+    // - ?[a-z]: The range from \xe1 to \xfa.
+    // - ?[A-Z]: The range from \xc1 to \xda.
+    // - ?[0-9]: The set of [,/\:. \n\t'-].
+    // - ?$XX: A fallback which maps nibbles.
+    if ((Byte >= 'a' && Byte <= 'z') || (Byte >= 'A' && Byte <= 'Z') ||
+        (Byte >= '0' && Byte <= '9') || Byte == '_' || Byte == '$') {
+      Mangler.getStream() << Byte;
+    } else if (Byte >= '\xe1' && Byte <= '\xfa') {
+      Mangler.getStream() << '?' << static_cast<char>('a' + (Byte - '\xe1'));
+    } else if (Byte >= '\xc1' && Byte <= '\xda') {
+      Mangler.getStream() << '?' << static_cast<char>('A' + (Byte - '\xc1'));
+    } else {
+      switch (Byte) {
+        case ',':
+          Mangler.getStream() << "?0";
+          break;
+        case '/':
+          Mangler.getStream() << "?1";
+          break;
+        case '\\':
+          Mangler.getStream() << "?2";
+          break;
+        case ':':
+          Mangler.getStream() << "?3";
+          break;
+        case '.':
+          Mangler.getStream() << "?4";
+          break;
+        case ' ':
+          Mangler.getStream() << "?5";
+          break;
+        case '\n':
+          Mangler.getStream() << "?6";
+          break;
+        case '\t':
+          Mangler.getStream() << "?7";
+          break;
+        case '\'':
+          Mangler.getStream() << "?8";
+          break;
+        case '-':
+          Mangler.getStream() << "?9";
+          break;
+        default:
+          Mangler.getStream() << "?$";
+          Mangler.getStream() << static_cast<char>('A' + ((Byte >> 4) & 0xf));
+          Mangler.getStream() << static_cast<char>('A' + (Byte & 0xf));
+          break;
+      }
+    }
+  };
+
+  auto MangleChar = [&Mangler, &MangleByte, &SL](uint32_t CodeUnit) {
+    if (SL->getCharByteWidth() == 1) {
+      MangleByte(static_cast<char>(CodeUnit));
+    } else if (SL->getCharByteWidth() == 2) {
+      MangleByte(static_cast<char>((CodeUnit >> 16) & 0xff));
+      MangleByte(static_cast<char>(CodeUnit & 0xff));
+    } else {
+      llvm_unreachable("unsupported CharByteWidth");
+    }
+  };
+
+  // Enforce our 32 character max.
+  unsigned NumCharsToMangle = std::min(32U, SL->getLength());
+  for (unsigned i = 0; i < NumCharsToMangle; ++i)
+    MangleChar(SL->getCodeUnit(i));
+
+  // Encode the NUL terminator if there is room.
+  if (NumCharsToMangle < 32)
+    MangleChar(0);
+
+  Mangler.getStream() << '@';
+}
+
 MicrosoftMangleContext *
 MicrosoftMangleContext::create(ASTContext &Context, DiagnosticsEngine &Diags) {
   return new MicrosoftMangleContextImpl(Context, Diags);

Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=204675&r1=204674&r2=204675&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Mon Mar 24 16:43:36 2014
@@ -2572,25 +2572,67 @@ CodeGenModule::GetConstantArrayFromStrin
 llvm::Constant *
 CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S) {
   CharUnits Align = getContext().getAlignOfGlobalVarInChars(S->getType());
-  if (S->isAscii() || S->isUTF8()) {
-    SmallString<64> Str(S->getString());
-    
-    // Resize the string to the right size, which is indicated by its type.
-    const ConstantArrayType *CAT = Context.getAsConstantArrayType(S->getType());
-    Str.resize(CAT->getSize().getZExtValue());
-    return GetAddrOfConstantString(Str, /*GlobalName*/ 0, Align.getQuantity());
+
+  llvm::StringMapEntry<llvm::GlobalVariable *> *Entry = nullptr;
+  llvm::GlobalVariable *GV = nullptr;
+  if (!LangOpts.WritableStrings) {
+    llvm::StringMap<llvm::GlobalVariable *> *ConstantStringMap = nullptr;
+    switch (S->getCharByteWidth()) {
+    case 1:
+      ConstantStringMap = &Constant1ByteStringMap;
+      break;
+    case 2:
+      ConstantStringMap = &Constant2ByteStringMap;
+      break;
+    case 4:
+      ConstantStringMap = &Constant4ByteStringMap;
+      break;
+    default:
+      llvm_unreachable("unhandled byte width!");
+    }
+    Entry = &ConstantStringMap->GetOrCreateValue(S->getBytes());
+    GV = Entry->getValue();
+  }
+
+  if (!GV) {
+    SmallString<256> MangledNameBuffer;
+    StringRef GlobalVariableName;
+    llvm::GlobalValue::LinkageTypes LT;
+
+    // Mangle the string literal if the ABI allows for it.  However, we cannot
+    // do this if  we are compiling with ASan or -fwritable-strings because they
+    // rely on strings having normal linkage.
+    if (!LangOpts.WritableStrings && !SanOpts.Address &&
+        getCXXABI().getMangleContext().shouldMangleStringLiteral(S)) {
+      llvm::raw_svector_ostream Out(MangledNameBuffer);
+      getCXXABI().getMangleContext().mangleStringLiteral(S, Out);
+      Out.flush();
+
+      LT = llvm::GlobalValue::LinkOnceODRLinkage;
+      GlobalVariableName = MangledNameBuffer;
+    } else {
+      LT = llvm::GlobalValue::PrivateLinkage;;
+      GlobalVariableName = ".str";
+    }
+
+    // OpenCL v1.2 s6.5.3: a string literal is in the constant address space.
+    unsigned AddrSpace = 0;
+    if (getLangOpts().OpenCL)
+      AddrSpace = getContext().getTargetAddressSpace(LangAS::opencl_constant);
+
+    llvm::Constant *C = GetConstantArrayFromStringLiteral(S);
+    GV = new llvm::GlobalVariable(
+        getModule(), C->getType(), !LangOpts.WritableStrings, LT, C,
+        GlobalVariableName, /*InsertBefore=*/nullptr,
+        llvm::GlobalVariable::NotThreadLocal, AddrSpace);
+    GV->setUnnamedAddr(true);
+    if (Entry)
+      Entry->setValue(GV);
   }
 
-  // FIXME: the following does not memoize wide strings.
-  llvm::Constant *C = GetConstantArrayFromStringLiteral(S);
-  llvm::GlobalVariable *GV =
-    new llvm::GlobalVariable(getModule(),C->getType(),
-                             !LangOpts.WritableStrings,
-                             llvm::GlobalValue::PrivateLinkage,
-                             C,".str");
+  if (Align.getQuantity() > GV->getAlignment())
+    GV->setAlignment(Align.getQuantity());
 
-  GV->setAlignment(Align.getQuantity());
-  GV->setUnnamedAddr(true);
   return GV;
 }
 
@@ -2615,7 +2657,7 @@ static llvm::GlobalVariable *GenerateStr
   llvm::Constant *C =
       llvm::ConstantDataArray::getString(CGM.getLLVMContext(), str, false);
 
-  // OpenCL v1.1 s6.5.3: a string literal is in the constant address space.
+  // OpenCL v1.2 s6.5.3: a string literal is in the constant address space.
   unsigned AddrSpace = 0;
   if (CGM.getLangOpts().OpenCL)
     AddrSpace = CGM.getContext().getTargetAddressSpace(LangAS::opencl_constant);
@@ -2654,7 +2696,7 @@ llvm::Constant *CodeGenModule::GetAddrOf
     return GenerateStringLiteral(Str, false, *this, GlobalName, Alignment);
 
   llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
-    ConstantStringMap.GetOrCreateValue(Str);
+    Constant1ByteStringMap.GetOrCreateValue(Str);
 
   if (llvm::GlobalVariable *GV = Entry.getValue()) {
     if (Alignment > GV->getAlignment()) {

Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=204675&r1=204674&r2=204675&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.h Mon Mar 24 16:43:36 2014
@@ -319,7 +319,10 @@ class CodeGenModule : public CodeGenType
   llvm::StringMap<llvm::Constant*> AnnotationStrings;
 
   llvm::StringMap<llvm::Constant*> CFConstantStringMap;
-  llvm::StringMap<llvm::GlobalVariable*> ConstantStringMap;
+
+  llvm::StringMap<llvm::GlobalVariable *> Constant1ByteStringMap;
+  llvm::StringMap<llvm::GlobalVariable *> Constant2ByteStringMap;
+  llvm::StringMap<llvm::GlobalVariable *> Constant4ByteStringMap;
   llvm::DenseMap<const Decl*, llvm::Constant *> StaticLocalDeclMap;
   llvm::DenseMap<const Decl*, llvm::GlobalVariable*> StaticLocalDeclGuardMap;
   llvm::DenseMap<const Expr*, llvm::Constant *> MaterializedGlobalTemporaryMap;

Modified: cfe/trunk/test/CodeGen/c-strings.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/c-strings.c?rev=204675&r1=204674&r2=204675&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/c-strings.c (original)
+++ cfe/trunk/test/CodeGen/c-strings.c Mon Mar 24 16:43:36 2014
@@ -1,14 +1,18 @@
-// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK --check-prefix=ITANIUM
+// RUN: %clang_cc1 -triple %ms_abi_triple -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK --check-prefix=MSABI
 
 // Should be 3 hello strings, two global (of different sizes), the rest are
 // shared.
 
 // CHECK: @align = global i8 [[ALIGN:[0-9]+]]
-// CHECK: @.str = private unnamed_addr constant [6 x i8] c"hello\00"
-// CHECK: @f1.x = internal global i8* getelementptr inbounds ([6 x i8]* @.str, i32 0, i32 0)
+// ITANIUM: @.str = private unnamed_addr constant [6 x i8] c"hello\00"
+// MSABI: @"\01??_C at _05CJBACGMB@hello?$AA@" = linkonce_odr unnamed_addr constant [6 x i8] c"hello\00", align 1
+// ITANIUM: @f1.x = internal global i8* getelementptr inbounds ([6 x i8]* @.str, i32 0, i32 0)
+// MSABI: @f1.x = internal global i8* getelementptr inbounds ([6 x i8]* @"\01??_C at _05CJBACGMB@hello?$AA@", i32 0, i32 0)
 // CHECK: @f2.x = internal global [6 x i8] c"hello\00", align [[ALIGN]]
 // CHECK: @f3.x = internal global [8 x i8] c"hello\00\00\00", align [[ALIGN]]
-// CHECK: @f4.x = internal global %struct.s { i8* getelementptr inbounds ([6 x i8]* @.str, i32 0, i32 0) }
+// ITANIUM: @f4.x = internal global %struct.s { i8* getelementptr inbounds ([6 x i8]* @.str, i32 0, i32 0) }
+// MSABI: @f4.x = internal global %struct.s { i8* getelementptr inbounds ([6 x i8]* @"\01??_C at _05CJBACGMB@hello?$AA@", i32 0, i32 0) }
 // CHECK: @x = global [3 x i8] c"ola", align [[ALIGN]]
 
 #if defined(__s390x__)
@@ -22,7 +26,8 @@ void bar(const char *);
 // CHECK-LABEL: define void @f0()
 void f0() {
   bar("hello");
-  // CHECK: call void @bar({{.*}} @.str
+  // ITANIUM: call void @bar({{.*}} @.str
+  // MSABI: call void @bar({{.*}} @"\01??_C at _05CJBACGMB@hello?$AA@"
 }
 
 // CHECK-LABEL: define void @f1()

Modified: cfe/trunk/test/CodeGen/string-literal-short-wstring.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/string-literal-short-wstring.c?rev=204675&r1=204674&r2=204675&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/string-literal-short-wstring.c (original)
+++ cfe/trunk/test/CodeGen/string-literal-short-wstring.c Mon Mar 24 16:43:36 2014
@@ -1,4 +1,5 @@
-// RUN: %clang_cc1 -x c++ -emit-llvm -fshort-wchar %s -o - | FileCheck %s
+// RUN: %clang_cc1 -x c++ -triple %itanium_abi_triple -emit-llvm -fshort-wchar %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=ITANIUM
+// RUN: %clang_cc1 -x c++ -triple %ms_abi_triple -emit-llvm -fshort-wchar %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=MSABI
 // Runs in c++ mode so that wchar_t is available.
 
 int main() {
@@ -6,11 +7,13 @@ int main() {
   // CHECK: private unnamed_addr constant [10 x i8] c"\E1\84\A0\C8\A0\F4\82\80\B0\00", align 1
   char b[10] = "\u1120\u0220\U00102030";
 
-  // CHECK: private unnamed_addr constant [3 x i16] [i16 65, i16 66, i16 0]
+  // ITANIUM: private unnamed_addr constant [3 x i16] [i16 65, i16 66, i16 0]
+  // MSABI: linkonce_odr unnamed_addr constant [3 x i16] [i16 65, i16 66, i16 0]
   const wchar_t *foo = L"AB";
 
   // This should convert to utf16.
-  // CHECK: private unnamed_addr constant [5 x i16] [i16 4384, i16 544, i16 -9272, i16 -9168, i16 0]
+  // ITANIUM: private unnamed_addr constant [5 x i16] [i16 4384, i16 544, i16 -9272, i16 -9168, i16 0]
+  // MSABI: linkonce_odr unnamed_addr constant [5 x i16] [i16 4384, i16 544, i16 -9272, i16 -9168, i16 0]
   const wchar_t *bar = L"\u1120\u0220\U00102030";
 
 

Modified: cfe/trunk/test/CodeGen/wchar-const.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/wchar-const.c?rev=204675&r1=204674&r2=204675&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/wchar-const.c (original)
+++ cfe/trunk/test/CodeGen/wchar-const.c Mon Mar 24 16:43:36 2014
@@ -15,7 +15,7 @@ typedef __WCHAR_TYPE__ wchar_t;
 
 
 // CHECK-DAR: private unnamed_addr constant [18 x i32] [i32 84,
-// CHECK-WIN: private unnamed_addr constant [18 x i16] [i16 84,
+// CHECK-WIN: linkonce_odr unnamed_addr constant [18 x i16] [i16 84,
 extern void foo(const wchar_t* p);
 int main (int argc, const char * argv[])
 {

Added: cfe/trunk/test/CodeGenCXX/mangle-ms-string-literals.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms-string-literals.cpp?rev=204675&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/mangle-ms-string-literals.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/mangle-ms-string-literals.cpp Mon Mar 24 16:43:36 2014
@@ -0,0 +1,719 @@
+// RUN: %clang_cc1 -x c++ -std=c++11 -emit-llvm %s -o - -triple=i386-pc-win32 | FileCheck %s
+// RUN: %clang_cc1 -x c++ -std=c++11 -emit-llvm %s -o - -triple=x86_64-pc-win32 | FileCheck %s
+
+const char *l255 = "\xff";
+const char *l254 = "\xfe";
+const char *l253 = "\xfd";
+const char *l252 = "\xfc";
+const char *l251 = "\xfb";
+const char *l250 = "\xfa";
+const char *l249 = "\xf9";
+const char *l248 = "\xf8";
+const char *l247 = "\xf7";
+const char *l246 = "\xf6";
+const char *l245 = "\xf5";
+const char *l244 = "\xf4";
+const char *l243 = "\xf3";
+const char *l242 = "\xf2";
+const char *l241 = "\xf1";
+const char *l240 = "\xf0";
+const char *l239 = "\xef";
+const char *l238 = "\xee";
+const char *l237 = "\xed";
+const char *l236 = "\xec";
+const char *l235 = "\xeb";
+const char *l234 = "\xea";
+const char *l233 = "\xe9";
+const char *l232 = "\xe8";
+const char *l231 = "\xe7";
+const char *l230 = "\xe6";
+const char *l229 = "\xe5";
+const char *l228 = "\xe4";
+const char *l227 = "\xe3";
+const char *l226 = "\xe2";
+const char *l225 = "\xe1";
+const char *l224 = "\xe0";
+const char *l223 = "\xdf";
+const char *l222 = "\xde";
+const char *l221 = "\xdd";
+const char *l220 = "\xdc";
+const char *l219 = "\xdb";
+const char *l218 = "\xda";
+const char *l217 = "\xd9";
+const char *l216 = "\xd8";
+const char *l215 = "\xd7";
+const char *l214 = "\xd6";
+const char *l213 = "\xd5";
+const char *l212 = "\xd4";
+const char *l211 = "\xd3";
+const char *l210 = "\xd2";
+const char *l209 = "\xd1";
+const char *l208 = "\xd0";
+const char *l207 = "\xcf";
+const char *l206 = "\xce";
+const char *l205 = "\xcd";
+const char *l204 = "\xcc";
+const char *l203 = "\xcb";
+const char *l202 = "\xca";
+const char *l201 = "\xc9";
+const char *l200 = "\xc8";
+const char *l199 = "\xc7";
+const char *l198 = "\xc6";
+const char *l197 = "\xc5";
+const char *l196 = "\xc4";
+const char *l195 = "\xc3";
+const char *l194 = "\xc2";
+const char *l193 = "\xc1";
+const char *l192 = "\xc0";
+const char *l191 = "\xbf";
+const char *l190 = "\xbe";
+const char *l189 = "\xbd";
+const char *l188 = "\xbc";
+const char *l187 = "\xbb";
+const char *l186 = "\xba";
+const char *l185 = "\xb9";
+const char *l184 = "\xb8";
+const char *l183 = "\xb7";
+const char *l182 = "\xb6";
+const char *l181 = "\xb5";
+const char *l180 = "\xb4";
+const char *l179 = "\xb3";
+const char *l178 = "\xb2";
+const char *l177 = "\xb1";
+const char *l176 = "\xb0";
+const char *l175 = "\xaf";
+const char *l174 = "\xae";
+const char *l173 = "\xad";
+const char *l172 = "\xac";
+const char *l171 = "\xab";
+const char *l170 = "\xaa";
+const char *l169 = "\xa9";
+const char *l168 = "\xa8";
+const char *l167 = "\xa7";
+const char *l166 = "\xa6";
+const char *l165 = "\xa5";
+const char *l164 = "\xa4";
+const char *l163 = "\xa3";
+const char *l162 = "\xa2";
+const char *l161 = "\xa1";
+const char *l160 = "\xa0";
+const char *l159 = "\x9f";
+const char *l158 = "\x9e";
+const char *l157 = "\x9d";
+const char *l156 = "\x9c";
+const char *l155 = "\x9b";
+const char *l154 = "\x9a";
+const char *l153 = "\x99";
+const char *l152 = "\x98";
+const char *l151 = "\x97";
+const char *l150 = "\x96";
+const char *l149 = "\x95";
+const char *l148 = "\x94";
+const char *l147 = "\x93";
+const char *l146 = "\x92";
+const char *l145 = "\x91";
+const char *l144 = "\x90";
+const char *l143 = "\x8f";
+const char *l142 = "\x8e";
+const char *l141 = "\x8d";
+const char *l140 = "\x8c";
+const char *l139 = "\x8b";
+const char *l138 = "\x8a";
+const char *l137 = "\x89";
+const char *l136 = "\x88";
+const char *l135 = "\x87";
+const char *l134 = "\x86";
+const char *l133 = "\x85";
+const char *l132 = "\x84";
+const char *l131 = "\x83";
+const char *l130 = "\x82";
+const char *l129 = "\x81";
+const char *l128 = "\x80";
+const char *l127 = "\x7f";
+const char *l126 = "\x7e";
+const char *l125 = "\x7d";
+const char *l124 = "\x7c";
+const char *l123 = "\x7b";
+const char *l122 = "\x7a";
+const char *l121 = "\x79";
+const char *l120 = "\x78";
+const char *l119 = "\x77";
+const char *l118 = "\x76";
+const char *l117 = "\x75";
+const char *l116 = "\x74";
+const char *l115 = "\x73";
+const char *l114 = "\x72";
+const char *l113 = "\x71";
+const char *l112 = "\x70";
+const char *l111 = "\x6f";
+const char *l110 = "\x6e";
+const char *l109 = "\x6d";
+const char *l108 = "\x6c";
+const char *l107 = "\x6b";
+const char *l106 = "\x6a";
+const char *l105 = "\x69";
+const char *l104 = "\x68";
+const char *l103 = "\x67";
+const char *l102 = "\x66";
+const char *l101 = "\x65";
+const char *l100 = "\x64";
+const char *l99 = "\x63";
+const char *l98 = "\x62";
+const char *l97 = "\x61";
+const char *l96 = "\x60";
+const char *l95 = "\x5f";
+const char *l94 = "\x5e";
+const char *l93 = "\x5d";
+const char *l92 = "\x5c";
+const char *l91 = "\x5b";
+const char *l90 = "\x5a";
+const char *l89 = "\x59";
+const char *l88 = "\x58";
+const char *l87 = "\x57";
+const char *l86 = "\x56";
+const char *l85 = "\x55";
+const char *l84 = "\x54";
+const char *l83 = "\x53";
+const char *l82 = "\x52";
+const char *l81 = "\x51";
+const char *l80 = "\x50";
+const char *l79 = "\x4f";
+const char *l78 = "\x4e";
+const char *l77 = "\x4d";
+const char *l76 = "\x4c";
+const char *l75 = "\x4b";
+const char *l74 = "\x4a";
+const char *l73 = "\x49";
+const char *l72 = "\x48";
+const char *l71 = "\x47";
+const char *l70 = "\x46";
+const char *l69 = "\x45";
+const char *l68 = "\x44";
+const char *l67 = "\x43";
+const char *l66 = "\x42";
+const char *l65 = "\x41";
+const char *l64 = "\x40";
+const char *l63 = "\x3f";
+const char *l62 = "\x3e";
+const char *l61 = "\x3d";
+const char *l60 = "\x3c";
+const char *l59 = "\x3b";
+const char *l58 = "\x3a";
+const char *l57 = "\x39";
+const char *l56 = "\x38";
+const char *l55 = "\x37";
+const char *l54 = "\x36";
+const char *l53 = "\x35";
+const char *l52 = "\x34";
+const char *l51 = "\x33";
+const char *l50 = "\x32";
+const char *l49 = "\x31";
+const char *l48 = "\x30";
+const char *l47 = "\x2f";
+const char *l46 = "\x2e";
+const char *l45 = "\x2d";
+const char *l44 = "\x2c";
+const char *l43 = "\x2b";
+const char *l42 = "\x2a";
+const char *l41 = "\x29";
+const char *l40 = "\x28";
+const char *l39 = "\x27";
+const char *l38 = "\x26";
+const char *l37 = "\x25";
+const char *l36 = "\x24";
+const char *l35 = "\x23";
+const char *l34 = "\x22";
+const char *l33 = "\x21";
+const char *l32 = "\x20";
+const char *l31 = "\x1f";
+const char *l30 = "\x1e";
+const char *l29 = "\x1d";
+const char *l28 = "\x1c";
+const char *l27 = "\x1b";
+const char *l26 = "\x1a";
+const char *l25 = "\x19";
+const char *l24 = "\x18";
+const char *l23 = "\x17";
+const char *l22 = "\x16";
+const char *l21 = "\x15";
+const char *l20 = "\x14";
+const char *l19 = "\x13";
+const char *l18 = "\x12";
+const char *l17 = "\x11";
+const char *l16 = "\x10";
+const char *l15 = "\xf";
+const char *l14 = "\xe";
+const char *l13 = "\xd";
+const char *l12 = "\xc";
+const char *l11 = "\xb";
+const char *l10 = "\xa";
+const char *l9 = "\x9";
+const char *l8 = "\x8";
+const char *l7 = "\x7";
+const char *l6 = "\x6";
+const char *l5 = "\x5";
+const char *l4 = "\x4";
+const char *l3 = "\x3";
+const char *l2 = "\x2";
+const char *l1 = "\x1";
+const char *l0 = "\x0";
+
+// CHECK: @"\01??_C at _01CNACBAHC@?$PP?$AA@"
+// CHECK: @"\01??_C at _01DEBJCBDD@?$PO?$AA@"
+// CHECK: @"\01??_C at _01BPDEHCPA@?$PN?$AA@"
+// CHECK: @"\01??_C at _01GCPEDLB@?$PM?$AA@"
+// CHECK: @"\01??_C at _01EJGONFHG@?$PL?$AA@"
+// CHECK: @"\01??_C at _01FAHFOEDH@?z?$AA@"
+// CHECK: @"\01??_C at _01HLFILHPE@?y?$AA@"
+// CHECK: @"\01??_C at _01GCEDIGLF@?x?$AA@"
+// CHECK: @"\01??_C at _01OFNLJKHK@?w?$AA@"
+// CHECK: @"\01??_C at _01PMMAKLDL@?v?$AA@"
+// CHECK: @"\01??_C at _01NHONPIPI@?u?$AA@"
+// CHECK: @"\01??_C at _01MOPGMJLJ@?t?$AA@"
+// CHECK: @"\01??_C at _01IBLHFPHO@?s?$AA@"
+// CHECK: @"\01??_C at _01JIKMGODP@?r?$AA@"
+// CHECK: @"\01??_C at _01LDIBDNPM@?q?$AA@"
+// CHECK: @"\01??_C at _01KKJKAMLN@?p?$AA@"
+// CHECK: @"\01??_C at _01GHMAACCD@?o?$AA@"
+// CHECK: @"\01??_C at _01HONLDDGC@?n?$AA@"
+// CHECK: @"\01??_C at _01FFPGGAKB@?m?$AA@"
+// CHECK: @"\01??_C at _01EMONFBOA@?l?$AA@"
+// CHECK: @"\01??_C at _01DKMMHCH@?k?$AA@"
+// CHECK: @"\01??_C at _01BKLHPGGG@?j?$AA@"
+// CHECK: @"\01??_C at _01DBJKKFKF@?i?$AA@"
+// CHECK: @"\01??_C at _01CIIBJEOE@?h?$AA@"
+// CHECK: @"\01??_C at _01KPBJIICL@?g?$AA@"
+// CHECK: @"\01??_C at _01LGACLJGK@?f?$AA@"
+// CHECK: @"\01??_C at _01JNCPOKKJ@?e?$AA@"
+// CHECK: @"\01??_C at _01IEDENLOI@?d?$AA@"
+// CHECK: @"\01??_C at _01MLHFENCP@?c?$AA@"
+// CHECK: @"\01??_C at _01NCGOHMGO@?b?$AA@"
+// CHECK: @"\01??_C at _01PJEDCPKN@?a?$AA@"
+// CHECK: @"\01??_C at _01OAFIBOOM@?$OA?$AA@"
+// CHECK: @"\01??_C at _01LIIGDENA@?$NP?$AA@"
+// CHECK: @"\01??_C at _01KBJNAFJB@?$NO?$AA@"
+// CHECK: @"\01??_C at _01IKLAFGFC@?$NN?$AA@"
+// CHECK: @"\01??_C at _01JDKLGHBD@?$NM?$AA@"
+// CHECK: @"\01??_C at _01NMOKPBNE@?$NL?$AA@"
+// CHECK: @"\01??_C at _01MFPBMAJF@?Z?$AA@"
+// CHECK: @"\01??_C at _01OONMJDFG@?Y?$AA@"
+// CHECK: @"\01??_C at _01PHMHKCBH@?X?$AA@"
+// CHECK: @"\01??_C at _01HAFPLONI@?W?$AA@"
+// CHECK: @"\01??_C at _01GJEEIPJJ@?V?$AA@"
+// CHECK: @"\01??_C at _01ECGJNMFK@?U?$AA@"
+// CHECK: @"\01??_C at _01FLHCONBL@?T?$AA@"
+// CHECK: @"\01??_C at _01BEDDHLNM@?S?$AA@"
+// CHECK: @"\01??_C at _01NCIEKJN@?R?$AA@"
+// CHECK: @"\01??_C at _01CGAFBJFO@?Q?$AA@"
+// CHECK: @"\01??_C at _01DPBOCIBP@?P?$AA@"
+// CHECK: @"\01??_C at _01PCEECGIB@?O?$AA@"
+// CHECK: @"\01??_C at _01OLFPBHMA@?N?$AA@"
+// CHECK: @"\01??_C at _01MAHCEEAD@?M?$AA@"
+// CHECK: @"\01??_C at _01NJGJHFEC@?L?$AA@"
+// CHECK: @"\01??_C at _01JGCIODIF@?K?$AA@"
+// CHECK: @"\01??_C at _01IPDDNCME@?J?$AA@"
+// CHECK: @"\01??_C at _01KEBOIBAH@?I?$AA@"
+// CHECK: @"\01??_C at _01LNAFLAEG@?H?$AA@"
+// CHECK: @"\01??_C at _01DKJNKMIJ@?G?$AA@"
+// CHECK: @"\01??_C at _01CDIGJNMI@?F?$AA@"
+// CHECK: @"\01??_C at _01IKLMOAL@?E?$AA@"
+// CHECK: @"\01??_C at _01BBLAPPEK@?D?$AA@"
+// CHECK: @"\01??_C at _01FOPBGJIN@?C?$AA@"
+// CHECK: @"\01??_C at _01EHOKFIMM@?B?$AA@"
+// CHECK: @"\01??_C at _01GMMHALAP@?A?$AA@"
+// CHECK: @"\01??_C at _01HFNMDKEO@?$MA?$AA@"
+// CHECK: @"\01??_C at _01NNHLFPHH@?$LP?$AA@"
+// CHECK: @"\01??_C at _01MEGAGODG@?$LO?$AA@"
+// CHECK: @"\01??_C at _01OPENDNPF@?$LN?$AA@"
+// CHECK: @"\01??_C at _01PGFGAMLE@?$LM?$AA@"
+// CHECK: @"\01??_C at _01LJBHJKHD@?$LL?$AA@"
+// CHECK: @"\01??_C at _01KAAMKLDC@?$LK?$AA@"
+// CHECK: @"\01??_C at _01ILCBPIPB@?$LJ?$AA@"
+// CHECK: @"\01??_C at _01JCDKMJLA@?$LI?$AA@"
+// CHECK: @"\01??_C at _01BFKCNFHP@?$LH?$AA@"
+// CHECK: @"\01??_C at _01MLJOEDO@?$LG?$AA@"
+// CHECK: @"\01??_C at _01CHJELHPN@?$LF?$AA@"
+// CHECK: @"\01??_C at _01DOIPIGLM@?$LE?$AA@"
+// CHECK: @"\01??_C at _01HBMOBAHL@?$LD?$AA@"
+// CHECK: @"\01??_C at _01GINFCBDK@?$LC?$AA@"
+// CHECK: @"\01??_C at _01EDPIHCPJ@?$LB?$AA@"
+// CHECK: @"\01??_C at _01FKODEDLI@?$LA?$AA@"
+// CHECK: @"\01??_C at _01JHLJENCG@?$KP?$AA@"
+// CHECK: @"\01??_C at _01IOKCHMGH@?$KO?$AA@"
+// CHECK: @"\01??_C at _01KFIPCPKE@?$KN?$AA@"
+// CHECK: @"\01??_C at _01LMJEBOOF@?$KM?$AA@"
+// CHECK: @"\01??_C at _01PDNFIICC@?$KL?$AA@"
+// CHECK: @"\01??_C at _01OKMOLJGD@?$KK?$AA@"
+// CHECK: @"\01??_C at _01MBODOKKA@?$KJ?$AA@"
+// CHECK: @"\01??_C at _01NIPINLOB@?$KI?$AA@"
+// CHECK: @"\01??_C at _01FPGAMHCO@?$KH?$AA@"
+// CHECK: @"\01??_C at _01EGHLPGGP@?$KG?$AA@"
+// CHECK: @"\01??_C at _01GNFGKFKM@?$KF?$AA@"
+// CHECK: @"\01??_C at _01HEENJEON@?$KE?$AA@"
+// CHECK: @"\01??_C at _01DLAMACCK@?$KD?$AA@"
+// CHECK: @"\01??_C at _01CCBHDDGL@?$KC?$AA@"
+// CHECK: @"\01??_C at _01JDKGAKI@?$KB?$AA@"
+// CHECK: @"\01??_C at _01BACBFBOJ@?$KA?$AA@"
+// CHECK: @"\01??_C at _01EIPPHLNF@?$JP?$AA@"
+// CHECK: @"\01??_C at _01FBOEEKJE@?$JO?$AA@"
+// CHECK: @"\01??_C at _01HKMJBJFH@?$JN?$AA@"
+// CHECK: @"\01??_C at _01GDNCCIBG@?$JM?$AA@"
+// CHECK: @"\01??_C at _01CMJDLONB@?$JL?$AA@"
+// CHECK: @"\01??_C at _01DFIIIPJA@?$JK?$AA@"
+// CHECK: @"\01??_C at _01BOKFNMFD@?$JJ?$AA@"
+// CHECK: @"\01??_C at _01HLOONBC@?$JI?$AA@"
+// CHECK: @"\01??_C at _01IACGPBNN@?$JH?$AA@"
+// CHECK: @"\01??_C at _01JJDNMAJM@?$JG?$AA@"
+// CHECK: @"\01??_C at _01LCBAJDFP@?$JF?$AA@"
+// CHECK: @"\01??_C at _01KLALKCBO@?$JE?$AA@"
+// CHECK: @"\01??_C at _01OEEKDENJ@?$JD?$AA@"
+// CHECK: @"\01??_C at _01PNFBAFJI@?$JC?$AA@"
+// CHECK: @"\01??_C at _01NGHMFGFL@?$JB?$AA@"
+// CHECK: @"\01??_C at _01MPGHGHBK@?$JA?$AA@"
+// CHECK: @"\01??_C at _01CDNGJIE@?$IP?$AA@"
+// CHECK: @"\01??_C at _01BLCGFIMF@?$IO?$AA@"
+// CHECK: @"\01??_C at _01DAALALAG@?$IN?$AA@"
+// CHECK: @"\01??_C at _01CJBADKEH@?$IM?$AA@"
+// CHECK: @"\01??_C at _01GGFBKMIA@?$IL?$AA@"
+// CHECK: @"\01??_C at _01HPEKJNMB@?$IK?$AA@"
+// CHECK: @"\01??_C at _01FEGHMOAC@?$IJ?$AA@"
+// CHECK: @"\01??_C at _01ENHMPPED@?$II?$AA@"
+// CHECK: @"\01??_C at _01MKOEODIM@?$IH?$AA@"
+// CHECK: @"\01??_C at _01NDPPNCMN@?$IG?$AA@"
+// CHECK: @"\01??_C at _01PINCIBAO@?$IF?$AA@"
+// CHECK: @"\01??_C at _01OBMJLAEP@?$IE?$AA@"
+// CHECK: @"\01??_C at _01KOIICGII@?$ID?$AA@"
+// CHECK: @"\01??_C at _01LHJDBHMJ@?$IC?$AA@"
+// CHECK: @"\01??_C at _01JMLOEEAK@?$IB?$AA@"
+// CHECK: @"\01??_C at _01IFKFHFEL@?$IA?$AA@"
+// CHECK: @"\01??_C at _01BGIBIIDJ@?$HP?$AA@"
+// CHECK: @"\01??_C at _01PJKLJHI@?$HO?$AA@"
+// CHECK: @"\01??_C at _01CELHOKLL@?$HN?$AA@"
+// CHECK: @"\01??_C at _01DNKMNLPK@?$HM?$AA@"
+// CHECK: @"\01??_C at _01HCONENDN@?$HL?$AA@"
+// CHECK: @"\01??_C at _01GLPGHMHM@z?$AA@"
+// CHECK: @"\01??_C at _01EANLCPLP@y?$AA@"
+// CHECK: @"\01??_C at _01FJMABOPO@x?$AA@"
+// CHECK: @"\01??_C at _01NOFIACDB@w?$AA@"
+// CHECK: @"\01??_C at _01MHEDDDHA@v?$AA@"
+// CHECK: @"\01??_C at _01OMGOGALD@u?$AA@"
+// CHECK: @"\01??_C at _01PFHFFBPC@t?$AA@"
+// CHECK: @"\01??_C at _01LKDEMHDF@s?$AA@"
+// CHECK: @"\01??_C at _01KDCPPGHE@r?$AA@"
+// CHECK: @"\01??_C at _01IIACKFLH@q?$AA@"
+// CHECK: @"\01??_C at _01JBBJJEPG@p?$AA@"
+// CHECK: @"\01??_C at _01FMEDJKGI@o?$AA@"
+// CHECK: @"\01??_C at _01EFFIKLCJ@n?$AA@"
+// CHECK: @"\01??_C at _01GOHFPIOK@m?$AA@"
+// CHECK: @"\01??_C at _01HHGOMJKL@l?$AA@"
+// CHECK: @"\01??_C at _01DICPFPGM@k?$AA@"
+// CHECK: @"\01??_C at _01CBDEGOCN@j?$AA@"
+// CHECK: @"\01??_C at _01KBJDNOO@i?$AA@"
+// CHECK: @"\01??_C at _01BDACAMKP@h?$AA@"
+// CHECK: @"\01??_C at _01JEJKBAGA@g?$AA@"
+// CHECK: @"\01??_C at _01INIBCBCB@f?$AA@"
+// CHECK: @"\01??_C at _01KGKMHCOC@e?$AA@"
+// CHECK: @"\01??_C at _01LPLHEDKD@d?$AA@"
+// CHECK: @"\01??_C at _01PAPGNFGE@c?$AA@"
+// CHECK: @"\01??_C at _01OJONOECF@b?$AA@"
+// CHECK: @"\01??_C at _01MCMALHOG@a?$AA@"
+// CHECK: @"\01??_C at _01NLNLIGKH@?$GA?$AA@"
+// CHECK: @"\01??_C at _01IDAFKMJL@_?$AA@"
+// CHECK: @"\01??_C at _01JKBOJNNK@?$FO?$AA@"
+// CHECK: @"\01??_C at _01LBDDMOBJ@?$FN?$AA@"
+// CHECK: @"\01??_C at _01KICIPPFI@?2?$AA@"
+// CHECK: @"\01??_C at _01OHGJGJJP@?$FL?$AA@"
+// CHECK: @"\01??_C at _01POHCFINO@Z?$AA@"
+// CHECK: @"\01??_C at _01NFFPALBN@Y?$AA@"
+// CHECK: @"\01??_C at _01MMEEDKFM@X?$AA@"
+// CHECK: @"\01??_C at _01ELNMCGJD@W?$AA@"
+// CHECK: @"\01??_C at _01FCMHBHNC@V?$AA@"
+// CHECK: @"\01??_C at _01HJOKEEBB@U?$AA@"
+// CHECK: @"\01??_C at _01GAPBHFFA@T?$AA@"
+// CHECK: @"\01??_C at _01CPLAODJH@S?$AA@"
+// CHECK: @"\01??_C at _01DGKLNCNG@R?$AA@"
+// CHECK: @"\01??_C at _01BNIGIBBF@Q?$AA@"
+// CHECK: @"\01??_C at _01EJNLAFE@P?$AA@"
+// CHECK: @"\01??_C at _01MJMHLOMK@O?$AA@"
+// CHECK: @"\01??_C at _01NANMIPIL@N?$AA@"
+// CHECK: @"\01??_C at _01PLPBNMEI@M?$AA@"
+// CHECK: @"\01??_C at _01OCOKONAJ@L?$AA@"
+// CHECK: @"\01??_C at _01KNKLHLMO@K?$AA@"
+// CHECK: @"\01??_C at _01LELAEKIP@J?$AA@"
+// CHECK: @"\01??_C at _01JPJNBJEM@I?$AA@"
+// CHECK: @"\01??_C at _01IGIGCIAN@H?$AA@"
+// CHECK: @"\01??_C at _01BBODEMC@G?$AA@"
+// CHECK: @"\01??_C at _01BIAFAFID@F?$AA@"
+// CHECK: @"\01??_C at _01DDCIFGEA@E?$AA@"
+// CHECK: @"\01??_C at _01CKDDGHAB@D?$AA@"
+// CHECK: @"\01??_C at _01GFHCPBMG@C?$AA@"
+// CHECK: @"\01??_C at _01HMGJMAIH@B?$AA@"
+// CHECK: @"\01??_C at _01FHEEJDEE@A?$AA@"
+// CHECK: @"\01??_C at _01EOFPKCAF@?$EA?$AA@"
+// CHECK: @"\01??_C at _01OGPIMHDM@?$DP?$AA@"
+// CHECK: @"\01??_C at _01PPODPGHN@?$DO?$AA@"
+// CHECK: @"\01??_C at _01NEMOKFLO@?$DN?$AA@"
+// CHECK: @"\01??_C at _01MNNFJEPP@?$DM?$AA@"
+// CHECK: @"\01??_C at _01ICJEACDI@?$DL?$AA@"
+// CHECK: @"\01??_C at _01JLIPDDHJ@?3?$AA@"
+// CHECK: @"\01??_C at _01LAKCGALK@9?$AA@"
+// CHECK: @"\01??_C at _01KJLJFBPL@8?$AA@"
+// CHECK: @"\01??_C at _01COCBENDE@7?$AA@"
+// CHECK: @"\01??_C at _01DHDKHMHF@6?$AA@"
+// CHECK: @"\01??_C at _01BMBHCPLG@5?$AA@"
+// CHECK: @"\01??_C at _01FAMBOPH@4?$AA@"
+// CHECK: @"\01??_C at _01EKENIIDA@3?$AA@"
+// CHECK: @"\01??_C at _01FDFGLJHB@2?$AA@"
+// CHECK: @"\01??_C at _01HIHLOKLC@1?$AA@"
+// CHECK: @"\01??_C at _01GBGANLPD@0?$AA@"
+// CHECK: @"\01??_C at _01KMDKNFGN@?1?$AA@"
+// CHECK: @"\01??_C at _01LFCBOECM@?4?$AA@"
+// CHECK: @"\01??_C at _01JOAMLHOP@?9?$AA@"
+// CHECK: @"\01??_C at _01IHBHIGKO@?0?$AA@"
+// CHECK: @"\01??_C at _01MIFGBAGJ@?$CL?$AA@"
+// CHECK: @"\01??_C at _01NBENCBCI@?$CK?$AA@"
+// CHECK: @"\01??_C at _01PKGAHCOL@?$CJ?$AA@"
+// CHECK: @"\01??_C at _01ODHLEDKK@?$CI?$AA@"
+// CHECK: @"\01??_C at _01GEODFPGF@?8?$AA@"
+// CHECK: @"\01??_C at _01HNPIGOCE@?$CG?$AA@"
+// CHECK: @"\01??_C at _01FGNFDNOH@?$CF?$AA@"
+// CHECK: @"\01??_C at _01EPMOAMKG@$?$AA@"
+// CHECK: @"\01??_C at _01IPJKGB@?$CD?$AA@"
+// CHECK: @"\01??_C at _01BJJEKLCA@?$CC?$AA@"
+// CHECK: @"\01??_C at _01DCLJPIOD@?$CB?$AA@"
+// CHECK: @"\01??_C at _01CLKCMJKC@?5?$AA@"
+// CHECK: @"\01??_C at _01HDHMODJO@?$BP?$AA@"
+// CHECK: @"\01??_C at _01GKGHNCNP@?$BO?$AA@"
+// CHECK: @"\01??_C at _01EBEKIBBM@?$BN?$AA@"
+// CHECK: @"\01??_C at _01FIFBLAFN@?$BM?$AA@"
+// CHECK: @"\01??_C at _01BHBACGJK@?$BL?$AA@"
+// CHECK: @"\01??_C at _01OALBHNL@?$BK?$AA@"
+// CHECK: @"\01??_C at _01CFCGEEBI@?$BJ?$AA@"
+// CHECK: @"\01??_C at _01DMDNHFFJ@?$BI?$AA@"
+// CHECK: @"\01??_C at _01LLKFGJJG@?$BH?$AA@"
+// CHECK: @"\01??_C at _01KCLOFINH@?$BG?$AA@"
+// CHECK: @"\01??_C at _01IJJDALBE@?$BF?$AA@"
+// CHECK: @"\01??_C at _01JAIIDKFF@?$BE?$AA@"
+// CHECK: @"\01??_C at _01NPMJKMJC@?$BD?$AA@"
+// CHECK: @"\01??_C at _01MGNCJNND@?$BC?$AA@"
+// CHECK: @"\01??_C at _01ONPPMOBA@?$BB?$AA@"
+// CHECK: @"\01??_C at _01PEOEPPFB@?$BA?$AA@"
+// CHECK: @"\01??_C at _01DJLOPBMP@?$AP?$AA@"
+// CHECK: @"\01??_C at _01CAKFMAIO@?$AO?$AA@"
+// CHECK: @"\01??_C at _01LIIJDEN@?$AN?$AA@"
+// CHECK: @"\01??_C at _01BCJDKCAM@?$AM?$AA@"
+// CHECK: @"\01??_C at _01FNNCDEML@?$AL?$AA@"
+// CHECK: @"\01??_C at _01EEMJAFIK@?6?$AA@"
+// CHECK: @"\01??_C at _01GPOEFGEJ@?7?$AA@"
+// CHECK: @"\01??_C at _01HGPPGHAI@?$AI?$AA@"
+// CHECK: @"\01??_C at _01PBGHHLMH@?$AH?$AA@"
+// CHECK: @"\01??_C at _01OIHMEKIG@?$AG?$AA@"
+// CHECK: @"\01??_C at _01MDFBBJEF@?$AF?$AA@"
+// CHECK: @"\01??_C at _01NKEKCIAE@?$AE?$AA@"
+// CHECK: @"\01??_C at _01JFALLOMD@?$AD?$AA@"
+// CHECK: @"\01??_C at _01IMBAIPIC@?$AC?$AA@"
+// CHECK: @"\01??_C at _01KHDNNMEB@?$AB?$AA@"
+// CHECK: @"\01??_C at _01LOCGONAA@?$AA?$AA@"
+
+const wchar_t *wl9 = L"\t";
+const wchar_t *wl10 = L"\n";
+const wchar_t *wl11 = L"\v";
+const wchar_t *wl32 = L" ";
+const wchar_t *wl33 = L"!";
+const wchar_t *wl34 = L"\"";
+const wchar_t *wl35 = L"#";
+const wchar_t *wl36 = L"$";
+const wchar_t *wl37 = L"%";
+const wchar_t *wl38 = L"&";
+const wchar_t *wl39 = L"'";
+const wchar_t *wl40 = L"(";
+const wchar_t *wl41 = L")";
+const wchar_t *wl42 = L"*";
+const wchar_t *wl43 = L"+";
+const wchar_t *wl44 = L",";
+const wchar_t *wl45 = L"-";
+const wchar_t *wl46 = L".";
+const wchar_t *wl47 = L"/";
+const wchar_t *wl48 = L"0";
+const wchar_t *wl49 = L"1";
+const wchar_t *wl50 = L"2";
+const wchar_t *wl51 = L"3";
+const wchar_t *wl52 = L"4";
+const wchar_t *wl53 = L"5";
+const wchar_t *wl54 = L"6";
+const wchar_t *wl55 = L"7";
+const wchar_t *wl56 = L"8";
+const wchar_t *wl57 = L"9";
+const wchar_t *wl58 = L":";
+const wchar_t *wl59 = L";";
+const wchar_t *wl60 = L"<";
+const wchar_t *wl61 = L"=";
+const wchar_t *wl62 = L">";
+const wchar_t *wl63 = L"?";
+const wchar_t *wl64 = L"@";
+const wchar_t *wl65 = L"A";
+const wchar_t *wl66 = L"B";
+const wchar_t *wl67 = L"C";
+const wchar_t *wl68 = L"D";
+const wchar_t *wl69 = L"E";
+const wchar_t *wl70 = L"F";
+const wchar_t *wl71 = L"G";
+const wchar_t *wl72 = L"H";
+const wchar_t *wl73 = L"I";
+const wchar_t *wl74 = L"J";
+const wchar_t *wl75 = L"K";
+const wchar_t *wl76 = L"L";
+const wchar_t *wl77 = L"M";
+const wchar_t *wl78 = L"N";
+const wchar_t *wl79 = L"O";
+const wchar_t *wl80 = L"P";
+const wchar_t *wl81 = L"Q";
+const wchar_t *wl82 = L"R";
+const wchar_t *wl83 = L"S";
+const wchar_t *wl84 = L"T";
+const wchar_t *wl85 = L"U";
+const wchar_t *wl86 = L"V";
+const wchar_t *wl87 = L"W";
+const wchar_t *wl88 = L"X";
+const wchar_t *wl89 = L"Y";
+const wchar_t *wl90 = L"Z";
+const wchar_t *wl91 = L"[";
+const wchar_t *wl92 = L"\\";
+const wchar_t *wl93 = L"]";
+const wchar_t *wl94 = L"^";
+const wchar_t *wl95 = L"_";
+const wchar_t *wl96 = L"`";
+const wchar_t *wl97 = L"a";
+const wchar_t *wl98 = L"b";
+const wchar_t *wl99 = L"c";
+const wchar_t *wl100 = L"d";
+const wchar_t *wl101 = L"e";
+const wchar_t *wl102 = L"f";
+const wchar_t *wl103 = L"g";
+const wchar_t *wl104 = L"h";
+const wchar_t *wl105 = L"i";
+const wchar_t *wl106 = L"j";
+const wchar_t *wl107 = L"k";
+const wchar_t *wl108 = L"l";
+const wchar_t *wl109 = L"m";
+const wchar_t *wl110 = L"n";
+const wchar_t *wl111 = L"o";
+const wchar_t *wl112 = L"p";
+const wchar_t *wl113 = L"q";
+const wchar_t *wl114 = L"r";
+const wchar_t *wl115 = L"s";
+const wchar_t *wl116 = L"t";
+const wchar_t *wl117 = L"u";
+const wchar_t *wl118 = L"v";
+const wchar_t *wl119 = L"w";
+const wchar_t *wl120 = L"x";
+const wchar_t *wl121 = L"y";
+const wchar_t *wl122 = L"z";
+const wchar_t *wl123 = L"{";
+const wchar_t *wl124 = L"|";
+const wchar_t *wl125 = L"}";
+const wchar_t *wl126 = L"~";
+
+// CHECK: @"\01??_C at _13KDLDGPGJ@?$AA?7?$AA?$AA@"
+// CHECK: @"\01??_C at _13LBAGMAIH@?$AA?6?$AA?$AA@"
+// CHECK: @"\01??_C at _13JLKKHOC@?$AA?$AL?$AA?$AA@"
+// CHECK: @"\01??_C at _13HOIJIPNN@?$AA?5?$AA?$AA@"
+// CHECK: @"\01??_C at _13MGDFOILI@?$AA?$CB?$AA?$AA@"
+// CHECK: @"\01??_C at _13NEIAEHFG@?$AA?$CC?$AA?$AA@"
+// CHECK: @"\01??_C at _13GMDMCADD@?$AA?$CD?$AA?$AA@"
+// CHECK: @"\01??_C at _13PBOLBIIK@?$AA$?$AA?$AA@"
+// CHECK: @"\01??_C at _13EJFHHPOP@?$AA?$CF?$AA?$AA@"
+// CHECK: @"\01??_C at _13FLOCNAAB@?$AA?$CG?$AA?$AA@"
+// CHECK: @"\01??_C at _13ODFOLHGE@?$AA?8?$AA?$AA@"
+// CHECK: @"\01??_C at _13LLDNKHDC@?$AA?$CI?$AA?$AA@"
+// CHECK: @"\01??_C at _13DIBMAFH@?$AA?$CJ?$AA?$AA@"
+// CHECK: @"\01??_C at _13BBDEGPLJ@?$AA?$CK?$AA?$AA@"
+// CHECK: @"\01??_C at _13KJIIAINM@?$AA?$CL?$AA?$AA@"
+// CHECK: @"\01??_C at _13DEFPDAGF@?$AA?0?$AA?$AA@"
+// CHECK: @"\01??_C at _13IMODFHAA@?$AA?9?$AA?$AA@"
+// CHECK: @"\01??_C at _13JOFGPIOO@?$AA?4?$AA?$AA@"
+// CHECK: @"\01??_C at _13CGOKJPIL@?$AA?1?$AA?$AA@"
+// CHECK: @"\01??_C at _13COJANIEC@?$AA0?$AA?$AA@"
+// CHECK: @"\01??_C at _13JGCMLPCH@?$AA1?$AA?$AA@"
+// CHECK: @"\01??_C at _13IEJJBAMJ@?$AA2?$AA?$AA@"
+// CHECK: @"\01??_C at _13DMCFHHKM@?$AA3?$AA?$AA@"
+// CHECK: @"\01??_C at _13KBPCEPBF@?$AA4?$AA?$AA@"
+// CHECK: @"\01??_C at _13BJEOCIHA@?$AA5?$AA?$AA@"
+// CHECK: @"\01??_C at _13LPLIHJO@?$AA6?$AA?$AA@"
+// CHECK: @"\01??_C at _13LDEHOAPL@?$AA7?$AA?$AA@"
+// CHECK: @"\01??_C at _13OLCEPAKN@?$AA8?$AA?$AA@"
+// CHECK: @"\01??_C at _13FDJIJHMI@?$AA9?$AA?$AA@"
+// CHECK: @"\01??_C at _13EBCNDICG@?$AA?3?$AA?$AA@"
+// CHECK: @"\01??_C at _13PJJBFPED@?$AA?$DL?$AA?$AA@"
+// CHECK: @"\01??_C at _13GEEGGHPK@?$AA?$DM?$AA?$AA@"
+// CHECK: @"\01??_C at _13NMPKAAJP@?$AA?$DN?$AA?$AA@"
+// CHECK: @"\01??_C at _13MOEPKPHB@?$AA?$DO?$AA?$AA@"
+// CHECK: @"\01??_C at _13HGPDMIBE@?$AA?$DP?$AA?$AA@"
+// CHECK: @"\01??_C at _13EFKPHINO@?$AA?$EA?$AA?$AA@"
+// CHECK: @"\01??_C at _13PNBDBPLL@?$AAA?$AA?$AA@"
+// CHECK: @"\01??_C at _13OPKGLAFF@?$AAB?$AA?$AA@"
+// CHECK: @"\01??_C at _13FHBKNHDA@?$AAC?$AA?$AA@"
+// CHECK: @"\01??_C at _13MKMNOPIJ@?$AAD?$AA?$AA@"
+// CHECK: @"\01??_C at _13HCHBIIOM@?$AAE?$AA?$AA@"
+// CHECK: @"\01??_C at _13GAMECHAC@?$AAF?$AA?$AA@"
+// CHECK: @"\01??_C at _13NIHIEAGH@?$AAG?$AA?$AA@"
+// CHECK: @"\01??_C at _13IABLFADB@?$AAH?$AA?$AA@"
+// CHECK: @"\01??_C at _13DIKHDHFE@?$AAI?$AA?$AA@"
+// CHECK: @"\01??_C at _13CKBCJILK@?$AAJ?$AA?$AA@"
+// CHECK: @"\01??_C at _13JCKOPPNP@?$AAK?$AA?$AA@"
+// CHECK: @"\01??_C at _13PHJMHGG@?$AAL?$AA?$AA@"
+// CHECK: @"\01??_C at _13LHMFKAAD@?$AAM?$AA?$AA@"
+// CHECK: @"\01??_C at _13KFHAAPON@?$AAN?$AA?$AA@"
+// CHECK: @"\01??_C at _13BNMMGIII@?$AAO?$AA?$AA@"
+// CHECK: @"\01??_C at _13BFLGCPEB@?$AAP?$AA?$AA@"
+// CHECK: @"\01??_C at _13KNAKEICE@?$AAQ?$AA?$AA@"
+// CHECK: @"\01??_C at _13LPLPOHMK@?$AAR?$AA?$AA@"
+// CHECK: @"\01??_C at _13HADIAKP@?$AAS?$AA?$AA@"
+// CHECK: @"\01??_C at _13JKNELIBG@?$AAT?$AA?$AA@"
+// CHECK: @"\01??_C at _13CCGINPHD@?$AAU?$AA?$AA@"
+// CHECK: @"\01??_C at _13DANNHAJN@?$AAV?$AA?$AA@"
+// CHECK: @"\01??_C at _13IIGBBHPI@?$AAW?$AA?$AA@"
+// CHECK: @"\01??_C at _13NAACAHKO@?$AAX?$AA?$AA@"
+// CHECK: @"\01??_C at _13GILOGAML@?$AAY?$AA?$AA@"
+// CHECK: @"\01??_C at _13HKALMPCF@?$AAZ?$AA?$AA@"
+// CHECK: @"\01??_C at _13MCLHKIEA@?$AA?$FL?$AA?$AA@"
+// CHECK: @"\01??_C at _13FPGAJAPJ@?$AA?2?$AA?$AA@"
+// CHECK: @"\01??_C at _13OHNMPHJM@?$AA?$FN?$AA?$AA@"
+// CHECK: @"\01??_C at _13PFGJFIHC@?$AA?$FO?$AA?$AA@"
+// CHECK: @"\01??_C at _13ENNFDPBH@?$AA_?$AA?$AA@"
+// CHECK: @"\01??_C at _13OFJNNHOA@?$AA?$GA?$AA?$AA@"
+// CHECK: @"\01??_C at _13FNCBLAIF@?$AAa?$AA?$AA@"
+// CHECK: @"\01??_C at _13EPJEBPGL@?$AAb?$AA?$AA@"
+// CHECK: @"\01??_C at _13PHCIHIAO@?$AAc?$AA?$AA@"
+// CHECK: @"\01??_C at _13GKPPEALH@?$AAd?$AA?$AA@"
+// CHECK: @"\01??_C at _13NCEDCHNC@?$AAe?$AA?$AA@"
+// CHECK: @"\01??_C at _13MAPGIIDM@?$AAf?$AA?$AA@"
+// CHECK: @"\01??_C at _13HIEKOPFJ@?$AAg?$AA?$AA@"
+// CHECK: @"\01??_C at _13CACJPPAP@?$AAh?$AA?$AA@"
+// CHECK: @"\01??_C at _13JIJFJIGK@?$AAi?$AA?$AA@"
+// CHECK: @"\01??_C at _13IKCADHIE@?$AAj?$AA?$AA@"
+// CHECK: @"\01??_C at _13DCJMFAOB@?$AAk?$AA?$AA@"
+// CHECK: @"\01??_C at _13KPELGIFI@?$AAl?$AA?$AA@"
+// CHECK: @"\01??_C at _13BHPHAPDN@?$AAm?$AA?$AA@"
+// CHECK: @"\01??_C at _13FECKAND@?$AAn?$AA?$AA@"
+// CHECK: @"\01??_C at _13LNPOMHLG@?$AAo?$AA?$AA@"
+// CHECK: @"\01??_C at _13LFIEIAHP@?$AAp?$AA?$AA@"
+// CHECK: @"\01??_C at _13NDIOHBK@?$AAq?$AA?$AA@"
+// CHECK: @"\01??_C at _13BPINEIPE@?$AAr?$AA?$AA@"
+// CHECK: @"\01??_C at _13KHDBCPJB@?$AAs?$AA?$AA@"
+// CHECK: @"\01??_C at _13DKOGBHCI@?$AAt?$AA?$AA@"
+// CHECK: @"\01??_C at _13ICFKHAEN@?$AAu?$AA?$AA@"
+// CHECK: @"\01??_C at _13JAOPNPKD@?$AAv?$AA?$AA@"
+// CHECK: @"\01??_C at _13CIFDLIMG@?$AAw?$AA?$AA@"
+// CHECK: @"\01??_C at _13HADAKIJA@?$AAx?$AA?$AA@"
+// CHECK: @"\01??_C at _13MIIMMPPF@?$AAy?$AA?$AA@"
+// CHECK: @"\01??_C at _13NKDJGABL@?$AAz?$AA?$AA@"
+// CHECK: @"\01??_C at _13GCIFAHHO@?$AA?$HL?$AA?$AA@"
+// CHECK: @"\01??_C at _13PPFCDPMH@?$AA?$HM?$AA?$AA@"
+// CHECK: @"\01??_C at _13EHOOFIKC@?$AA?$HN?$AA?$AA@"
+// CHECK: @"\01??_C at _13FFFLPHEM@?$AA?$HO?$AA?$AA@"
+
+const char *LongASCIIString = "012345678901234567890123456789ABCDEF";
+// CHECK: @"\01??_C at _0CF@LABBIIMO at 012345678901234567890123456789AB@"
+const wchar_t *LongWideString = L"012345678901234567890123456789ABCDEF";
+// CHECK: @"\01??_C at _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@"





More information about the cfe-commits mailing list