diff options
author | Anders Carlsson <andersca@mac.com> | 2009-09-26 03:55:37 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-09-26 03:55:37 +0000 |
commit | d99edc44300b36732a14c294c93899ba28d479ea (patch) | |
tree | ca715d5a1f13e172d2b2a950e2fb4a09d0565364 /lib/CodeGen/Mangle.cpp | |
parent | e7c9645c002d2ff639f7d24f94ffe793795eabcc (diff) |
Mangle record types as decls.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82843 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/Mangle.cpp')
-rw-r--r-- | lib/CodeGen/Mangle.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index f03f029198..629b46bf94 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -456,7 +456,7 @@ void CXXNameMangler::mangleSourceName(const IdentifierInfo *II) { void CXXNameMangler::mangleNestedName(const NamedDecl *ND) { // <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E // ::= N [<CV-qualifiers>] <template-prefix> <template-args> E - // FIXME: no class template support + Out << 'N'; if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(ND)) mangleQualifiers(Qualifiers::fromCVRMask(Method->getTypeQualifiers())); @@ -1077,6 +1077,11 @@ bool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) { } bool CXXNameMangler::mangleSubstitution(QualType T) { + if (!T.getCVRQualifiers()) { + if (const RecordType *RT = T->getAs<RecordType>()) + return mangleSubstitution(RT->getDecl()); + } + uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr()); return mangleSubstitution(TypePtr); @@ -1117,6 +1122,13 @@ bool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) { } void CXXNameMangler::addSubstitution(QualType T) { + if (!T.getCVRQualifiers()) { + if (const RecordType *RT = T->getAs<RecordType>()) { + addSubstitution(RT->getDecl()); + return; + } + } + uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr()); addSubstitution(TypePtr); } @@ -1144,6 +1156,10 @@ namespace clang { assert(!isa<CXXDestructorDecl>(D) && "Use mangleCXXDtor for destructor decls!"); + PrettyStackTraceDecl CrashInfo(const_cast<NamedDecl *>(D), SourceLocation(), + Context.getSourceManager(), + "Mangling declaration"); + CXXNameMangler Mangler(Context, os); if (!Mangler.mangle(D)) return false; |