r181825 - [ms-cxxabi] Mangle in an implicit 'E' for certain types on win64

Reid Kleckner rnk at google.com
Thu May 16 09:05:46 PDT 2013


Thanks for the fix!


On Tue, May 14, 2013 at 5:32 PM, David Blaikie <dblaikie at gmail.com> wrote:

>
>
>
> On Tue, May 14, 2013 at 1:30 PM, Reid Kleckner <reid at kleckner.net> wrote:
>
>> Author: rnk
>> Date: Tue May 14 15:30:42 2013
>> New Revision: 181825
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=181825&view=rev
>> Log:
>> [ms-cxxabi] Mangle in an implicit 'E' for certain types on win64
>>
>> Most of the complexity of this patch is figuring out which types get the
>> qualifier and which don't.  If we implement __ptr32/64, then we should
>> check the qualifier instead of assuming all pointers are 64-bit.
>>
>> This fixes PR13792.
>>
>> Patch by Warren Hunt!
>>
>> Modified:
>>     cfe/trunk/lib/AST/MicrosoftMangle.cpp
>>     cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
>>     cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp
>>     cfe/trunk/test/CodeGenCXX/mangle-ms-templates.cpp
>>     cfe/trunk/test/CodeGenCXX/mangle-ms.cpp
>>
>> Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=181825&r1=181824&r2=181825&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/AST/MicrosoftMangle.cpp (original)
>> +++ cfe/trunk/lib/AST/MicrosoftMangle.cpp Tue May 14 15:30:42 2013
>> @@ -22,6 +22,7 @@
>>  #include "clang/AST/ExprCXX.h"
>>  #include "clang/Basic/ABI.h"
>>  #include "clang/Basic/DiagnosticOptions.h"
>> +#include "clang/Basic/TargetInfo.h"
>>  #include <map>
>>
>>  using namespace clang;
>> @@ -58,18 +59,26 @@ class MicrosoftCXXNameMangler {
>>
>>    ASTContext &getASTContext() const { return Context.getASTContext(); }
>>
>> +  // FIXME: If we add support for __ptr32/64 qualifiers, then we should
>> push
>> +  // this check into mangleQualifiers().
>> +  const bool PointersAre64Bit;
>> +
>>  public:
>>    enum QualifierMangleMode { QMM_Drop, QMM_Mangle, QMM_Escape,
>> QMM_Result };
>>
>>    MicrosoftCXXNameMangler(MangleContext &C, raw_ostream &Out_)
>>      : Context(C), Out(Out_),
>>        Structor(0), StructorType(-1),
>> +
>>  PointersAre64Bit(C.getASTContext().getTargetInfo().getPointerWidth(0) ==
>> +                       64),
>>
>
> Fixed a -Wreorder warning here & below in r181834
>
>
>>        UseNameBackReferences(true) { }
>>
>>    MicrosoftCXXNameMangler(MangleContext &C, raw_ostream &Out_,
>>                            const CXXDestructorDecl *D, CXXDtorType Type)
>>      : Context(C), Out(Out_),
>>        Structor(getStructor(D)), StructorType(Type),
>> +
>>  PointersAre64Bit(C.getASTContext().getTargetInfo().getPointerWidth(0) ==
>> +                       64),
>>        UseNameBackReferences(true) { }
>>
>>    raw_ostream &getStream() const { return Out; }
>> @@ -1228,32 +1237,36 @@ void MicrosoftCXXNameMangler::mangleFunc
>>  }
>>
>>  void MicrosoftCXXNameMangler::mangleFunctionClass(const FunctionDecl
>> *FD) {
>> -  // <function-class> ::= A # private: near
>> -  //                  ::= B # private: far
>> -  //                  ::= C # private: static near
>> -  //                  ::= D # private: static far
>> -  //                  ::= E # private: virtual near
>> -  //                  ::= F # private: virtual far
>> -  //                  ::= G # private: thunk near
>> -  //                  ::= H # private: thunk far
>> -  //                  ::= I # protected: near
>> -  //                  ::= J # protected: far
>> -  //                  ::= K # protected: static near
>> -  //                  ::= L # protected: static far
>> -  //                  ::= M # protected: virtual near
>> -  //                  ::= N # protected: virtual far
>> -  //                  ::= O # protected: thunk near
>> -  //                  ::= P # protected: thunk far
>> -  //                  ::= Q # public: near
>> -  //                  ::= R # public: far
>> -  //                  ::= S # public: static near
>> -  //                  ::= T # public: static far
>> -  //                  ::= U # public: virtual near
>> -  //                  ::= V # public: virtual far
>> -  //                  ::= W # public: thunk near
>> -  //                  ::= X # public: thunk far
>> -  //                  ::= Y # global near
>> -  //                  ::= Z # global far
>> +  // <function-class>  ::= <member-function> E? # E designates a 64-bit
>> 'this'
>> +  //                                            # pointer. in 64-bit
>> mode *all*
>> +  //                                            # 'this' pointers are
>> 64-bit.
>> +  //                   ::= <global-function>
>> +  // <member-function> ::= A # private: near
>> +  //                   ::= B # private: far
>> +  //                   ::= C # private: static near
>> +  //                   ::= D # private: static far
>> +  //                   ::= E # private: virtual near
>> +  //                   ::= F # private: virtual far
>> +  //                   ::= G # private: thunk near
>> +  //                   ::= H # private: thunk far
>> +  //                   ::= I # protected: near
>> +  //                   ::= J # protected: far
>> +  //                   ::= K # protected: static near
>> +  //                   ::= L # protected: static far
>> +  //                   ::= M # protected: virtual near
>> +  //                   ::= N # protected: virtual far
>> +  //                   ::= O # protected: thunk near
>> +  //                   ::= P # protected: thunk far
>> +  //                   ::= Q # public: near
>> +  //                   ::= R # public: far
>> +  //                   ::= S # public: static near
>> +  //                   ::= T # public: static far
>> +  //                   ::= U # public: virtual near
>> +  //                   ::= V # public: virtual far
>> +  //                   ::= W # public: thunk near
>> +  //                   ::= X # public: thunk far
>> +  // <global-function> ::= Y # global near
>> +  //                   ::= Z # global far
>>    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
>>      switch (MD->getAccess()) {
>>        default:
>> @@ -1281,6 +1294,8 @@ void MicrosoftCXXNameMangler::mangleFunc
>>          else
>>            Out << 'Q';
>>      }
>> +    if (PointersAre64Bit && !MD->isStatic())
>> +      Out << 'E';
>>    } else
>>      Out << 'Y';
>>  }
>> @@ -1380,9 +1395,9 @@ void MicrosoftCXXNameMangler::mangleType
>>  // <type>       ::= <array-type>
>>  // <array-type> ::= <pointer-cvr-qualifiers> <cvr-qualifiers>
>>  //                  [Y <dimension-count> <dimension>+]
>> -//                  <element-type> # as global
>> -//              ::= Q <cvr-qualifiers> [Y <dimension-count> <dimension>+]
>> -//                  <element-type> # as param
>> +//                  <element-type> # as global, E is never required
>> +//              ::= Q E? <cvr-qualifiers> [Y <dimension-count>
>> <dimension>+]
>> +//                  <element-type> # as param, E is required for 64-bit
>>  // It's supposed to be the other way around, but for some strange
>> reason, it
>>  // isn't. Today this behavior is retained for the sole purpose of
>> backwards
>>  // compatibility.
>> @@ -1394,6 +1409,8 @@ void MicrosoftCXXNameMangler::mangleDeca
>>      manglePointerQualifiers(T->getElementType().getQualifiers());
>>    } else {
>>      Out << 'Q';
>> +    if (PointersAre64Bit)
>> +      Out << 'E';
>>    }
>>    mangleType(T->getElementType(), SourceRange());
>>  }
>> @@ -1494,10 +1511,13 @@ void MicrosoftCXXNameMangler::mangleType
>>  }
>>
>>  // <type> ::= <pointer-type>
>> -// <pointer-type> ::= <pointer-cvr-qualifiers> <cvr-qualifiers> <type>
>> +// <pointer-type> ::= E? <pointer-cvr-qualifiers> <cvr-qualifiers> <type>
>> +//                       # the E is required for 64-bit non static
>> pointers
>>  void MicrosoftCXXNameMangler::mangleType(const PointerType *T,
>>                                           SourceRange Range) {
>>    QualType PointeeTy = T->getPointeeType();
>> +  if (PointersAre64Bit && !T->getPointeeType()->isFunctionType())
>> +    Out << 'E';
>>    mangleType(PointeeTy, Range);
>>  }
>>  void MicrosoftCXXNameMangler::mangleType(const ObjCObjectPointerType *T,
>> @@ -1508,18 +1528,24 @@ void MicrosoftCXXNameMangler::mangleType
>>  }
>>
>>  // <type> ::= <reference-type>
>> -// <reference-type> ::= A <cvr-qualifiers> <type>
>> +// <reference-type> ::= A E? <cvr-qualifiers> <type>
>> +//                 # the E is required for 64-bit non static lvalue
>> references
>>  void MicrosoftCXXNameMangler::mangleType(const LValueReferenceType *T,
>>                                           SourceRange Range) {
>>    Out << 'A';
>> +  if (PointersAre64Bit && !T->getPointeeType()->isFunctionType())
>> +    Out << 'E';
>>    mangleType(T->getPointeeType(), Range);
>>  }
>>
>>  // <type> ::= <r-value-reference-type>
>> -// <r-value-reference-type> ::= $$Q <cvr-qualifiers> <type>
>> +// <r-value-reference-type> ::= $$Q E? <cvr-qualifiers> <type>
>> +//                 # the E is required for 64-bit non static rvalue
>> references
>>  void MicrosoftCXXNameMangler::mangleType(const RValueReferenceType *T,
>>                                           SourceRange Range) {
>>    Out << "$$Q";
>> +  if (PointersAre64Bit && !T->getPointeeType()->isFunctionType())
>> +    Out << 'E';
>>    mangleType(T->getPointeeType(), Range);
>>  }
>>
>>
>> Modified: cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayoutBuilder.cpp?rev=181825&r1=181824&r2=181825&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/AST/RecordLayoutBuilder.cpp (original)
>> +++ cfe/trunk/lib/AST/RecordLayoutBuilder.cpp Tue May 14 15:30:42 2013
>> @@ -211,7 +211,7 @@ void EmptySubobjectMap::AddSubobjectAtOf
>>    if (!RD->isEmpty())
>>      return;
>>
>> -  // If we have empty structures inside an union, we can assign both
>> +  // If we have empty structures inside a union, we can assign both
>>    // the same offset. Just avoid pushing them twice in the list.
>>    ClassVectorTy& Classes = EmptyClassOffsets[Offset];
>>    if (std::find(Classes.begin(), Classes.end(), RD) != Classes.end())
>>
>> Modified: cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp?rev=181825&r1=181824&r2=181825&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp Tue May 14
>> 15:30:42 2013
>> @@ -1,123 +1,164 @@
>>  // RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft
>> -triple=i386-pc-win32 | FileCheck %s
>> +// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft
>> -triple=x86_64-pc-win32 | FileCheck -check-prefix=X64 %s
>>
>>  void foo(const unsigned int) {}
>>  // CHECK: "\01?foo@@YAXI at Z"
>> +// X64: "\01?foo@@YAXI at Z"
>>
>>  void foo(const double) {}
>>  // CHECK: "\01?foo@@YAXN at Z"
>> +// X64: "\01?foo@@YAXN at Z"
>>
>>  void bar(const volatile double) {}
>>  // CHECK: "\01?bar@@YAXN at Z"
>> +// X64: "\01?bar@@YAXN at Z"
>>
>>  void foo_pad(char * x) {}
>>  // CHECK: "\01?foo_pad@@YAXPAD at Z"
>> +// X64: "\01?foo_pad@@YAXPEAD at Z"
>>
>>  void foo_pbd(const char * x) {}
>>  // CHECK: "\01?foo_pbd@@YAXPBD at Z"
>> +// X64: "\01?foo_pbd@@YAXPEBD at Z"
>>
>>  void foo_pcd(volatile char * x) {}
>>  // CHECK: "\01?foo_pcd@@YAXPCD at Z"
>> +// X64: "\01?foo_pcd@@YAXPECD at Z"
>>
>>  void foo_qad(char * const x) {}
>>  // CHECK: "\01?foo_qad@@YAXQAD at Z"
>> +// X64: "\01?foo_qad@@YAXQEAD at Z"
>>
>>  void foo_rad(char * volatile x) {}
>>  // CHECK: "\01?foo_rad@@YAXRAD at Z"
>> +// X64: "\01?foo_rad@@YAXREAD at Z"
>>
>>  void foo_sad(char * const volatile x) {}
>>  // CHECK: "\01?foo_sad@@YAXSAD at Z"
>> +// X64: "\01?foo_sad@@YAXSEAD at Z"
>>
>>  void foo_papad(char ** x) {}
>>  // CHECK: "\01?foo_papad@@YAXPAPAD at Z"
>> +// X64: "\01?foo_papad@@YAXPEAPEAD at Z"
>>
>>  void foo_papbd(char const ** x) {}
>>  // CHECK: "\01?foo_papbd@@YAXPAPBD at Z"
>> +// X64: "\01?foo_papbd@@YAXPEAPEBD at Z"
>>
>>  void foo_papcd(char volatile ** x) {}
>>  // CHECK: "\01?foo_papcd@@YAXPAPCD at Z"
>> +// X64: "\01?foo_papcd@@YAXPEAPECD at Z"
>>
>>  void foo_pbqad(char * const* x) {}
>>  // CHECK: "\01?foo_pbqad@@YAXPBQAD at Z"
>> +// X64: "\01?foo_pbqad@@YAXPEBQEAD at Z"
>>
>>  void foo_pcrad(char * volatile* x) {}
>>  // CHECK: "\01?foo_pcrad@@YAXPCRAD at Z"
>> +// X64: "\01?foo_pcrad@@YAXPECREAD at Z"
>>
>>  void foo_qapad(char ** const x) {}
>>  // CHECK: "\01?foo_qapad@@YAXQAPAD at Z"
>> +// X64: "\01?foo_qapad@@YAXQEAPEAD at Z"
>>
>>  void foo_rapad(char ** volatile x) {}
>>  // CHECK: "\01?foo_rapad@@YAXRAPAD at Z"
>> +// X64: "\01?foo_rapad@@YAXREAPEAD at Z"
>>
>>  void foo_pbqbd(const char * const* x) {}
>>  // CHECK: "\01?foo_pbqbd@@YAXPBQBD at Z"
>> +// X64: "\01?foo_pbqbd@@YAXPEBQEBD at Z"
>>
>>  void foo_pbqcd(volatile char * const* x) {}
>>  // CHECK: "\01?foo_pbqcd@@YAXPBQCD at Z"
>> +// X64: "\01?foo_pbqcd@@YAXPEBQECD at Z"
>>
>>  void foo_pcrbd(const char * volatile* x) {}
>>  // CHECK: "\01?foo_pcrbd@@YAXPCRBD at Z"
>> +// X64: "\01?foo_pcrbd@@YAXPECREBD at Z"
>>
>>  void foo_pcrcd(volatile char * volatile* x) {}
>>  // CHECK: "\01?foo_pcrcd@@YAXPCRCD at Z"
>> +// X64: "\01?foo_pcrcd@@YAXPECRECD at Z"
>>
>>  void foo_aad(char &x) {}
>>  // CHECK: "\01?foo_aad@@YAXAAD at Z"
>> +// X64: "\01?foo_aad@@YAXAEAD at Z"
>>
>>  void foo_abd(const char &x) {}
>>  // CHECK: "\01?foo_abd@@YAXABD at Z"
>> +// X64: "\01?foo_abd@@YAXAEBD at Z"
>>
>>  void foo_aapad(char *&x) {}
>>  // CHECK: "\01?foo_aapad@@YAXAAPAD at Z"
>> +// X64: "\01?foo_aapad@@YAXAEAPEAD at Z"
>>
>>  void foo_aapbd(const char *&x) {}
>>  // CHECK: "\01?foo_aapbd@@YAXAAPBD at Z"
>> +// X64: "\01?foo_aapbd@@YAXAEAPEBD at Z"
>>
>>  void foo_abqad(char * const &x) {}
>>  // CHECK: "\01?foo_abqad@@YAXABQAD at Z"
>> +// X64: "\01?foo_abqad@@YAXAEBQEAD at Z"
>>
>>  void foo_abqbd(const char * const &x) {}
>>  // CHECK: "\01?foo_abqbd@@YAXABQBD at Z"
>> +// X64: "\01?foo_abqbd@@YAXAEBQEBD at Z"
>>
>>  void foo_aay144h(int (&x)[5][5]) {}
>>  // CHECK: "\01?foo_aay144h@@YAXAAY144H at Z"
>> +// X64: "\01?foo_aay144h@@YAXAEAY144H at Z"
>>
>>  void foo_aay144cbh(const int (&x)[5][5]) {}
>>  // CHECK: "\01?foo_aay144cbh@@YAXAAY144$$CBH at Z"
>> +// X64: "\01?foo_aay144cbh@@YAXAEAY144$$CBH at Z"
>>
>>  void foo_qay144h(int (&&x)[5][5]) {}
>>  // CHECK: "\01?foo_qay144h@@YAX$$QAY144H at Z"
>> +// X64: "\01?foo_qay144h@@YAX$$QEAY144H at Z"
>>
>>  void foo_qay144cbh(const int (&&x)[5][5]) {}
>>  // CHECK: "\01?foo_qay144cbh@@YAX$$QAY144$$CBH at Z"
>> +// X64: "\01?foo_qay144cbh@@YAX$$QEAY144$$CBH at Z"
>>
>>  void foo_p6ahxz(int x()) {}
>>  // CHECK: "\01?foo_p6ahxz@@YAXP6AHXZ at Z"
>> +// X64: "\01?foo_p6ahxz@@YAXP6AHXZ at Z"
>>
>>  void foo_a6ahxz(int (&x)()) {}
>>  // CHECK: "\01?foo_a6ahxz@@YAXA6AHXZ at Z"
>> +// X64: "\01?foo_a6ahxz@@YAXA6AHXZ at Z"
>>
>>  void foo_q6ahxz(int (&&x)()) {}
>>  // CHECK: "\01?foo_q6ahxz@@YAX$$Q6AHXZ at Z"
>> +// X64: "\01?foo_q6ahxz@@YAX$$Q6AHXZ at Z"
>>
>>  void foo_qay04h(int x[5][5]) {}
>>  // CHECK: "\01?foo_qay04h@@YAXQAY04H at Z"
>> +// X64: "\01?foo_qay04h@@YAXQEAY04H at Z"
>>
>>  void foo_qay04cbh(const int x[5][5]) {}
>>  // CHECK: "\01?foo_qay04cbh@@YAXQAY04$$CBH at Z"
>> +// X64: "\01?foo_qay04cbh@@YAXQEAY04$$CBH at Z"
>>
>>  typedef double Vector[3];
>>
>>  void foo(Vector*) {}
>>  // CHECK: "\01?foo@@YAXPAY02N at Z"
>> +// X64: "\01?foo@@YAXPEAY02N at Z"
>>
>>  void foo(Vector) {}
>>  // CHECK: "\01?foo@@YAXQAN at Z"
>> +// X64: "\01?foo@@YAXQEAN at Z"
>>
>>  void foo_const(const Vector) {}
>>  // CHECK: "\01?foo_const@@YAXQBN at Z"
>> +// X64: "\01?foo_const@@YAXQEBN at Z"
>>
>>  void foo_volatile(volatile Vector) {}
>>  // CHECK: "\01?foo_volatile@@YAXQCN at Z"
>> +// X64: "\01?foo_volatile@@YAXQECN at Z"
>>
>>  void foo(Vector*, const Vector, const double) {}
>>  // CHECK: "\01?foo@@YAXPAY02NQBNN at Z"
>> +// X64: "\01?foo@@YAXPEAY02NQEBNN at Z"
>>
>> Modified: cfe/trunk/test/CodeGenCXX/mangle-ms-templates.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms-templates.cpp?rev=181825&r1=181824&r2=181825&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/mangle-ms-templates.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/mangle-ms-templates.cpp Tue May 14 15:30:42
>> 2013
>> @@ -1,4 +1,5 @@
>> -// RUN: %clang_cc1 -fms-extensions -emit-llvm %s -o - -cxx-abi microsoft
>> -triple=i386-pc-win32 | FileCheck %s
>> +// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft
>> -triple=i386-pc-win32 | FileCheck %s
>> +// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft
>> -triple=x86_64-pc-win32 | FileCheck -check-prefix X64 %s
>>
>>  template<typename T>
>>  class Class {
>> @@ -33,65 +34,87 @@ class BoolTemplate<true> {
>>  void template_mangling() {
>>    Class<Typename> c1;
>>  // CHECK: call {{.*}} @"\01??0?$Class at VTypename@@@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$Class at VTypename@@@@QEAA at XZ"
>>
>>    Class<const Typename> c1_const;
>>  // CHECK: call {{.*}} @"\01??0?$Class@$$CBVTypename@@@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$Class@$$CBVTypename@@@@QEAA at XZ"
>>    Class<volatile Typename> c1_volatile;
>>  // CHECK: call {{.*}} @"\01??0?$Class@$$CCVTypename@@@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$Class@$$CCVTypename@@@@QEAA at XZ"
>>    Class<const volatile Typename> c1_cv;
>>  // CHECK: call {{.*}} @"\01??0?$Class@$$CDVTypename@@@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$Class@$$CDVTypename@@@@QEAA at XZ"
>>
>>    Class<Nested<Typename> > c2;
>>  // CHECK: call {{.*}} @"\01??0?$Class at V?$Nested at VTypename@@@@@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$Class at V?$Nested at VTypename@@@@@@QEAA at XZ"
>>
>>    Class<int * const> c_intpc;
>>  // CHECK: call {{.*}} @"\01??0?$Class at QAH@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$Class at QEAH@@QEAA at XZ"
>>    Class<int()> c_ft;
>>  // CHECK: call {{.*}} @"\01??0?$Class@$$A6AHXZ@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$Class@$$A6AHXZ@@QEAA at XZ"
>>    Class<int[]> c_inti;
>>  // CHECK: call {{.*}} @"\01??0?$Class@$$BY0A at H@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$Class@$$BY0A at H@@QEAA at XZ"
>>    Class<int[5]> c_int5;
>>  // CHECK: call {{.*}} @"\01??0?$Class@$$BY04H@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$Class@$$BY04H@@QEAA at XZ"
>>    Class<const int[5]> c_intc5;
>>  // CHECK: call {{.*}} @"\01??0?$Class@$$BY04$$CBH@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$Class@$$BY04$$CBH@@QEAA at XZ"
>>    Class<int * const[5]> c_intpc5;
>>  // CHECK: call {{.*}} @"\01??0?$Class@$$BY04QAH@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$Class@$$BY04QEAH@@QEAA at XZ"
>>
>>    BoolTemplate<false> _false;
>>  // CHECK: call {{.*}} @"\01??0?$BoolTemplate@$0A@@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$BoolTemplate@$0A@@@QEAA at XZ"
>>
>>    BoolTemplate<true> _true;
>>    // PR13158
>>    _true.Foo(1);
>>  // CHECK: call {{.*}} @"\01??0?$BoolTemplate@$00@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$BoolTemplate@$00@@QEAA at XZ"
>>  // CHECK: call {{.*}} @"\01??$Foo at H@?$BoolTemplate@$00@@QAEXH at Z"
>> +// X64: call {{.*}} @"\01??$Foo at H@?$BoolTemplate@$00@@QEAAXH at Z"
>>
>>    IntTemplate<0> zero;
>>  // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0A@@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$IntTemplate@$0A@@@QEAA at XZ"
>>
>>    IntTemplate<5> five;
>>  // CHECK: call {{.*}} @"\01??0?$IntTemplate@$04@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$IntTemplate@$04@@QEAA at XZ"
>>
>>    IntTemplate<11> eleven;
>>  // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0L@@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$IntTemplate@$0L@@@QEAA at XZ"
>>
>>    IntTemplate<256> _256;
>>  // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0BAA@@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$IntTemplate@$0BAA@@@QEAA at XZ"
>>
>>    IntTemplate<513> _513;
>>  // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0CAB@@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$IntTemplate@$0CAB@@@QEAA at XZ"
>>
>>    IntTemplate<1026> _1026;
>>  // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0EAC@@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$IntTemplate@$0EAC@@@QEAA at XZ"
>>
>>    IntTemplate<65535> ffff;
>>  // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0PPPP@@@QAE at XZ"
>> +// X64: call {{.*}} @"\01??0?$IntTemplate@$0PPPP@@@QEAA at XZ"
>>  }
>>
>>  namespace space {
>>    template<class T> const T& foo(const T& l) { return l; }
>>  }
>>  // CHECK: "\01??$foo at H@space@@YAABHABH at Z"
>> +// X64: "\01??$foo at H@space@@YAAEBHAEBH at Z"
>>
>>  void use() {
>>    space::foo(42);
>> @@ -108,4 +131,5 @@ void FunctionPointerTemplate() {
>>  void spam() {
>>    FunctionPointerTemplate<spam>();
>>  // CHECK: "\01??$FunctionPointerTemplate@$1?spam@@YAXXZ@@YAXXZ"
>> +// X64: "\01??$FunctionPointerTemplate@$1?spam@@YAXXZ@@YAXXZ"
>>  }
>>
>> Modified: cfe/trunk/test/CodeGenCXX/mangle-ms.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms.cpp?rev=181825&r1=181824&r2=181825&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/mangle-ms.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/mangle-ms.cpp Tue May 14 15:30:42 2013
>> @@ -1,5 +1,5 @@
>> -// RUN: %clang_cc1 -fms-extensions -fblocks -emit-llvm %s -o - -cxx-abi
>> microsoft -triple=i386-pc-win32 | FileCheck %s
>> -// RUN: %clang_cc1 -fms-compatibility -fblocks -emit-llvm %s -o -
>> -cxx-abi microsoft -triple=x86_64-pc-win32 | FileCheck -check-prefix X64 %s
>> +// RUN: %clang_cc1 -fblocks -emit-llvm %s -o - -cxx-abi microsoft
>> -triple=i386-pc-win32 | FileCheck %s
>> +// RUN: %clang_cc1 -fblocks -emit-llvm %s -o - -cxx-abi microsoft
>> -triple=x86_64-pc-win32 | FileCheck -check-prefix X64 %s
>>
>>  // CHECK: @"\01?a@@3HA"
>>  // CHECK: @"\01?b at N@@3HA"
>> @@ -33,6 +33,7 @@ namespace N {
>>  static int c;
>>  int _c(void) {return N::anonymous + c;}
>>  // CHECK: @"\01?_c@@YAHXZ"
>> +// X64: @"\01?_c@@YAHXZ"
>>
>>  class foo {
>>    static const short d;
>> @@ -43,15 +44,19 @@ public:
>>    int operator+(int a);
>>    foo(){}
>>  //CHECK: @"\01??0foo@@QAE at XZ"
>> +//X64: @"\01??0foo@@QEAA at XZ"
>>
>>    ~foo(){}
>>  //CHECK: @"\01??1foo@@QAE at XZ"
>> +//X64: @"\01??1foo@@QEAA at XZ
>>
>>    foo(int i){}
>>  //CHECK: @"\01??0foo@@QAE at H@Z"
>> +//X64: @"\01??0foo@@QEAA at H@Z"
>>
>>    foo(char *q){}
>>  //CHECK: @"\01??0foo@@QAE at PAD@Z"
>> +//X64: @"\01??0foo@@QEAA at PEAD@Z"
>>
>>    static foo* static_method() { return 0; }
>>
>> @@ -77,12 +82,15 @@ enum quux {
>>
>>  foo bar() { return foo(); }
>>  //CHECK: @"\01?bar@@YA?AVfoo@@XZ"
>> +//X64: @"\01?bar@@YA?AVfoo@@XZ"
>>
>>  int foo::operator+(int a) {
>>  //CHECK: @"\01??Hfoo@@QAEHH at Z"
>> +//X64: @"\01??Hfoo@@QEAAHH at Z"
>>
>>    foo::static_method();
>>  //CHECK: @"\01?static_method at foo@@SAPAV1 at XZ"
>> +//X64: @"\01?static_method at foo@@SAPEAV1 at XZ"
>>    bar();
>>    return a;
>>  }
>> @@ -109,6 +117,7 @@ int (foo2::*l)(int);
>>  static void __stdcall alpha(float a, double b) throw() {}
>>  bool __fastcall beta(long long a, wchar_t b) throw(signed char, unsigned
>> char) {
>>  // CHECK: @"\01?beta@@YI_N_J_W at Z"
>> +// X64: @"\01?beta@@YA_N_J_W at Z"
>>    alpha(0.f, 0.0);
>>    return false;
>>  }
>> @@ -119,17 +128,21 @@ bool __fastcall beta(long long a, wchar_
>>  // Make sure tag-type mangling works.
>>  void gamma(class foo, struct bar, union baz, enum quux) {}
>>  // CHECK: @"\01?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z"
>> +// X64: @"\01?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z"
>>
>>  // Make sure pointer/reference-type mangling works.
>>  void delta(int * const a, const long &) {}
>>  // CHECK: @"\01?delta@@YAXQAHABJ at Z"
>> +// X64: @"\01?delta@@YAXQEAHAEBJ at Z"
>>
>>  // Array mangling.
>>  void epsilon(int a[][10][20]) {}
>>  // CHECK: @"\01?epsilon@@YAXQAY19BE at H@Z"
>> +// X64: @"\01?epsilon@@YAXQEAY19BE at H@Z"
>>
>>  void zeta(int (*)(int, int)) {}
>>  // CHECK: @"\01?zeta@@YAXP6AHHH at Z@Z"
>> +// X64: @"\01?zeta@@YAXP6AHHH at Z@Z"
>>
>>  // Blocks mangling (Clang extension). A block should be mangled slightly
>>  // differently from a similar function pointer.
>> @@ -158,6 +171,7 @@ void operator_new_delete() {
>>  void (redundant_parens)();
>>  void redundant_parens_use() { redundant_parens(); }
>>  // CHECK: @"\01?redundant_parens@@YAXXZ"
>> +// X64: @"\01?redundant_parens@@YAXXZ"
>>
>>  // PR13047
>>  typedef double RGB[3];
>> @@ -169,10 +183,12 @@ extern RGB const ((color4)[5]) = {};
>>  // PR12603
>>  enum E {};
>>  // CHECK: "\01?fooE@@YA?AW4E@@XZ"
>> +// X64: "\01?fooE@@YA?AW4E@@XZ"
>>  E fooE() { return E(); }
>>
>>  class X {};
>>  // CHECK: "\01?fooX@@YA?AVX@@XZ"
>> +// X64: "\01?fooX@@YA?AVX@@XZ"
>>  X fooX() { return X(); }
>>
>>  namespace PR13182 {
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130516/01d4a939/attachment.html>


More information about the cfe-commits mailing list