diff options
author | Anders Carlsson <andersca@mac.com> | 2009-09-18 02:42:01 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-09-18 02:42:01 +0000 |
commit | 7624f219388f2434a4988ba2508a6ca7b57ba1c3 (patch) | |
tree | 6d33ffbe67e7a21d9aa3b781618c7aed4d71c7d5 /lib/CodeGen/Mangle.cpp | |
parent | 1c1afc4ed3ec30fc99e172220c8bb74a13b117b0 (diff) |
Handle mangling of TemplateSpecializationType.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82189 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/Mangle.cpp')
-rw-r--r-- | lib/CodeGen/Mangle.cpp | 65 |
1 files changed, 58 insertions, 7 deletions
diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index aaa771b21d..d0edb02a69 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -69,12 +69,18 @@ namespace { void mangleFunctionEncoding(const FunctionDecl *FD); void mangleName(const NamedDecl *ND); + void mangleName(const TemplateDecl *TD, + const TemplateArgument *TemplateArgs, + unsigned NumTemplateArgs); void mangleUnqualifiedName(const NamedDecl *ND); void mangleUnscopedName(const NamedDecl *ND); - void mangleUnscopedTemplateName(const FunctionDecl *ND); + void mangleUnscopedTemplateName(const NamedDecl *ND); void mangleSourceName(const IdentifierInfo *II); void mangleLocalName(const NamedDecl *ND); void mangleNestedName(const NamedDecl *ND); + void mangleNestedName(const TemplateDecl *TD, + const TemplateArgument *TemplateArgs, + unsigned NumTemplateArgs); void manglePrefix(const DeclContext *DC); void mangleOperatorName(OverloadedOperatorKind OO, unsigned Arity); void mangleCVQualifiers(unsigned Quals); @@ -93,6 +99,8 @@ namespace { void mangleCXXCtorType(CXXCtorType T); void mangleCXXDtorType(CXXDtorType T); + void mangleTemplateArgs(const TemplateArgument *TemplateArgs, + unsigned NumTemplateArgs); void mangleTemplateArgumentList(const TemplateArgumentList &L); void mangleTemplateArgument(const TemplateArgument &A); }; @@ -268,6 +276,24 @@ void CXXNameMangler::mangleName(const NamedDecl *ND) { mangleNestedName(ND); } +void CXXNameMangler::mangleName(const TemplateDecl *TD, + const TemplateArgument *TemplateArgs, + unsigned NumTemplateArgs) { + const DeclContext *DC = TD->getDeclContext(); + while (isa<LinkageSpecDecl>(DC)) { + assert(cast<LinkageSpecDecl>(DC)->getLanguage() == + LinkageSpecDecl::lang_cxx && "Unexpected linkage decl!"); + DC = DC->getParent(); + } + + if (DC->isTranslationUnit() || isStdNamespace(DC)) { + mangleUnscopedTemplateName(cast<NamedDecl>(TD->getTemplatedDecl())); + mangleTemplateArgs(TemplateArgs, NumTemplateArgs); + } else { + mangleNestedName(TD, TemplateArgs, NumTemplateArgs); + } +} + void CXXNameMangler::mangleUnscopedName(const NamedDecl *ND) { // <unscoped-name> ::= <unqualified-name> // ::= St <unqualified-name> # ::std:: @@ -277,14 +303,14 @@ void CXXNameMangler::mangleUnscopedName(const NamedDecl *ND) { mangleUnqualifiedName(ND); } -void CXXNameMangler::mangleUnscopedTemplateName(const FunctionDecl *FD) { +void CXXNameMangler::mangleUnscopedTemplateName(const NamedDecl *ND) { // <unscoped-template-name> ::= <unscoped-name> // ::= <substitution> - if (mangleSubstitution(FD)) + if (mangleSubstitution(ND)) return; - mangleUnscopedName(FD); - addSubstitution(FD); + mangleUnscopedName(ND); + addSubstitution(ND); } void CXXNameMangler::mangleCalloffset(int64_t nv, int64_t v) { @@ -419,6 +445,17 @@ void CXXNameMangler::mangleNestedName(const NamedDecl *ND) { Out << 'E'; } +void CXXNameMangler::mangleNestedName(const TemplateDecl *TD, + const TemplateArgument *TemplateArgs, + unsigned NumTemplateArgs) { + Out << 'N'; + manglePrefix(TD->getDeclContext()); + mangleUnqualifiedName(TD->getTemplatedDecl()); + + mangleTemplateArgs(TemplateArgs, NumTemplateArgs); + Out << 'E'; +} + void CXXNameMangler::mangleLocalName(const NamedDecl *ND) { // <local-name> := Z <function encoding> E <entity name> [<discriminator>] // := Z <function encoding> E s [<discriminator>] @@ -827,8 +864,10 @@ void CXXNameMangler::mangleType(const FixedWidthIntType *T) { } void CXXNameMangler::mangleType(const TemplateSpecializationType *T) { - // TSTs are never canonical unless they're dependent. - assert(false && "can't mangle dependent template specializations yet"); + TemplateDecl *TD = T->getTemplateName().getAsTemplateDecl(); + assert(TD && "FIXME: Support dependent template names!"); + + mangleName(TD, T->getArgs(), T->getNumArgs()); } void CXXNameMangler::mangleType(const TypenameType *T) { @@ -896,6 +935,18 @@ void CXXNameMangler::mangleTemplateArgumentList(const TemplateArgumentList &L) { Out << "E"; } +void CXXNameMangler::mangleTemplateArgs(const TemplateArgument *TemplateArgs, + unsigned NumTemplateArgs) { + // <template-args> ::= I <template-arg>+ E + Out << "I"; + + for (unsigned i = 0; i != NumTemplateArgs; ++i) { + mangleTemplateArgument(TemplateArgs[i]); + } + + Out << "E"; +} + void CXXNameMangler::mangleTemplateArgument(const TemplateArgument &A) { // <template-arg> ::= <type> # type or template // ::= X <expression> E # expression |