<div dir="ltr">Thanks for the fix!</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, May 14, 2013 at 5:32 PM, David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote"><div><div class="h5">On Tue, May 14, 2013 at 1:30 PM, Reid Kleckner <span dir="ltr"><<a href="mailto:reid@kleckner.net" target="_blank">reid@kleckner.net</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rnk<br>
Date: Tue May 14 15:30:42 2013<br>
New Revision: 181825<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=181825&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=181825&view=rev</a><br>
Log:<br>
[ms-cxxabi] Mangle in an implicit 'E' for certain types on win64<br>
<br>
Most of the complexity of this patch is figuring out which types get the<br>
qualifier and which don't.  If we implement __ptr32/64, then we should<br>
check the qualifier instead of assuming all pointers are 64-bit.<br>
<br>
This fixes PR13792.<br>
<br>
Patch by Warren Hunt!<br>
<br>
Modified:<br>
    cfe/trunk/lib/AST/MicrosoftMangle.cpp<br>
    cfe/trunk/lib/AST/RecordLayoutBuilder.cpp<br>
    cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp<br>
    cfe/trunk/test/CodeGenCXX/mangle-ms-templates.cpp<br>
    cfe/trunk/test/CodeGenCXX/mangle-ms.cpp<br>
<br>
Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=181825&r1=181824&r2=181825&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=181825&r1=181824&r2=181825&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/lib/AST/MicrosoftMangle.cpp (original)<br>
+++ cfe/trunk/lib/AST/MicrosoftMangle.cpp Tue May 14 15:30:42 2013<br>
@@ -22,6 +22,7 @@<br>
 #include "clang/AST/ExprCXX.h"<br>
 #include "clang/Basic/ABI.h"<br>
 #include "clang/Basic/DiagnosticOptions.h"<br>
+#include "clang/Basic/TargetInfo.h"<br>
 #include <map><br>
<br>
 using namespace clang;<br>
@@ -58,18 +59,26 @@ class MicrosoftCXXNameMangler {<br>
<br>
   ASTContext &getASTContext() const { return Context.getASTContext(); }<br>
<br>
+  // FIXME: If we add support for __ptr32/64 qualifiers, then we should push<br>
+  // this check into mangleQualifiers().<br>
+  const bool PointersAre64Bit;<br>
+<br>
 public:<br>
   enum QualifierMangleMode { QMM_Drop, QMM_Mangle, QMM_Escape, QMM_Result };<br>
<br>
   MicrosoftCXXNameMangler(MangleContext &C, raw_ostream &Out_)<br>
     : Context(C), Out(Out_),<br>
       Structor(0), StructorType(-1),<br>
+      PointersAre64Bit(C.getASTContext().getTargetInfo().getPointerWidth(0) ==<br>
+                       64),<br></blockquote><div><br></div></div></div><div>Fixed a -Wreorder warning here & below in r181834</div><div><div class="h5"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


       UseNameBackReferences(true) { }<br>
<br>
   MicrosoftCXXNameMangler(MangleContext &C, raw_ostream &Out_,<br>
                           const CXXDestructorDecl *D, CXXDtorType Type)<br>
     : Context(C), Out(Out_),<br>
       Structor(getStructor(D)), StructorType(Type),<br>
+      PointersAre64Bit(C.getASTContext().getTargetInfo().getPointerWidth(0) ==<br>
+                       64),<br>
       UseNameBackReferences(true) { }<br>
<br>
   raw_ostream &getStream() const { return Out; }<br>
@@ -1228,32 +1237,36 @@ void MicrosoftCXXNameMangler::mangleFunc<br>
 }<br>
<br>
 void MicrosoftCXXNameMangler::mangleFunctionClass(const FunctionDecl *FD) {<br>
-  // <function-class> ::= A # private: near<br>
-  //                  ::= B # private: far<br>
-  //                  ::= C # private: static near<br>
-  //                  ::= D # private: static far<br>
-  //                  ::= E # private: virtual near<br>
-  //                  ::= F # private: virtual far<br>
-  //                  ::= G # private: thunk near<br>
-  //                  ::= H # private: thunk far<br>
-  //                  ::= I # protected: near<br>
-  //                  ::= J # protected: far<br>
-  //                  ::= K # protected: static near<br>
-  //                  ::= L # protected: static far<br>
-  //                  ::= M # protected: virtual near<br>
-  //                  ::= N # protected: virtual far<br>
-  //                  ::= O # protected: thunk near<br>
-  //                  ::= P # protected: thunk far<br>
-  //                  ::= Q # public: near<br>
-  //                  ::= R # public: far<br>
-  //                  ::= S # public: static near<br>
-  //                  ::= T # public: static far<br>
-  //                  ::= U # public: virtual near<br>
-  //                  ::= V # public: virtual far<br>
-  //                  ::= W # public: thunk near<br>
-  //                  ::= X # public: thunk far<br>
-  //                  ::= Y # global near<br>
-  //                  ::= Z # global far<br>
+  // <function-class>  ::= <member-function> E? # E designates a 64-bit 'this'<br>
+  //                                            # pointer. in 64-bit mode *all*<br>
+  //                                            # 'this' pointers are 64-bit.<br>
+  //                   ::= <global-function><br>
+  // <member-function> ::= A # private: near<br>
+  //                   ::= B # private: far<br>
+  //                   ::= C # private: static near<br>
+  //                   ::= D # private: static far<br>
+  //                   ::= E # private: virtual near<br>
+  //                   ::= F # private: virtual far<br>
+  //                   ::= G # private: thunk near<br>
+  //                   ::= H # private: thunk far<br>
+  //                   ::= I # protected: near<br>
+  //                   ::= J # protected: far<br>
+  //                   ::= K # protected: static near<br>
+  //                   ::= L # protected: static far<br>
+  //                   ::= M # protected: virtual near<br>
+  //                   ::= N # protected: virtual far<br>
+  //                   ::= O # protected: thunk near<br>
+  //                   ::= P # protected: thunk far<br>
+  //                   ::= Q # public: near<br>
+  //                   ::= R # public: far<br>
+  //                   ::= S # public: static near<br>
+  //                   ::= T # public: static far<br>
+  //                   ::= U # public: virtual near<br>
+  //                   ::= V # public: virtual far<br>
+  //                   ::= W # public: thunk near<br>
+  //                   ::= X # public: thunk far<br>
+  // <global-function> ::= Y # global near<br>
+  //                   ::= Z # global far<br>
   if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {<br>
     switch (MD->getAccess()) {<br>
       default:<br>
@@ -1281,6 +1294,8 @@ void MicrosoftCXXNameMangler::mangleFunc<br>
         else<br>
           Out << 'Q';<br>
     }<br>
+    if (PointersAre64Bit && !MD->isStatic())<br>
+      Out << 'E';<br>
   } else<br>
     Out << 'Y';<br>
 }<br>
@@ -1380,9 +1395,9 @@ void MicrosoftCXXNameMangler::mangleType<br>
 // <type>       ::= <array-type><br>
 // <array-type> ::= <pointer-cvr-qualifiers> <cvr-qualifiers><br>
 //                  [Y <dimension-count> <dimension>+]<br>
-//                  <element-type> # as global<br>
-//              ::= Q <cvr-qualifiers> [Y <dimension-count> <dimension>+]<br>
-//                  <element-type> # as param<br>
+//                  <element-type> # as global, E is never required<br>
+//              ::= Q E? <cvr-qualifiers> [Y <dimension-count> <dimension>+]<br>
+//                  <element-type> # as param, E is required for 64-bit<br>
 // It's supposed to be the other way around, but for some strange reason, it<br>
 // isn't. Today this behavior is retained for the sole purpose of backwards<br>
 // compatibility.<br>
@@ -1394,6 +1409,8 @@ void MicrosoftCXXNameMangler::mangleDeca<br>
     manglePointerQualifiers(T->getElementType().getQualifiers());<br>
   } else {<br>
     Out << 'Q';<br>
+    if (PointersAre64Bit)<br>
+      Out << 'E';<br>
   }<br>
   mangleType(T->getElementType(), SourceRange());<br>
 }<br>
@@ -1494,10 +1511,13 @@ void MicrosoftCXXNameMangler::mangleType<br>
 }<br>
<br>
 // <type> ::= <pointer-type><br>
-// <pointer-type> ::= <pointer-cvr-qualifiers> <cvr-qualifiers> <type><br>
+// <pointer-type> ::= E? <pointer-cvr-qualifiers> <cvr-qualifiers> <type><br>
+//                       # the E is required for 64-bit non static pointers<br>
 void MicrosoftCXXNameMangler::mangleType(const PointerType *T,<br>
                                          SourceRange Range) {<br>
   QualType PointeeTy = T->getPointeeType();<br>
+  if (PointersAre64Bit && !T->getPointeeType()->isFunctionType())<br>
+    Out << 'E';<br>
   mangleType(PointeeTy, Range);<br>
 }<br>
 void MicrosoftCXXNameMangler::mangleType(const ObjCObjectPointerType *T,<br>
@@ -1508,18 +1528,24 @@ void MicrosoftCXXNameMangler::mangleType<br>
 }<br>
<br>
 // <type> ::= <reference-type><br>
-// <reference-type> ::= A <cvr-qualifiers> <type><br>
+// <reference-type> ::= A E? <cvr-qualifiers> <type><br>
+//                 # the E is required for 64-bit non static lvalue references<br>
 void MicrosoftCXXNameMangler::mangleType(const LValueReferenceType *T,<br>
                                          SourceRange Range) {<br>
   Out << 'A';<br>
+  if (PointersAre64Bit && !T->getPointeeType()->isFunctionType())<br>
+    Out << 'E';<br>
   mangleType(T->getPointeeType(), Range);<br>
 }<br>
<br>
 // <type> ::= <r-value-reference-type><br>
-// <r-value-reference-type> ::= $$Q <cvr-qualifiers> <type><br>
+// <r-value-reference-type> ::= $$Q E? <cvr-qualifiers> <type><br>
+//                 # the E is required for 64-bit non static rvalue references<br>
 void MicrosoftCXXNameMangler::mangleType(const RValueReferenceType *T,<br>
                                          SourceRange Range) {<br>
   Out << "$$Q";<br>
+  if (PointersAre64Bit && !T->getPointeeType()->isFunctionType())<br>
+    Out << 'E';<br>
   mangleType(T->getPointeeType(), Range);<br>
 }<br>
<br>
<br>
Modified: cfe/trunk/lib/AST/RecordLayoutBuilder.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayoutBuilder.cpp?rev=181825&r1=181824&r2=181825&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayoutBuilder.cpp?rev=181825&r1=181824&r2=181825&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/lib/AST/RecordLayoutBuilder.cpp (original)<br>
+++ cfe/trunk/lib/AST/RecordLayoutBuilder.cpp Tue May 14 15:30:42 2013<br>
@@ -211,7 +211,7 @@ void EmptySubobjectMap::AddSubobjectAtOf<br>
   if (!RD->isEmpty())<br>
     return;<br>
<br>
-  // If we have empty structures inside an union, we can assign both<br>
+  // If we have empty structures inside a union, we can assign both<br>
   // the same offset. Just avoid pushing them twice in the list.<br>
   ClassVectorTy& Classes = EmptyClassOffsets[Offset];<br>
   if (std::find(Classes.begin(), Classes.end(), RD) != Classes.end())<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp?rev=181825&r1=181824&r2=181825&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp?rev=181825&r1=181824&r2=181825&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp Tue May 14 15:30:42 2013<br>
@@ -1,123 +1,164 @@<br>
 // RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s<br>
+// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=x86_64-pc-win32 | FileCheck -check-prefix=X64 %s<br>
<br>
 void foo(const unsigned int) {}<br>
 // CHECK: "\01?foo@@YAXI@Z"<br>
+// X64: "\01?foo@@YAXI@Z"<br>
<br>
 void foo(const double) {}<br>
 // CHECK: "\01?foo@@YAXN@Z"<br>
+// X64: "\01?foo@@YAXN@Z"<br>
<br>
 void bar(const volatile double) {}<br>
 // CHECK: "\01?bar@@YAXN@Z"<br>
+// X64: "\01?bar@@YAXN@Z"<br>
<br>
 void foo_pad(char * x) {}<br>
 // CHECK: "\01?foo_pad@@YAXPAD@Z"<br>
+// X64: "\01?foo_pad@@YAXPEAD@Z"<br>
<br>
 void foo_pbd(const char * x) {}<br>
 // CHECK: "\01?foo_pbd@@YAXPBD@Z"<br>
+// X64: "\01?foo_pbd@@YAXPEBD@Z"<br>
<br>
 void foo_pcd(volatile char * x) {}<br>
 // CHECK: "\01?foo_pcd@@YAXPCD@Z"<br>
+// X64: "\01?foo_pcd@@YAXPECD@Z"<br>
<br>
 void foo_qad(char * const x) {}<br>
 // CHECK: "\01?foo_qad@@YAXQAD@Z"<br>
+// X64: "\01?foo_qad@@YAXQEAD@Z"<br>
<br>
 void foo_rad(char * volatile x) {}<br>
 // CHECK: "\01?foo_rad@@YAXRAD@Z"<br>
+// X64: "\01?foo_rad@@YAXREAD@Z"<br>
<br>
 void foo_sad(char * const volatile x) {}<br>
 // CHECK: "\01?foo_sad@@YAXSAD@Z"<br>
+// X64: "\01?foo_sad@@YAXSEAD@Z"<br>
<br>
 void foo_papad(char ** x) {}<br>
 // CHECK: "\01?foo_papad@@YAXPAPAD@Z"<br>
+// X64: "\01?foo_papad@@YAXPEAPEAD@Z"<br>
<br>
 void foo_papbd(char const ** x) {}<br>
 // CHECK: "\01?foo_papbd@@YAXPAPBD@Z"<br>
+// X64: "\01?foo_papbd@@YAXPEAPEBD@Z"<br>
<br>
 void foo_papcd(char volatile ** x) {}<br>
 // CHECK: "\01?foo_papcd@@YAXPAPCD@Z"<br>
+// X64: "\01?foo_papcd@@YAXPEAPECD@Z"<br>
<br>
 void foo_pbqad(char * const* x) {}<br>
 // CHECK: "\01?foo_pbqad@@YAXPBQAD@Z"<br>
+// X64: "\01?foo_pbqad@@YAXPEBQEAD@Z"<br>
<br>
 void foo_pcrad(char * volatile* x) {}<br>
 // CHECK: "\01?foo_pcrad@@YAXPCRAD@Z"<br>
+// X64: "\01?foo_pcrad@@YAXPECREAD@Z"<br>
<br>
 void foo_qapad(char ** const x) {}<br>
 // CHECK: "\01?foo_qapad@@YAXQAPAD@Z"<br>
+// X64: "\01?foo_qapad@@YAXQEAPEAD@Z"<br>
<br>
 void foo_rapad(char ** volatile x) {}<br>
 // CHECK: "\01?foo_rapad@@YAXRAPAD@Z"<br>
+// X64: "\01?foo_rapad@@YAXREAPEAD@Z"<br>
<br>
 void foo_pbqbd(const char * const* x) {}<br>
 // CHECK: "\01?foo_pbqbd@@YAXPBQBD@Z"<br>
+// X64: "\01?foo_pbqbd@@YAXPEBQEBD@Z"<br>
<br>
 void foo_pbqcd(volatile char * const* x) {}<br>
 // CHECK: "\01?foo_pbqcd@@YAXPBQCD@Z"<br>
+// X64: "\01?foo_pbqcd@@YAXPEBQECD@Z"<br>
<br>
 void foo_pcrbd(const char * volatile* x) {}<br>
 // CHECK: "\01?foo_pcrbd@@YAXPCRBD@Z"<br>
+// X64: "\01?foo_pcrbd@@YAXPECREBD@Z"<br>
<br>
 void foo_pcrcd(volatile char * volatile* x) {}<br>
 // CHECK: "\01?foo_pcrcd@@YAXPCRCD@Z"<br>
+// X64: "\01?foo_pcrcd@@YAXPECRECD@Z"<br>
<br>
 void foo_aad(char &x) {}<br>
 // CHECK: "\01?foo_aad@@YAXAAD@Z"<br>
+// X64: "\01?foo_aad@@YAXAEAD@Z"<br>
<br>
 void foo_abd(const char &x) {}<br>
 // CHECK: "\01?foo_abd@@YAXABD@Z"<br>
+// X64: "\01?foo_abd@@YAXAEBD@Z"<br>
<br>
 void foo_aapad(char *&x) {}<br>
 // CHECK: "\01?foo_aapad@@YAXAAPAD@Z"<br>
+// X64: "\01?foo_aapad@@YAXAEAPEAD@Z"<br>
<br>
 void foo_aapbd(const char *&x) {}<br>
 // CHECK: "\01?foo_aapbd@@YAXAAPBD@Z"<br>
+// X64: "\01?foo_aapbd@@YAXAEAPEBD@Z"<br>
<br>
 void foo_abqad(char * const &x) {}<br>
 // CHECK: "\01?foo_abqad@@YAXABQAD@Z"<br>
+// X64: "\01?foo_abqad@@YAXAEBQEAD@Z"<br>
<br>
 void foo_abqbd(const char * const &x) {}<br>
 // CHECK: "\01?foo_abqbd@@YAXABQBD@Z"<br>
+// X64: "\01?foo_abqbd@@YAXAEBQEBD@Z"<br>
<br>
 void foo_aay144h(int (&x)[5][5]) {}<br>
 // CHECK: "\01?foo_aay144h@@YAXAAY144H@Z"<br>
+// X64: "\01?foo_aay144h@@YAXAEAY144H@Z"<br>
<br>
 void foo_aay144cbh(const int (&x)[5][5]) {}<br>
 // CHECK: "\01?foo_aay144cbh@@YAXAAY144$$CBH@Z"<br>
+// X64: "\01?foo_aay144cbh@@YAXAEAY144$$CBH@Z"<br>
<br>
 void foo_qay144h(int (&&x)[5][5]) {}<br>
 // CHECK: "\01?foo_qay144h@@YAX$$QAY144H@Z"<br>
+// X64: "\01?foo_qay144h@@YAX$$QEAY144H@Z"<br>
<br>
 void foo_qay144cbh(const int (&&x)[5][5]) {}<br>
 // CHECK: "\01?foo_qay144cbh@@YAX$$QAY144$$CBH@Z"<br>
+// X64: "\01?foo_qay144cbh@@YAX$$QEAY144$$CBH@Z"<br>
<br>
 void foo_p6ahxz(int x()) {}<br>
 // CHECK: "\01?foo_p6ahxz@@YAXP6AHXZ@Z"<br>
+// X64: "\01?foo_p6ahxz@@YAXP6AHXZ@Z"<br>
<br>
 void foo_a6ahxz(int (&x)()) {}<br>
 // CHECK: "\01?foo_a6ahxz@@YAXA6AHXZ@Z"<br>
+// X64: "\01?foo_a6ahxz@@YAXA6AHXZ@Z"<br>
<br>
 void foo_q6ahxz(int (&&x)()) {}<br>
 // CHECK: "\01?foo_q6ahxz@@YAX$$Q6AHXZ@Z"<br>
+// X64: "\01?foo_q6ahxz@@YAX$$Q6AHXZ@Z"<br>
<br>
 void foo_qay04h(int x[5][5]) {}<br>
 // CHECK: "\01?foo_qay04h@@YAXQAY04H@Z"<br>
+// X64: "\01?foo_qay04h@@YAXQEAY04H@Z"<br>
<br>
 void foo_qay04cbh(const int x[5][5]) {}<br>
 // CHECK: "\01?foo_qay04cbh@@YAXQAY04$$CBH@Z"<br>
+// X64: "\01?foo_qay04cbh@@YAXQEAY04$$CBH@Z"<br>
<br>
 typedef double Vector[3];<br>
<br>
 void foo(Vector*) {}<br>
 // CHECK: "\01?foo@@YAXPAY02N@Z"<br>
+// X64: "\01?foo@@YAXPEAY02N@Z"<br>
<br>
 void foo(Vector) {}<br>
 // CHECK: "\01?foo@@YAXQAN@Z"<br>
+// X64: "\01?foo@@YAXQEAN@Z"<br>
<br>
 void foo_const(const Vector) {}<br>
 // CHECK: "\01?foo_const@@YAXQBN@Z"<br>
+// X64: "\01?foo_const@@YAXQEBN@Z"<br>
<br>
 void foo_volatile(volatile Vector) {}<br>
 // CHECK: "\01?foo_volatile@@YAXQCN@Z"<br>
+// X64: "\01?foo_volatile@@YAXQECN@Z"<br>
<br>
 void foo(Vector*, const Vector, const double) {}<br>
 // CHECK: "\01?foo@@YAXPAY02NQBNN@Z"<br>
+// X64: "\01?foo@@YAXPEAY02NQEBNN@Z"<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/mangle-ms-templates.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms-templates.cpp?rev=181825&r1=181824&r2=181825&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms-templates.cpp?rev=181825&r1=181824&r2=181825&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/mangle-ms-templates.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/mangle-ms-templates.cpp Tue May 14 15:30:42 2013<br>
@@ -1,4 +1,5 @@<br>
-// RUN: %clang_cc1 -fms-extensions -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s<br>
+// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s<br>
+// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=x86_64-pc-win32 | FileCheck -check-prefix X64 %s<br>
<br>
 template<typename T><br>
 class Class {<br>
@@ -33,65 +34,87 @@ class BoolTemplate<true> {<br>
 void template_mangling() {<br>
   Class<Typename> c1;<br>
 // CHECK: call {{.*}} @"\01??0?$Class@VTypename@@@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$Class@VTypename@@@@QEAA@XZ"<br>
<br>
   Class<const Typename> c1_const;<br>
 // CHECK: call {{.*}} @"\01??0?$Class@$$CBVTypename@@@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$Class@$$CBVTypename@@@@QEAA@XZ"<br>
   Class<volatile Typename> c1_volatile;<br>
 // CHECK: call {{.*}} @"\01??0?$Class@$$CCVTypename@@@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$Class@$$CCVTypename@@@@QEAA@XZ"<br>
   Class<const volatile Typename> c1_cv;<br>
 // CHECK: call {{.*}} @"\01??0?$Class@$$CDVTypename@@@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$Class@$$CDVTypename@@@@QEAA@XZ"<br>
<br>
   Class<Nested<Typename> > c2;<br>
 // CHECK: call {{.*}} @"\01??0?$Class@V?$Nested@VTypename@@@@@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$Class@V?$Nested@VTypename@@@@@@QEAA@XZ"<br>
<br>
   Class<int * const> c_intpc;<br>
 // CHECK: call {{.*}} @"\01??0?$Class@QAH@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$Class@QEAH@@QEAA@XZ"<br>
   Class<int()> c_ft;<br>
 // CHECK: call {{.*}} @"\01??0?$Class@$$A6AHXZ@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$Class@$$A6AHXZ@@QEAA@XZ"<br>
   Class<int[]> c_inti;<br>
 // CHECK: call {{.*}} @"\01??0?$Class@$$BY0A@H@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$Class@$$BY0A@H@@QEAA@XZ"<br>
   Class<int[5]> c_int5;<br>
 // CHECK: call {{.*}} @"\01??0?$Class@$$BY04H@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$Class@$$BY04H@@QEAA@XZ"<br>
   Class<const int[5]> c_intc5;<br>
 // CHECK: call {{.*}} @"\01??0?$Class@$$BY04$$CBH@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$Class@$$BY04$$CBH@@QEAA@XZ"<br>
   Class<int * const[5]> c_intpc5;<br>
 // CHECK: call {{.*}} @"\01??0?$Class@$$BY04QAH@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$Class@$$BY04QEAH@@QEAA@XZ"<br>
<br>
   BoolTemplate<false> _false;<br>
 // CHECK: call {{.*}} @"\01??0?$BoolTemplate@$0A@@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$BoolTemplate@$0A@@@QEAA@XZ"<br>
<br>
   BoolTemplate<true> _true;<br>
   // PR13158<br>
   _true.Foo(1);<br>
 // CHECK: call {{.*}} @"\01??0?$BoolTemplate@$00@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$BoolTemplate@$00@@QEAA@XZ"<br>
 // CHECK: call {{.*}} @"\01??$Foo@H@?$BoolTemplate@$00@@QAEXH@Z"<br>
+// X64: call {{.*}} @"\01??$Foo@H@?$BoolTemplate@$00@@QEAAXH@Z"<br>
<br>
   IntTemplate<0> zero;<br>
 // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0A@@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$IntTemplate@$0A@@@QEAA@XZ"<br>
<br>
   IntTemplate<5> five;<br>
 // CHECK: call {{.*}} @"\01??0?$IntTemplate@$04@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$IntTemplate@$04@@QEAA@XZ"<br>
<br>
   IntTemplate<11> eleven;<br>
 // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0L@@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$IntTemplate@$0L@@@QEAA@XZ"<br>
<br>
   IntTemplate<256> _256;<br>
 // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0BAA@@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$IntTemplate@$0BAA@@@QEAA@XZ"<br>
<br>
   IntTemplate<513> _513;<br>
 // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0CAB@@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$IntTemplate@$0CAB@@@QEAA@XZ"<br>
<br>
   IntTemplate<1026> _1026;<br>
 // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0EAC@@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$IntTemplate@$0EAC@@@QEAA@XZ"<br>
<br>
   IntTemplate<65535> ffff;<br>
 // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0PPPP@@@QAE@XZ"<br>
+// X64: call {{.*}} @"\01??0?$IntTemplate@$0PPPP@@@QEAA@XZ"<br>
 }<br>
<br>
 namespace space {<br>
   template<class T> const T& foo(const T& l) { return l; }<br>
 }<br>
 // CHECK: "\01??$foo@H@space@@YAABHABH@Z"<br>
+// X64: "\01??$foo@H@space@@YAAEBHAEBH@Z"<br>
<br>
 void use() {<br>
   space::foo(42);<br>
@@ -108,4 +131,5 @@ void FunctionPointerTemplate() {<br>
 void spam() {<br>
   FunctionPointerTemplate<spam>();<br>
 // CHECK: "\01??$FunctionPointerTemplate@$1?spam@@YAXXZ@@YAXXZ"<br>
+// X64: "\01??$FunctionPointerTemplate@$1?spam@@YAXXZ@@YAXXZ"<br>
 }<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/mangle-ms.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms.cpp?rev=181825&r1=181824&r2=181825&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms.cpp?rev=181825&r1=181824&r2=181825&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/mangle-ms.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/mangle-ms.cpp Tue May 14 15:30:42 2013<br>
@@ -1,5 +1,5 @@<br>
-// RUN: %clang_cc1 -fms-extensions -fblocks -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s<br>
-// RUN: %clang_cc1 -fms-compatibility -fblocks -emit-llvm %s -o - -cxx-abi microsoft -triple=x86_64-pc-win32 | FileCheck -check-prefix X64 %s<br>
+// RUN: %clang_cc1 -fblocks -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s<br>
+// RUN: %clang_cc1 -fblocks -emit-llvm %s -o - -cxx-abi microsoft -triple=x86_64-pc-win32 | FileCheck -check-prefix X64 %s<br>
<br>
 // CHECK: @"\01?a@@3HA"<br>
 // CHECK: @"\01?b@N@@3HA"<br>
@@ -33,6 +33,7 @@ namespace N {<br>
 static int c;<br>
 int _c(void) {return N::anonymous + c;}<br>
 // CHECK: @"\01?_c@@YAHXZ"<br>
+// X64: @"\01?_c@@YAHXZ"<br>
<br>
 class foo {<br>
   static const short d;<br>
@@ -43,15 +44,19 @@ public:<br>
   int operator+(int a);<br>
   foo(){}<br>
 //CHECK: @"\01??0foo@@QAE@XZ"<br>
+//X64: @"\01??0foo@@QEAA@XZ"<br>
<br>
   ~foo(){}<br>
 //CHECK: @"\01??1foo@@QAE@XZ"<br>
+//X64: @"\01??1foo@@QEAA@XZ<br>
<br>
   foo(int i){}<br>
 //CHECK: @"\01??0foo@@QAE@H@Z"<br>
+//X64: @"\01??0foo@@QEAA@H@Z"<br>
<br>
   foo(char *q){}<br>
 //CHECK: @"\01??0foo@@QAE@PAD@Z"<br>
+//X64: @"\01??0foo@@QEAA@PEAD@Z"<br>
<br>
   static foo* static_method() { return 0; }<br>
<br>
@@ -77,12 +82,15 @@ enum quux {<br>
<br>
 foo bar() { return foo(); }<br>
 //CHECK: @"\01?bar@@YA?AVfoo@@XZ"<br>
+//X64: @"\01?bar@@YA?AVfoo@@XZ"<br>
<br>
 int foo::operator+(int a) {<br>
 //CHECK: @"\01??Hfoo@@QAEHH@Z"<br>
+//X64: @"\01??Hfoo@@QEAAHH@Z"<br>
<br>
   foo::static_method();<br>
 //CHECK: @"\01?static_method@foo@@SAPAV1@XZ"<br>
+//X64: @"\01?static_method@foo@@SAPEAV1@XZ"<br>
   bar();<br>
   return a;<br>
 }<br>
@@ -109,6 +117,7 @@ int (foo2::*l)(int);<br>
 static void __stdcall alpha(float a, double b) throw() {}<br>
 bool __fastcall beta(long long a, wchar_t b) throw(signed char, unsigned char) {<br>
 // CHECK: @"\01?beta@@YI_N_J_W@Z"<br>
+// X64: @"\01?beta@@YA_N_J_W@Z"<br>
   alpha(0.f, 0.0);<br>
   return false;<br>
 }<br>
@@ -119,17 +128,21 @@ bool __fastcall beta(long long a, wchar_<br>
 // Make sure tag-type mangling works.<br>
 void gamma(class foo, struct bar, union baz, enum quux) {}<br>
 // CHECK: @"\01?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z"<br>
+// X64: @"\01?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z"<br>
<br>
 // Make sure pointer/reference-type mangling works.<br>
 void delta(int * const a, const long &) {}<br>
 // CHECK: @"\01?delta@@YAXQAHABJ@Z"<br>
+// X64: @"\01?delta@@YAXQEAHAEBJ@Z"<br>
<br>
 // Array mangling.<br>
 void epsilon(int a[][10][20]) {}<br>
 // CHECK: @"\01?epsilon@@YAXQAY19BE@H@Z"<br>
+// X64: @"\01?epsilon@@YAXQEAY19BE@H@Z"<br>
<br>
 void zeta(int (*)(int, int)) {}<br>
 // CHECK: @"\01?zeta@@YAXP6AHHH@Z@Z"<br>
+// X64: @"\01?zeta@@YAXP6AHHH@Z@Z"<br>
<br>
 // Blocks mangling (Clang extension). A block should be mangled slightly<br>
 // differently from a similar function pointer.<br>
@@ -158,6 +171,7 @@ void operator_new_delete() {<br>
 void (redundant_parens)();<br>
 void redundant_parens_use() { redundant_parens(); }<br>
 // CHECK: @"\01?redundant_parens@@YAXXZ"<br>
+// X64: @"\01?redundant_parens@@YAXXZ"<br>
<br>
 // PR13047<br>
 typedef double RGB[3];<br>
@@ -169,10 +183,12 @@ extern RGB const ((color4)[5]) = {};<br>
 // PR12603<br>
 enum E {};<br>
 // CHECK: "\01?fooE@@YA?AW4E@@XZ"<br>
+// X64: "\01?fooE@@YA?AW4E@@XZ"<br>
 E fooE() { return E(); }<br>
<br>
 class X {};<br>
 // CHECK: "\01?fooX@@YA?AVX@@XZ"<br>
+// X64: "\01?fooX@@YA?AVX@@XZ"<br>
 X fooX() { return X(); }<br>
<br>
 namespace PR13182 {<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div></div></div><br></div></div>
<br>_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
<br></blockquote></div><br></div>