]> granicus.if.org Git - clang/commitdiff
Add new functions to the mangler for the <unscoped-name> and <unscoped-template-name...
authorAnders Carlsson <andersca@mac.com>
Thu, 17 Sep 2009 03:17:01 +0000 (03:17 +0000)
committerAnders Carlsson <andersca@mac.com>
Thu, 17 Sep 2009 03:17:01 +0000 (03:17 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82113 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/Mangle.cpp

index 3d7fc83322dfead15bed8125ddd4121142110117..21398677dc6f0a468c99c3e7d95ca3c6bf0d60e2 100644 (file)
@@ -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> _