diff options
author | David Majnemer <david.majnemer@gmail.com> | 2013-08-05 22:43:06 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2013-08-05 22:43:06 +0000 |
commit | 89594f373349c5749ec8cf89d93b363660bb1266 (patch) | |
tree | 0708dc8d097c1d1600d254339fd2df2ce12fd8fe /clang/lib/AST/MicrosoftMangle.cpp | |
parent | 0062f2edc096a69d312ab1ed6977f897bfedd5f5 (diff) | |
download | bcm5719-llvm-89594f373349c5749ec8cf89d93b363660bb1266.tar.gz bcm5719-llvm-89594f373349c5749ec8cf89d93b363660bb1266.zip |
[ms-cxxabi] Properly mangle member pointers
There were three things missing from the original implementation:
- We would omit the 'E' qualifier for members int 64-bit mode.
- We would not exmaine the qualifiers in 'IsMember' mode.
- We didn't generate the correct backref to the base class.
llvm-svn: 187753
Diffstat (limited to 'clang/lib/AST/MicrosoftMangle.cpp')
-rw-r--r-- | clang/lib/AST/MicrosoftMangle.cpp | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index fb3f87ad132..8d7b76db5e9 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -329,7 +329,11 @@ void MicrosoftCXXNameMangler::mangleVariableEncoding(const VarDecl *VD) { mangleQualifiers(Ty.getQualifiers(), false); } else { mangleType(Ty, TL.getSourceRange(), QMM_Drop); - mangleQualifiers(Ty.getLocalQualifiers(), false); + mangleQualifiers(Ty.getLocalQualifiers(), Ty->isMemberPointerType()); + // Member pointers are suffixed with a back reference to the member + // pointer's class name. + if (const MemberPointerType *MPT = Ty->getAs<MemberPointerType>()) + mangleName(MPT->getClass()->getAsCXXRecordDecl()); } } @@ -978,6 +982,7 @@ void MicrosoftCXXNameMangler::mangleQualifiers(Qualifiers Quals, // ::= 5 # not really based bool HasConst = Quals.hasConst(), HasVolatile = Quals.hasVolatile(); + if (!IsMember) { if (HasConst && HasVolatile) { Out << 'D'; @@ -989,6 +994,9 @@ void MicrosoftCXXNameMangler::mangleQualifiers(Qualifiers Quals, Out << 'A'; } } else { + if (PointersAre64Bit) + Out << 'E'; + if (HasConst && HasVolatile) { Out << 'T'; } else if (HasVolatile) { |