r211813 - Avoid extra back reference key lookup in msmangler

Reid Kleckner reid at kleckner.net
Thu Jun 26 15:42:19 PDT 2014


Author: rnk
Date: Thu Jun 26 17:42:18 2014
New Revision: 211813

URL: http://llvm.org/viewvc/llvm-project?rev=211813&view=rev
Log:
Avoid extra back reference key lookup in msmangler

Avoid a second key lookup when the back reference key is going to be
inserted in the StringMap. The string lookups in the msmangler are the
main responsible for the huge overhead when compared to the itanium
mangler. This patch makes a small but noticeable improvement.

Reviewed by: rnk

Differential Revision: http://reviews.llvm.org/D4130

Patch by Agustín Bergé!

Modified:
    cfe/trunk/lib/AST/MicrosoftMangle.cpp

Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=211813&r1=211812&r2=211813&view=diff
==============================================================================
--- cfe/trunk/lib/AST/MicrosoftMangle.cpp (original)
+++ cfe/trunk/lib/AST/MicrosoftMangle.cpp Thu Jun 26 17:42:18 2014
@@ -650,6 +650,7 @@ void MicrosoftCXXNameMangler::mangleUnqu
     // FIXME: Test alias template mangling with MSVC 2013.
     if (!isa<ClassTemplateDecl>(TD)) {
       mangleTemplateInstantiationName(TD, *TemplateArgs);
+      Out << '@';
       return;
     }
 
@@ -668,22 +669,13 @@ void MicrosoftCXXNameMangler::mangleUnqu
     // the mangled type name as a key to check the mangling of different types
     // for aliasing.
 
-    std::string TemplateMangling;
-    llvm::raw_string_ostream Stream(TemplateMangling);
+    llvm::SmallString<64> TemplateMangling;
+    llvm::raw_svector_ostream Stream(TemplateMangling);
     MicrosoftCXXNameMangler Extra(Context, Stream);
     Extra.mangleTemplateInstantiationName(TD, *TemplateArgs);
     Stream.flush();
 
-    BackRefMap::iterator Found = NameBackReferences.find(TemplateMangling);
-    if (Found == NameBackReferences.end()) {
-      Out << TemplateMangling;
-      if (NameBackReferences.size() < 10) {
-        size_t Size = NameBackReferences.size();
-        NameBackReferences[TemplateMangling] = Size;
-      }
-    } else {
-      Out << Found->second;
-    }
+    mangleSourceName(TemplateMangling);
     return;
   }
 
@@ -1002,13 +994,20 @@ void MicrosoftCXXNameMangler::mangleOper
 
 void MicrosoftCXXNameMangler::mangleSourceName(StringRef Name) {
   // <source name> ::= <identifier> @
-  BackRefMap::iterator Found = NameBackReferences.find(Name);
+  BackRefMap::iterator Found;
+  if (NameBackReferences.size() < 10) {
+    size_t Size = NameBackReferences.size();
+    bool Inserted;
+    std::tie(Found, Inserted) =
+        NameBackReferences.insert(std::make_pair(Name, Size));
+    if (Inserted)
+      Found = NameBackReferences.end();
+  } else {
+    Found = NameBackReferences.find(Name);
+  }
+
   if (Found == NameBackReferences.end()) {
     Out << Name << '@';
-    if (NameBackReferences.size() < 10) {
-      size_t Size = NameBackReferences.size();
-      NameBackReferences[Name] = Size;
-    }
   } else {
     Out << Found->second;
   }
@@ -1104,10 +1103,9 @@ void MicrosoftCXXNameMangler::mangleExpr
 
 void MicrosoftCXXNameMangler::mangleTemplateArgs(
     const TemplateDecl *TD, const TemplateArgumentList &TemplateArgs) {
-  // <template-args> ::= <template-arg>+ @
+  // <template-args> ::= <template-arg>+
   for (const TemplateArgument &TA : TemplateArgs.asArray())
     mangleTemplateArg(TD, TA);
-  Out << '@';
 }
 
 void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD,





More information about the cfe-commits mailing list