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) {
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) {
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to