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