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 | 98e00bb162e7aa3052c200b87180509687ad7b2f (patch) | |
tree | 82300f13eaf7bbac1fe0faf0db4691b284ad3b8b /clang/lib/CodeGen/Mangle.cpp | |
parent | 5bb5ec5b07d4bd1f8fcc0d76122cc2c78b0bf082 (diff) | |
download | bcm5719-llvm-98e00bb162e7aa3052c200b87180509687ad7b2f.tar.gz bcm5719-llvm-98e00bb162e7aa3052c200b87180509687ad7b2f.zip |
Add new functions to the mangler for the <unscoped-name> and <unscoped-template-name> productions.
llvm-svn: 82113
Diffstat (limited to 'clang/lib/CodeGen/Mangle.cpp')
-rw-r--r-- | clang/lib/CodeGen/Mangle.cpp | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/clang/lib/CodeGen/Mangle.cpp b/clang/lib/CodeGen/Mangle.cpp index 3d7fc83322d..21398677dc6 100644 --- a/clang/lib/CodeGen/Mangle.cpp +++ b/clang/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> _ |