diff options
author | Anders Carlsson <andersca@mac.com> | 2009-09-17 03:17:01 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-09-17 03:17:01 +0000 |
commit | 201ce7485c3401adad861fd0979f1bfefc064ff7 (patch) | |
tree | 89c12683dabfde3311e43dbf33f49afab0b5c4a9 /lib/CodeGen/Mangle.cpp | |
parent | e24d38f6924c5a212b05bcebd87f29f17e2343f5 (diff) |
Add new functions to the mangler for the <unscoped-name> and <unscoped-template-name> productions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82113 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/Mangle.cpp')
-rw-r--r-- | lib/CodeGen/Mangle.cpp | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index 3d7fc83322..21398677dc 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -63,6 +63,8 @@ namespace { void mangleFunctionEncoding(const FunctionDecl *FD); void mangleName(const NamedDecl *ND); void mangleUnqualifiedName(const NamedDecl *ND); + void mangleUnscopedName(const NamedDecl *ND); + void mangleUnscopedTemplateName(const FunctionDecl *ND); void mangleSourceName(const IdentifierInfo *II); void mangleLocalName(const NamedDecl *ND); void mangleNestedName(const NamedDecl *ND); @@ -233,21 +235,36 @@ void CXXNameMangler::mangleName(const NamedDecl *ND) { // <name> ::= <nested-name> // ::= <unscoped-name> // ::= <unscoped-template-name> <template-args> - // ::= <local-name> # See Scope Encoding below + // ::= <local-name> // - // <unscoped-name> ::= <unqualified-name> - // ::= St <unqualified-name> # ::std:: - if (ND->getDeclContext()->isTranslationUnit()) - mangleUnqualifiedName(ND); - else if (isStdNamespace(ND->getDeclContext())) { - Out << "St"; - mangleUnqualifiedName(ND); + if (ND->getDeclContext()->isTranslationUnit() || + isStdNamespace(ND->getDeclContext())) { + const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND); + if (FD && FD->getPrimaryTemplate()) + mangleUnscopedTemplateName(FD); + else + mangleUnscopedName(ND); } else if (isa<FunctionDecl>(ND->getDeclContext())) mangleLocalName(ND); else mangleNestedName(ND); } +void CXXNameMangler::mangleUnscopedName(const NamedDecl *ND) { + // <unscoped-name> ::= <unqualified-name> + // ::= St <unqualified-name> # ::std:: + if (isStdNamespace(ND->getDeclContext())) + Out << "St"; + + mangleUnqualifiedName(ND); +} + +void CXXNameMangler::mangleUnscopedTemplateName(const FunctionDecl *FD) { + // <unscoped-template-name> ::= <unscoped-name> + // ::= <substitution> + mangleUnscopedName(FD); +} + void CXXNameMangler::mangleCalloffset(int64_t nv, int64_t v) { // <call-offset> ::= h <nv-offset> _ // ::= v <v-offset> _ |