[PATCH] Avoid extra back reference key lookup in msmangler

Agustín Bergé kaballo86 at hotmail.com
Thu Jun 12 17:12:23 PDT 2014


Hi majnemer, timurrrr,

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.

I could not find a way to go from StringMap::GetOrCreateValue to StringMap::iterator, so the code is slightly more complex than I would have intended.

http://reviews.llvm.org/D4130

Files:
  lib/AST/MicrosoftMangle.cpp

Index: lib/AST/MicrosoftMangle.cpp
===================================================================
--- lib/AST/MicrosoftMangle.cpp
+++ lib/AST/MicrosoftMangle.cpp
@@ -238,6 +238,7 @@
   void mangleNestedName(const NamedDecl *ND);
 
 private:
+  void mangleBackReference(StringRef Name, StringRef Suffix = "");
   void mangleUnqualifiedName(const NamedDecl *ND) {
     mangleUnqualifiedName(ND, ND->getDeclName());
   }
@@ -607,6 +608,27 @@
   }
 }
 
+void MicrosoftCXXNameMangler::mangleBackReference(StringRef Name,
+                                                  StringRef Suffix) {
+  if (NameBackReferences.size() < 10) {
+    size_t Size = NameBackReferences.size();
+    BackRefMap::MapEntryTy &Entry =
+        NameBackReferences.GetOrCreateValue(Name, Size);
+    if (Entry.second == Size) {
+      Out << Name << Suffix;
+    } else {
+      Out << Entry.second;
+    }
+  } else {
+    BackRefMap::iterator Found = NameBackReferences.find(Name);
+    if (Found == NameBackReferences.end()) {
+      Out << Name << Suffix;
+    } else {
+      Out << Found->second;
+    }
+  }
+}
+
 static const TemplateDecl *
 isTemplate(const NamedDecl *ND, const TemplateArgumentList *&TemplateArgs) {
   // Check if we have a function template.
@@ -668,22 +690,13 @@
     // 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;
-    }
+    mangleBackReference(TemplateMangling);
     return;
   }
 
@@ -1002,16 +1015,7 @@
 
 void MicrosoftCXXNameMangler::mangleSourceName(StringRef Name) {
   // <source name> ::= <identifier> @
-  BackRefMap::iterator 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;
-  }
+  mangleBackReference(Name, "@");
 }
 
 void MicrosoftCXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D4130.10375.patch
Type: text/x-patch
Size: 2775 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140613/d200fc67/attachment.bin>


More information about the cfe-commits mailing list