summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2014-06-26 22:42:18 +0000
committerReid Kleckner <reid@kleckner.net>2014-06-26 22:42:18 +0000
commit11c6f6165b76a42da7eaf4514e419be397d7fc44 (patch)
tree40f94f4c79fcd8a036cd479f5b7d15a7186d676f
parent34413ec640d6db966a389e5f39fb157287d84f58 (diff)
downloadbcm5719-llvm-11c6f6165b76a42da7eaf4514e419be397d7fc44.tar.gz
bcm5719-llvm-11c6f6165b76a42da7eaf4514e419be397d7fc44.zip
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é! llvm-svn: 211813
-rw-r--r--clang/lib/AST/MicrosoftMangle.cpp36
1 files changed, 17 insertions, 19 deletions
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp
index c2c8da95c61..141c2f6ef74 100644
--- a/clang/lib/AST/MicrosoftMangle.cpp
+++ b/clang/lib/AST/MicrosoftMangle.cpp
@@ -650,6 +650,7 @@ void MicrosoftCXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,
// FIXME: Test alias template mangling with MSVC 2013.
if (!isa<ClassTemplateDecl>(TD)) {
mangleTemplateInstantiationName(TD, *TemplateArgs);
+ Out << '@';
return;
}
@@ -668,22 +669,13 @@ void MicrosoftCXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,
// 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::mangleOperatorName(OverloadedOperatorKind OO,
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::mangleExpression(const Expr *E) {
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,
OpenPOWER on IntegriCloud