Hi majnemer, timurrrr, chandlerc,

This patch replaces the back reference `StringMap` from the MS mangler with a 
`SmallVector` of `string`s. My previous patches reduced the number of hashes 
involved in back reference lookups, this one removes them completely. The back 
reference map contains at most 10 entries, which are likely to be of varying 
sizes and different initial subsequences, and which can easily became huge (due 
to templates and namespaces).

The solution presented is the simplest possible one. Nevertheless, it's enough 
to reduce compilation times for a particular test case from 11.1s to 9s, versus 
8.58s for the Itanium ABI. Possible further improvements include using a sorted 
vector (carefully to not introduce an extra comparison), storing the string 
contents in a common arena, and/or keep the string storage in the context for 
reuse.

http://reviews.llvm.org/D5430

Files:
  lib/AST/MicrosoftMangle.cpp
Index: lib/AST/MicrosoftMangle.cpp
===================================================================
--- lib/AST/MicrosoftMangle.cpp
+++ lib/AST/MicrosoftMangle.cpp
@@ -27,7 +27,6 @@
 #include "clang/Basic/DiagnosticOptions.h"
 #include "clang/Basic/TargetInfo.h"
 #include "llvm/ADT/StringExtras.h"
-#include "llvm/ADT/StringMap.h"
 #include "llvm/Support/MathExtras.h"
 
 using namespace clang;
@@ -191,7 +190,7 @@
   const NamedDecl *Structor;
   unsigned StructorType;
 
-  typedef llvm::StringMap<unsigned> BackRefMap;
+  typedef llvm::SmallVector<std::string, 10> BackRefMap;
   BackRefMap NameBackReferences;
 
   typedef llvm::DenseMap<void *, unsigned> ArgBackRefMap;
@@ -994,22 +993,15 @@
 
 void MicrosoftCXXNameMangler::mangleSourceName(StringRef Name) {
   // <source name> ::= <identifier> @
-  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);
-  }
-
+  BackRefMap::iterator Found =
+      std::find(NameBackReferences.begin(), NameBackReferences.end(), Name);
   if (Found == NameBackReferences.end()) {
+    if (NameBackReferences.size() < 10) {
+      NameBackReferences.push_back(Name);
+    }
     Out << Name << '@';
   } else {
-    Out << Found->second;
+    Out << (Found - NameBackReferences.begin());
   }
 }
 
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to