From cd712cb5711b597bf3a2a67a4027e2238c8b9828 Mon Sep 17 00:00:00 2001 From: Charles Davis Date: Sat, 3 Jul 2010 08:01:32 +0000 Subject: [PATCH] Mangle member pointer types in the Microsoft C++ Mangler. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107567 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/MicrosoftCXXABI.cpp | 18 +++++++++++++++--- test/CodeGenCXX/mangle-ms.cpp | 6 ++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/CodeGen/MicrosoftCXXABI.cpp b/lib/CodeGen/MicrosoftCXXABI.cpp index 960b1fe77a..1f3d788df1 100644 --- a/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/lib/CodeGen/MicrosoftCXXABI.cpp @@ -645,7 +645,7 @@ void MicrosoftCXXNameMangler::mangleType(QualType T) { // ::= Q # const pointer // ::= R # volatile pointer // ::= S # const volatile pointer - if (T->isPointerType()) { + if (T->isAnyPointerType() || T->isMemberPointerType()) { if (!Quals.hasVolatile()) { Out << 'Q'; } else { @@ -661,7 +661,7 @@ void MicrosoftCXXNameMangler::mangleType(QualType T) { // in there. mangleQualifiers(Quals, false); } - else if (T->isPointerType()) { + else if (T->isAnyPointerType() || T->isMemberPointerType()) { Out << 'P'; } switch (T->getTypeClass()) { @@ -1000,8 +1000,20 @@ void MicrosoftCXXNameMangler::mangleExtraDimensions(QualType ElementTy) { mangleType(ElementTy.getLocalUnqualifiedType()); } +// ::= +// ::= +// void MicrosoftCXXNameMangler::mangleType(const MemberPointerType *T) { - assert(false && "Don't know how to mangle MemberPointerTypes yet!"); + QualType PointeeType = T->getPointeeType(); + if (const FunctionProtoType *FPT = dyn_cast(PointeeType)) { + Out << '8'; + mangleName(cast(T->getClass())->getDecl()); + mangleType(FPT, NULL, false, true); + } else { + mangleQualifiers(PointeeType.getQualifiers(), true); + mangleName(cast(T->getClass())->getDecl()); + mangleType(PointeeType.getLocalUnqualifiedType()); + } } void MicrosoftCXXNameMangler::mangleType(const TemplateTypeParmType *T) { diff --git a/test/CodeGenCXX/mangle-ms.cpp b/test/CodeGenCXX/mangle-ms.cpp index e2214100f1..6f1ac3e750 100644 --- a/test/CodeGenCXX/mangle-ms.cpp +++ b/test/CodeGenCXX/mangle-ms.cpp @@ -10,6 +10,8 @@ // CHECK: @"\01?h@@3QAHA" // CHECK: @"\01?i@@3PAY0BD@HA" // CHECK: @"\01?j@@3P6GHCE@ZA" +// CHECK: @"\01?k@@3PTfoo@@DA" +// CHECK: @"\01?l@@3P8foo@@AAHH@ZA" int a; @@ -61,6 +63,10 @@ int i[10][20]; int (__stdcall *j)(signed char, unsigned char); +const volatile char foo::*k; + +int (foo::*l)(int); + // Static functions are mangled, too. // Also make sure calling conventions, arglists, and throw specs work. static void __stdcall alpha(float a, double b) throw() {} -- 2.40.0