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 | d49950a3177865fbae29ad01272269701d4e519a (patch) | |
| tree | 3121ccfdc5ba78c85a3e2aad5c8b9b681bca0d59 | |
| parent | dae2a1607edc14e87b6715a5893bc541eede6108 (diff) | |
| download | bcm5719-llvm-d49950a3177865fbae29ad01272269701d4e519a.tar.gz bcm5719-llvm-d49950a3177865fbae29ad01272269701d4e519a.zip | |
Mangle member pointer types in the Microsoft C++ Mangler.
llvm-svn: 107567
| -rw-r--r-- | clang/lib/CodeGen/MicrosoftCXXABI.cpp | 18 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/mangle-ms.cpp | 6 |
2 files changed, 21 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index 960b1fe77a0..1f3d788df1a 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/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) { diff --git a/clang/test/CodeGenCXX/mangle-ms.cpp b/clang/test/CodeGenCXX/mangle-ms.cpp index e2214100f17..6f1ac3e7507 100644 --- a/clang/test/CodeGenCXX/mangle-ms.cpp +++ b/clang/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() {} |

