diff options
author | Charles Davis <cdavis@mines.edu> | 2010-07-03 08:01:32 +0000 |
---|---|---|
committer | Charles Davis <cdavis@mines.edu> | 2010-07-03 08:01:32 +0000 |
commit | cd712cb5711b597bf3a2a67a4027e2238c8b9828 (patch) | |
tree | 04548b5eca9beeb35af0cfab5289e2262c9f6b3f /lib/CodeGen | |
parent | a038c1dcface5a404d540a0d0688962cbe656af9 (diff) |
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
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/MicrosoftCXXABI.cpp | 18 |
1 files changed, 15 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()); } +// <type> ::= <pointer-to-member-type> +// <pointer-to-member-type> ::= <pointer-cvr-qualifiers> <cvr-qualifiers> +// <class name> <type> 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<FunctionProtoType>(PointeeType)) { + Out << '8'; + mangleName(cast<RecordType>(T->getClass())->getDecl()); + mangleType(FPT, NULL, false, true); + } else { + mangleQualifiers(PointeeType.getQualifiers(), true); + mangleName(cast<RecordType>(T->getClass())->getDecl()); + mangleType(PointeeType.getLocalUnqualifiedType()); + } } void MicrosoftCXXNameMangler::mangleType(const TemplateTypeParmType *T) { |